This marketing conversation demonstrates good design in action. The fictional brand is a retailer, but the design is relevant across sectors. It can help you capture high-quality leads while building a rapport with users from any of your agent's supported entry points. The conversation makes lead capture personal and interactive by collaborating with the user to customize a newsletter. In this case, the newsletter will be sent by email as part of the brand's omni-channel approach to relationship building.
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 considerations for a marketing journey. To implement this design for your own agent, copy and customize the sample payloads for each step.
Overview
This is a conversational marketing sample. It uses the unique power of conversation to capture leads while building the user's relationship with your brand. The basic flow is: (1) add a new offer to the welcome message, (2) describe the offer's value for the user, (3) ask questions that allow the user to customize the offer and also qualify them as a lead, (4) request the user's contact information, (5) be transparent about how their contact information will be used (and never spam them).
Follow the tips about tone, text, and timing to design a great user experience while staying true to your privacy policy and required disclosures.
Conversational turns
- The user begins the conversation with the agent.
The agent sends a welcome message. One of the conversation starters highlights a new offer.
This well-curated greeting gives the agent credibility. By naming the brand in the welcome message and showing its familiar logo, the agent assures the user they're chatting with Puzzle Paradise. The agent uses a persona to make the automation engaging. Introducing itself as a "virtual piecefinder" clarifies that "Pi" isn't a real person.
By summarizing what it can do, the agent quickly sets the user's expectations. Conversation starters guide the user to journeys the brand wants to highlight. Their labels start with verbs, which entice the user to act. Emojis add visual flair and make it easy to skim the options.
The user taps a conversation starter for a new offer.
Agents with conversation starters get more user engagement. This conversation starter uses playful ambiguity to pique the user's curiosity. Instead of identifying the offer by name ("Sign up for newsletter"), it highlights the offer's value to the user (the newsletter allows them to stay current).
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-12-22T00:04:47.475658Z", "conversationId": "1111", "requestId": "123123333", "suggestionResponse": { "message": "conversations/1111/messages/2203", "postbackData": "stay_up_to_date", "createTime": "2022-12-22T00:04:47.009861Z", "text": "📆 Stay up to date", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent describes the offer and asks the user if they want to sign up.
This virtual agent is an ideal customer service rep. It confirms the user's interest by warmly thanking them. Referring to the user as "puzzle pal" creates a sense of camaraderie that helps build a rapport with the brand. The agent offers a clear and concise description of the offer, leading with its benefits to the user. Emojis draw attention to each component of the newsletter. The message ends with an enticing question to draw the user onward.
JSON payload
{ "text": "Thanks for your interest, puzzle pal! Our monthly newsletter keeps you up to date with expert reviews ⭐, puzzle releases 🐣, and event info 🎉. 'Want a piece of the action?", "fallback": "Thanks for your interest, puzzle pal! Our monthly newsletter keeps you up to date with reviews, puzzle releases, and event info. 'Want a piece of the action? If so, type "Sign me up". If not, type "Return to menu".", "suggestions": [ { "reply": { "text": "Yes, sign me up", "postbackData": "option_1" } }, { "reply": { "text": "Not now, return to menu", "postbackData": "option_2" } } ], "messageId": "2204" }
The user taps a suggestion to sign up.
Suggested replies make it easy for the user to sign up.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-12-22T00:06:25.284431Z", "conversationId": "1111", "requestId": "123123555", "suggestionResponse": { "message": "conversations/1111/messages/2205", "postbackData": "option_1", "createTime": "2022-06-27T23:05:40.034552Z", "text": "Yes, sign me up", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent sets the user's expectations about customizing the offer.
A simple "Yay!" with an emoji builds momentum for the journey ahead. To set the user's expectations, the agent states how many steps the journey will take and what the purpose is: "customize the newsletter, so you only get what you want." The purpose is stated from the user's perspective, so they have a reason to engage.
What follows is not an impersonal lead form. Instead, it's a friendly back-and-forth that empowers the user. By allowing them to choose the contents of their newsletter—opting into or out of the info they want to receive—the agent (1) helps the user to personalize their relationship with the brand and (2) simultaneously qualifies them as a lead for various products.
JSON payload
{ "text": "Yea! 🥳 I've got 3 questions to customize the newsletter, so you only get what you want. Ready?", "fallback": "Yea! I've got 3 questions to customize the newsletter, so you only get what you want. Ready? Type "Yes" to get started or type "Return to menu".", "suggestions": [ { "reply": { "text": "Let's do it!", "postbackData": "option_1" } }, { "reply": { "text": "Not now, return to menu", "postbackData": "option_2" } } ], "messageId": "2206" }
The user taps a suggestion to start the process.
The suggestion text ("Let's do it!") primes the user for a fun interaction. The word "let's" draws the user into a collective "us" with the brand, which makes the Q&A that follows feel more like teamwork.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-12-22T00:07:08.545653Z", "conversationId": "1111", "requestId": "123123777", "suggestionResponse": { "message": "conversations/1111/messages/2207", "postbackData": "option_1", "createTime": "2022-12-22T00:07:07.979424Z", "text": "Let's do it!", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent asks the first question.
A simple discourse marker ("Great") acknowledges the user's response and transitions into the Q&A. To make it quick and easy, the agent only asks for the information it needs. The agent phrases the question in a conversational way that focuses on the user's interests and shows that the brand cares about what matters to them.
JSON payload
{ "text": "Great. First, are you interested in our puzzle pros' monthly recommendations? ⭐", "fallback": "Great. First, are you interested in our puzzle pros' monthly recommendations? You can type "Yes" or "No".", "suggestions": [ { "reply": { "text": "Yes", "postbackData": "option_1" } }, { "reply": { "text": "No", "postbackData": "option_2" } } ], "messageId": "2208" }
The user taps a suggestion to opt in.
Suggested replies make it easy for the user to move through the questions.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-12-22T00:07:47.271709Z", "conversationId": "1111", "requestId": "123123999", "suggestionResponse": { "message": "conversations/1111/messages/2209", "postbackData": "option_3", "createTime": "2022-12-22T00:07:47.271709Z", "text": "Yes", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent asks the second question.
The first line validates the user's choice and confirms the agent's understanding. Saying that the pros will be "delighted" helps to humanize the brand. This can make the lead capture process feel more human and relatable.
JSON payload
{ "text": "That will delight them! Next, are you interested in new arrivals? 🐣", "fallback": "That will delight them! Next, are you interested in new arrivals? You can type "Yes" or "Not really".", "suggestions": [ { "reply": { "text": "Yes", "postbackData": "option_1" } }, { "reply": { "text": "Not really", "postbackData": "option_2" } } ], "messageId": "2210" }
The user taps a suggestion to opt in.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-12-22T00:08:50.036551Z", "conversationId": "1111", "requestId": "123123011", "suggestionResponse": { "message": "conversations/1111/messages2211", "postbackData": "option_1", "createTime": "2022-12-22T00:08:49.498819Z", "text": "Yes", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent asks the third question.
To keep things fresh, the agent uses a different phrase to confirm the user's choice. This makes the agent seem responsive, as it rewards the user with a tailored response. The agent's tone is consistent (light, energized, encouraging) and helps propel the user through the Q&A.
JSON payload
{ "text": "Hurray for the latest and greatest! Last question: Do you want to know about local contests and other events at our stores? 🎉", "fallback": "Hurray for the latest and greatest! Last question: Do you want to know about local contests and other events at our stores? You can type "Yes" or "Not interested".", "suggestions": [ { "reply": { "text": "Yes", "postbackData": "option_1" } }, { "reply": { "text": "Not interested", "postbackData": "option_2" } } ], "messageId": "2212" }
The user taps a suggestion to opt out.
A suggested reply to opt out maintains the user's agency.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-12-22T00:09:36.012947Z", "conversationId": "1111", "requestId": "123123013", "suggestionResponse": { "message": "conversations/1111/messages2213", "postbackData": "option_2", "createTime": "2022-12-22T00:09:35.593461Z", "text": "Not interested", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent acknowledges the user's choice to opt-out.
"I hear you" is a clear and concise way to validate the user's choice. This short phrase keeps "I" and "you" close together, emphasizing that the agent is aligned with the user and will respect their decision to opt out. Because many users are wary of receiving unwanted content from brands, the agent sends this confirmation as a standalone message so it stands out clearly.
JSON payload
{ "text": "I hear you. Perfect.", "fallback": "I hear you. Perfect.", "suggestions": [], "messageId": "2214" }
The agent confirms what the user will receive in the offer and requests the user's email address for delivery.
The agent summarizes what the custom newsletter will consist of. If the user wants to change their answers, a suggested reply allows them to go back. An emoji in the middle of the message breaks up the text block and marks a transition to the next step in the signup.
In a respectful tone, the agent requests the user's contact information. The agent makes this request at a relevant point in the conversation, once the user has learned about the newsletter and can make an informed choice about signing up. This is preferred to asking for the user's contact information at the start of the conversation, before you've earned their interest and trust.
For transparency, the agent states exactly how the brand will use the contact information. We recommend that you only use it for the purpose expressed in the conversation—in this case, to send the newsletter. This reflects a user-first, privacy-aware form of lead capture that lays a foundation of trust. The agent's language does not become legalistic but remains clear and conversational.
JSON payload
{ "text": "We'll deliver inspiration from our puzzle pros and details on new arrivals 💌. May I ask for your email address? We'll only use it to send your newsletter, if you haven't signed up for other services from us. Just type below.", "fallback": "We'll deliver inspiration from our puzzle pros and details on new arrivals. May I ask for your email address? We'll only use it to send your newsletter, if you haven't signed up for other services from us. Just type your email below. Or type \"Change answers\" if you want to change what comes in your newsletter.", "suggestions": [ { "reply": { "text": "Change my answers", "postbackData": "option_1" } } ], "messageId": "2215" }
The user types their email address.
JSON payload
{ "message": { "name": "conversations/1111/messages/2216", "text": "puzzlehead@webaddress.com", "createTime": "2022-12-22T00:11:25.361576Z", "messageId": "2216" }, "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-12-22T00:11:25.767802Z", "conversationId": "1111", "requestId": "123123016", "agent": "brands/3333/agents/4444" }
The agent confirms the user's delivery information and the cancellation policy.
The agent repeats the delivery details and asks for explicit confirmation. If the email address isn't correct, suggestions allow the user to make changes or return to the main menu. This flexibility can prevent the user from getting stuck. Noting the cancellation policy is one more way to help the user feel empowered.
JSON payload
{ "text": "Got it. Is puzzlehead@webaddress.com correct? If so, we'll piece together your custom newsletter and email the first one on Jan 1st. You can cancel at any time.", "fallback": "Got it. Is puzzlehead@webaddress.com correct? If so, we'll piece together your custom newsletter and email the first one on Jan 1st. You can cancel at any time. Type "Correct" if your email is correct and want to receive the monthly newsletter. Type "Wrong" if you need to enter a different email address. Or type "Return to menu" if you don't want to receive the monthly newsletter.", "suggestions": [ { "reply": { "text": "Correct, send it", "postbackData": "option_1" } }, { "reply": { "text": "No, wrong email", "postbackData": "option_2" } }, { "reply": { "text": "Return to menu", "postbackData": "option_1" } } ], "messageId": "2217" }
The user confirms their information and consents to delivery.
JSON payload
{ "context": { "placeId": "", "userInfo": { "displayName": "Michael", "userDeviceLocale": "en-US" }, "resolvedLocale": "en" }, "sendTime": "2022-12-22T00:12:35.555839Z", "conversationId": "1111", "requestId": "123123018", "suggestionResponse": { "message": "conversations/1111/messages2218", "postbackData": "option_2", "createTime": "2022-12-22T00:12:35.112669Z", "text": "Correct, send it", "type": "REPLY" }, "agent": "brands/3333/agents/4444" }
The agent concludes the journey and offers to start a new one.
Even the closing message is inviting! It welcomes the user to their ongoing journey with the brand via newsletter. It also welcomes the user to start a new journey with the agent. Re-using the conversation starters as suggestions makes it easy to pivot onto a new path.
JSON payload
{ "text": "Welcome to the most puzzling newsletter! You're all set. Is there anything else I can help you with?", "fallback": "Welcome to the most puzzling newsletter! You're all set. Is there anything else I can help you with? For example, you can type "Purchase puzzles", "Manage order", "Find a store", or "Paradise FAQs".", "suggestions": [ { "reply": { "text": "🛍️ Purchase puzzles", "postbackData": "option_1" } }, { "reply": { "text": "📦 Manage order", "postbackData": "option_2" } }, { "reply": { "text": "🏬 Find a store", "postbackData": "option_3" } },
{ "reply": { "text": "❓ Paradise FAQs', postbackData", "postbackData": "option_4" } } ], "messageId": "2219" }