This support conversation demonstrates good design in action. The fictional brand is a retailer, but the design is relevant across sectors. It can help you create a smooth automated journey for any of your brand's standard support cases.
Below is an overview of the conversation, followed by a step-by-step breakdown. Each step highlights the best practices it applies and any special design considerations for a support journey. To implement this design for your own agent, copy and customize the sample payloads for each step.
Overview
Support conversations are a unique opportunity to build customer loyalty through deeper engagement with a brand. To create a rapport with users who might be feeling frustrated, the agent balances empathy with efficiency. The basic flow of this conversation is (1) perform an order lookup, (2) identify a product issue, (3) coordinate a return, (4) use the positive interaction to drive a new sales journey.
This is a standard flow that you can build on. For example, integrate with OAuth so you can verify the user's identity and access their account information securely within the conversation. For a sample flow with identity verification, see Authenticate the user.
This sample illustrates the happy path, where the user finds a satisfying resolution through automation. However, some journeys require human support. Be sure to create a handoff strategy so users can still get the help they need if automation can't serve their needs.
Conversational turns
- The user begins the conversation with the agent.
The agent sends a greeting. It uses conversation starters for journeys the brand wants to highlight.
This pithy welcome message sets the stage for a friendly and productive interaction. The agent uses a persona to make the automation feel natural. Introducing itself as a "virtual piecefinder" clarifies that "Pi" isn't a real person. To quickly convey that it's relevant, the agent summarizes what it can do. It showcases the sales journey in a playful tone ("find your next puzzle adventure") but plainly states that it can handle support queries too. Conversation starters reinforce the agent's capabilities by pointing to supported tasks.
The user taps a conversation starter to manage their order.
For this agent, "manage order" is an accurate label. Only use this phrase if the agent can do more than look up an order, but also help the user to edit, return, or exchange it.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-06-27T23:01:35.437205Z", "conversationId": "1111", "requestId": "123123333", "suggestionResponse": { "message": "conversations/1111/messages/2203", "postbackData": "manage_order", "createTime": "2022-06-27T23:01:34.911212Z", "text": "Manage order", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent asks for the user's order number.
The first line accomplishes two things:
- It implicitly confirms the user's intent.
- Its upbeat tone and emoji establish a good rapport.
When the agent requests the user's order number, it also offers guidance on where to find it. Customers often struggle to locate their order details. Proactively sending a suggestion for assistance can prevent the user from dropping off.
JSON payload
{ "text": "I’m happy to help with your order 😊. Just tell me your order number. Ready?", "fallback": "I'm happy to help with your order. Just tell me your order number. Ready? (You can ask for help to locate your order number.)", "suggestions": [ { "reply": { "text": "Find order number", "postbackData": "option_1" } } ], "messageId": "2204" }
The user types the order number.
During a support conversation, the user's patience may be slim. To make it easy for them, ask as few questions as possible to get the needed information. To make the journey easier, integrate with OAuth. This enables the user to sign into their account and access their order history without an order number.
JSON payload
{ "message": { "name": "conversations/1111/messages/2205", "text": "12341234", "createTime": "2022-06-27T23:03:22.454713Z", "messageId": "2205" }, "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-06-27T23:03:22.947287Z", "conversationId": "1111", "requestId": "123123555", "agent": "brands/3333/agents/4444" }
The agent confirms the order details and asks if help is needed.
Using message context, the agent refers to the user by name. This is especially helpful in a support journey, to make the user feel seen. The agent repeats key details to confirm that it found the right order and then asks the user if they need help. Suggested replies make it easy to report an issue. The labels set the tone for the journey ahead:
- The informal "No thanks, all good" evokes a relaxed customer who feels at ease with the brand.
- The word choice of "issue" instead of "problem" implies there's something important that can be solved without blame.
JSON payload
{ "text": "Thank you, Michael. I can see your order with the reference number 12341234 arrived on June 1st. Do you need any help with this order?", "fallback": "Thank you, Michael. I can see your order with the reference number 12341234 arrived on June 1st. Do you need any help with this order? You can simply say Yes or No.", "suggestions": [ { "reply": { "text": "No thanks, all good", "postbackData": "option_1" } }, { "reply": { "text": "Yes, there's an issue", "postbackData": "option_2" } } ], "messageId": "2206" }
The user taps a suggested reply to report an issue with their order.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-06-27T23:05:40.604784Z", "conversationId": "1111", "requestId": "123123777", "suggestionResponse": { "message": "conversations/1111/messages/2207", "postbackData": "option_2", "createTime": "2022-06-27T23:05:40.034552Z", "text": "Yes, there's an issue", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent asks the user what type of issue it is.
This message is responsive, not robotic. A simple "Oh no!" conveys empathy and confirms the agent's understanding. The agent offers immediate assistance by highlighting common issues that it's designed to address. It assures the user that human support is available. Suggested replies make it easy to define the issue. A live agent request suggestion empowers the user to chat with a human if needed.
JSON payload
{ "text": "Oh no! Let’s see if I can solve it right now. Here are some things I can help with. If you can’t find what you're looking for, I can connect you to a Puzzle Pro.", "fallback": "Oh no! Let’s see if I can solve it right now. Here are some things I can help with: missing order, product issues, return order. If you can’t find what you're looking for, just say "Chat with a Puzzle Pro." You can also say "Back to menu."", "suggestions": [ { "reply": { "text": "Missing order", "postbackData": "option_1" } }, { "reply": { "text": "Product issues", "postbackData": "option_2" } }, { "reply": { "text": "Return order", "postbackData": "option_3" } }, { "action": { "text": "Chat with Puzzle Pro", "postbackData": "Option_4", "openUrlAction": { "url": "https://www.mysite.com" } } }, { "reply": { "text": "Back to menu", "postbackData": "option_5" } } ], "messageId": "2208" }
The user taps a suggestion to return their order.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-06-27T23:07:41.041188Z", "conversationId": "1111", "requestId": "123123999", "suggestionResponse": { "message": "conversations/1111/messages/2209", "postbackData": "option_3", "createTime": "2022-06-27T23:07:40.412888Z", "text": "Return order", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent offers to schedule the return.
The agent offers a good apology: it names the user's situation, empathizes, and moves the conversation forward. A transitional phrase ("But–good news–") evokes the brand's lively tone as it pivots from apology to resolution. Based on the order lookup from step 6, the agent confirms that a free return is possible. Instead of starting the return process automatically, the agent keeps the user in control by prompting them with a question and suggested replies.
JSON payload
{ "text": "Sorry to hear the puzzle isn't what you were looking for. But–good news–you're still in the 2-week window for free returns! Do you want to schedule a return pickup?", "fallback": "Sorry to hear the puzzle isn't what you were looking for. But–good news–you're still in the 2-week window for free returns! Do you want to schedule a return pickup? You can say Yes or ask for more options.", "suggestions": [ { "reply": { "text": "Yes", "postbackData": "option_1" } }, { "reply": { "text": "What are other options?", "postbackData": "option_2" } } ], "messageId": "2210" }
The user taps a suggestion to schedule the return.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-06-27T23:08:11.865939Z", "conversationId": "1111", "requestId": "123123011", "suggestionResponse": { "message": "conversations/1111/messages2211", "postbackData": "option_1", "createTime": "2022-06-27T23:08:11.394266Z", "text": "Yes", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent asks the user to select a pickup time.
The agent uses customer-first language ("for you," "suits you best") as it defers to the user's needs and convenience. The simple addition of "let's" in line two makes it more inviting. It helps build a rapport with the user, even during the menial task of logistics. An emoji adds visual interest at an appropriate time in the conversation. During the resolution stage, this playful gesture is more likely to please than frustrate the user.
JSON payload
{ "text": "Perfect. I can arrange the return pickup for you. Let's make sure you're home to hand off your package 📦. What time suits you best?", "fallback": "Perfect. I can arrange the return pickup for you. Let's make sure you're home to hand off your package. What time suits you best? You can choose from these suggestions or ask for more times: Tue 8-10 am, Wed 1-3 pm, Thu 8-10 am.", "suggestions": [ { "reply": { "text": "Tue 8-10 am", "postbackData": "option_1" } }, { "reply": { "text": "Wed 1-3 pm", "postbackData": "option_2" } }, { "reply": { "text": "Thu 8-10 am", "postbackData": "option_3" } }, { "reply": { "text": "More times", "postbackData": "option_4" } } ], "messageId": "2212" }
The user taps a suggestion for a pickup time.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-06-27T23:08:50.878539Z", "conversationId": "1111", "requestId": "123123013", "suggestionResponse": { "message": "conversations/1111/messages2213", "postbackData": "option_2", "createTime": "2022-06-27T23:08:50.422088Z", "text": "Wed 1-3 pm", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent provides the pickup details.
The agent repeats the pickup details and asks for explicit confirmation from the user. In case the details aren't correct, suggestions allow the user to make changes or return to the main menu to restart the journey. This flexibility can prevent the user from getting stuck.
JSON payload
{ "text": "Got it ✔️. Someone will collect your package on Wednesday, June 7th from 1-3 pm at Apartment 1, Your Road, Example City 12345. Is that correct?", "fallback": "Got it! Someone will collect your package on Wednesday, June 7th from 1-3 pm at Apartment 1, Your Road, Example City 12345. Is that correct? Say "Correct" to confirm, or tell me to change the address, change the time, or go back to the menu.", "suggestions": [ { "reply": { "text": "Correct", "postbackData": "option_1" } }, { "reply": { "text": "Change address", "postbackData": "option_2" } }, { "reply": { "text": "Change time", "postbackData": "option_3" } }, { "reply": { "text": "Back to menu", "postbackData": "option_4" } } ], "messageId": "2214" }
The user confirms the pickup details.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-06-27T23:09:24.535388Z", "conversationId": "1111", "requestId": "123123015", "suggestionResponse": { "message": "conversations/1111/messages/2215", "postbackData": "option_1", "createTime": "2022-06-27T23:09:24.148091Z", "text": "Correct", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent summarizes the issue resolution.
A simple discourse marker ends the journey on a positive note. A final confirmation of the pickup details serves as a reminder, which the user can reference in the conversation history on their device. Building on the positive interaction, the agent sends product suggestions to entice the user on a new purchase journey.
JSON payload
{ "text": "Great! Expect a pickup on Wednesday from 1-3 pm, and do make sure you're home 🏠. Is there anything else I can do for you, Michael?", "fallback": "Great! Expect a pickup on Wednesday from 1-3 pm, and do make sure you're home. Is there anything else I can do for you, Michael? I can show you sales or new arrivals, or take you back to the menu to choose your own adventure!", "suggestions": [ { "reply": { "text": "Show me sales", "postbackData": "option_1" } }, { "reply": { "text": "Show me new arrivals", "postbackData": "option_2" } }, { "reply": { "text": "Back to menu", "postbackData": "option_3" } } ], "messageId": "2216" }
The user taps a suggestion to view products.
Don't underestimate the power of a positive experience. Helping the user resolve an issue can strengthen their brand affinity even more than a smooth but impersonal transaction.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-06-27T23:10:13.109037Z", "conversationId": "1111", "requestId": "123123017", "suggestionResponse": { "message": "conversations/1111/messages2217", "postbackData": "option_2", "createTime": "2022-06-27T23:10:12.763903Z", "text": "Show me new arrivals", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }