What This Template Is For
Chatbots fail when they are built as flat FAQ lookup tools. A customer types "I can't log in" and the bot returns a wall of text about password resets, two-factor authentication, account lockouts, and browser compatibility. The customer wanted one specific answer, but the bot gave them four because no one mapped the conversation flow.
This template provides a structured format for designing chatbot conversation flows that diagnose the customer's problem through targeted questions, provide a specific answer, and hand off to a human agent when the conversation reaches the limits of automation. Each flow is a decision tree with explicit branching logic, fallback paths, and success criteria.
Use this template alongside the knowledge base template to ensure your bot's answers are consistent with your public help articles. For defining when the chatbot should escalate to a human, the escalation matrix template provides the severity framework. If you are designing the customer's first experience with your product, the onboarding email template covers the sequence that runs alongside the bot.
How to Use This Template
- Identify your top 5 chatbot use cases. Pull them from your ticket data: the topics with the highest volume and highest resolution rate are ideal candidates for automation.
- For each use case, map the conversation flow using the decision tree format below.
- Write every bot message, including fallbacks and dead ends. Do not leave placeholder text.
- Define handoff criteria: the specific conditions under which the bot stops and a human takes over.
- Test each flow with 5 real customers before deploying. Watch for confusion, loops, and dead ends.
The Template
Flow Metadata
| Field | Value |
|---|---|
| Flow ID | BOT-[CATEGORY]-[NNN] |
| Flow Name | [Descriptive name: "Login Troubleshooting", "Billing Inquiry", "Onboarding Setup"] |
| Category | [Onboarding / Billing / Technical / Feature Discovery / Account Management] |
| Trigger | [What initiates this flow? Keyword match, button click, page context, scheduled message] |
| Goal | [What counts as a successful outcome? Issue resolved, article delivered, handoff completed] |
| Fallback | [What happens when the bot cannot match the user's intent?] |
| Handoff Criteria | [When does the bot transfer to a human agent?] |
| Avg. Turns | [Expected number of bot-user exchanges to reach resolution] |
| Last Reviewed | [Date] |
Conversation Flow Format
Each conversation turn follows this format:
[NODE_ID] Bot Message
├── [User Response A] → [NEXT_NODE_ID]
├── [User Response B] → [NEXT_NODE_ID]
├── [User Response C] → [NEXT_NODE_ID]
└── [Fallback: no match] → [FALLBACK_NODE_ID]
Node types.
| Type | Icon | Purpose |
|---|---|---|
| Greeting | 👋 | Opens the conversation, sets expectations |
| Question | ❓ | Asks for information to narrow the diagnosis |
| Action | ⚡ | Performs a system action (password reset, lookup, etc.) |
| Answer | ✅ | Delivers the solution or information |
| Handoff | 🤝 | Transfers to a human agent with context |
| Fallback | 🔄 | Handles unrecognized input |
| End | 🏁 | Closes the conversation |
Message Writing Guidelines
| Rule | Example |
|---|---|
| Keep messages under 60 words | "I can help with that. First, are you trying to log in on the web or mobile app?" |
| One question per message | Do not ask "What browser are you using and have you tried clearing cache?" Split into two turns |
| Offer buttons when possible | Present 2-4 button options instead of asking open-ended questions |
| Acknowledge before branching | "Got it, you are on the web app. Let me check a few things." |
| Never blame the user | Say "that setting can be tricky" not "you set it up wrong" |
| Include escape hatch | Every flow needs a "Talk to a person" option visible at every turn |
Handoff Context Template
When the bot transfers to a human agent, pass this context:
HANDOFF CONTEXT
- Flow: [Flow Name]
- Node reached: [NODE_ID where handoff triggered]
- Reason: [Why the bot could not resolve: complexity, user frustration, system error]
- User responses so far:
- Q1: [Bot question] → A1: [User answer]
- Q2: [Bot question] → A2: [User answer]
- Customer info: [Name, email, plan, account age]
- Suggested resolution: [What the bot thinks the agent should try next]
This prevents the customer from repeating everything they already told the bot. Your support team's canned response template should include responses designed for post-handoff scenarios.
Filled Example 1: Login Troubleshooting Flow
Flow Metadata
| Field | Value |
|---|---|
| Flow ID | BOT-TECH-001 |
| Flow Name | Login Troubleshooting |
| Category | Technical |
| Trigger | User types "can't log in", "login problem", "password", or clicks "Login Issues" quick action |
| Goal | User regains access to their account |
| Fallback | Offer to connect with a support agent |
| Handoff Criteria | Account compromised, locked for security, user fails 3 reset attempts, or user requests a human |
| Avg. Turns | 4-6 |
Flow
[1.0] 👋 "I can help you get back into your account. What is happening when you try to log in?"
├── [Forgot password] → [2.1]
├── [Getting an error message] → [2.2]
├── [Two-factor code not working] → [2.3]
├── [Talk to a person] → [HANDOFF]
└── [Fallback] → [FB.1]
[2.1] ⚡ "No problem. I am sending a password reset link to the email on your account now."
→ System action: trigger password reset email
→ [3.1]
[3.1] ❓ "I have sent the reset link. Did you receive the email?"
├── [Yes, got it] → [END.1]
├── [No, nothing in inbox or spam] → [3.2]
└── [Fallback] → [FB.1]
[3.2] ❓ "Sometimes the email takes a few minutes. Can you confirm the email address on your account?"
├── [User provides email] → [3.3]
└── [Fallback] → [FB.1]
[3.3] ⚡ "Let me check that email against our records."
→ System action: verify email exists in database
├── [Email found] → "I have resent the link. Check {email} including spam. If it still does not arrive in 5 minutes, reply here." → [END.2]
├── [Email not found] → "I do not have an account under that email. You might have signed up with a different address. Would you like to try another email or talk to a person?" → [OPTION.1]
└── [System error] → [HANDOFF]
[2.2] ❓ "What error message are you seeing? Pick the closest match:"
├── [Invalid email or password] → [2.1] (redirect to password reset)
├── [Account locked] → "Your account has been temporarily locked after multiple failed attempts. It will unlock automatically in 30 minutes. If you need immediate access:" → [HANDOFF]
├── [Something else] → "Can you copy and paste the exact error message?" → [ERR.1]
└── [Fallback] → [FB.1]
[2.3] ❓ "Are you using an authenticator app or SMS for two-factor authentication?"
├── [Authenticator app] → "Try these steps: 1) Make sure your phone's time is synced automatically. 2) Open the authenticator app and use the current code (they refresh every 30 seconds). Did that work?"
├── [SMS] → "SMS codes can take up to 2 minutes. Check that your phone number is still {last 4 digits}. If you changed your number, you will need to talk to our team:" → [HANDOFF]
└── [Not sure] → [HANDOFF]
[HANDOFF] 🤝 "I am connecting you with a support agent who can help further. They will have the context from our conversation so you will not need to repeat yourself."
→ Pass handoff context
[FB.1] 🔄 "I did not quite catch that. Could you rephrase, or pick one of these options?"
→ Re-display current node's buttons
├── [After 2 consecutive fallbacks] → "It seems like I am not understanding your question. Let me connect you with a person who can help." → [HANDOFF]
[END.1] 🏁 "You are all set. If you run into any other issues, I am here."
→ CSAT prompt: "Was this helpful? 👍 👎"
[END.2] 🏁 "The reset link should arrive shortly. If you still need help, just start a new chat."
Filled Example 2: Billing Inquiry Flow
Flow Metadata
| Field | Value |
|---|---|
| Flow ID | BOT-BILL-001 |
| Flow Name | Billing Inquiry |
| Category | Billing |
| Trigger | User types "billing", "charge", "invoice", "refund", or clicks "Billing" quick action |
| Goal | Customer's billing question is answered or routed to billing team with context |
| Handoff Criteria | Refund request over $100, disputed charge, enterprise contract, or payment failure |
| Avg. Turns | 3-5 |
Flow
[1.0] 👋 "I can help with billing questions. What would you like to know?"
├── [View my current plan] → [2.1]
├── [I was charged the wrong amount] → [2.2]
├── [I want to upgrade or downgrade] → [2.3]
├── [I want a refund] → [2.4]
├── [Talk to a person] → [HANDOFF]
└── [Fallback] → [FB.1]
[2.1] ⚡ "Let me pull up your account details."
→ System action: fetch subscription info
→ ✅ "You are on the {plan_name} at {amount}/month. Your next billing date is {date}. Your payment method is {card ending}. Want to make any changes?"
├── [No, that is all I needed] → [END.1]
├── [I want to change my plan] → [2.3]
└── [Fallback] → [FB.1]
[2.2] ❓ "I am sorry about that. Can you tell me which charge looks wrong? I will look into it."
→ System action: fetch recent invoices
→ "Here are your recent charges: [list]. Which one looks incorrect?"
├── [User identifies charge] → ⚡ Lookup charge details → "That charge of {amount} on {date} was for {reason}. Does that explanation make sense?"
├── [Yes, that clears it up] → [END.1]
├── [No, I still think it is wrong] → [HANDOFF]
└── [Fallback] → [FB.1]
[2.3] ✅ "Here are the available plans: [plan comparison]. To change plans, visit your account settings or I can connect you with our team to walk through the options."
├── [I will do it myself] → [END.1]
├── [Connect me with someone] → [HANDOFF]
[2.4] ❓ "I understand. Can you tell me the reason for the refund request?"
├── [Accidental charge / duplicate] → ⚡ Check for duplicate → HANDOFF with context
├── [Service not as expected] → "I am sorry to hear that. Let me connect you with our billing team who can review your account." → [HANDOFF]
├── [Cancellation within trial] → ⚡ Check trial status → process refund if eligible
└── [Fallback] → [HANDOFF]
Filled Example 3: Onboarding Setup Flow
Flow Metadata
| Field | Value |
|---|---|
| Flow ID | BOT-ONB-001 |
| Flow Name | Onboarding Setup Assistant |
| Category | Onboarding |
| Trigger | New user's first login, or user visits setup page |
| Goal | User completes account setup (profile, team invite, first project) |
| Handoff Criteria | Enterprise account with custom setup requirements, SSO configuration needed |
| Avg. Turns | 5-8 |
Flow
[1.0] 👋 "Welcome to {product_name}. I will help you get set up in about 5 minutes. Ready?"
├── [Let's go] → [2.1]
├── [I will set up later] → "No problem. I will be here when you are ready. You can find me in the bottom-right corner anytime." → [END.1]
├── [I already have an account] → "Welcome back. What can I help you with?" → [EXISTING.1]
└── [Fallback] → [FB.1]
[2.1] ❓ "First, what will you mainly use {product_name} for?"
├── [Project management] → tag: use_case=pm → [3.1]
├── [Product roadmapping] → tag: use_case=roadmap → [3.1]
├── [Team collaboration] → tag: use_case=collab → [3.1]
├── [Just exploring] → tag: use_case=explore → [3.1]
└── [Fallback] → [3.1]
[3.1] ✅ "Great choice. Let me customize your workspace for {use_case}."
→ System action: apply workspace template
→ "Done. I have set up a {use_case} workspace with starter templates. Next, want to invite your team?"
├── [Yes, invite team] → [4.1]
├── [Skip for now] → [5.1]
[4.1] ❓ "Enter the email addresses of the people you want to invite (comma-separated):"
→ System action: send invitations
→ ✅ "Invitations sent to {count} people. They will get an email with a join link. Moving on to your first project."
→ [5.1]
[5.1] ❓ "Let me help you create your first project. What would you like to call it?"
→ System action: create project with name
→ ✅ "Your project '{project_name}' is ready. Here is a quick tour of the key features: [interactive walkthrough link]"
→ [END.2]
[END.2] 🏁 "You are all set. Here are three things to try next:
1. Add your first task
2. Customize your dashboard
3. Explore templates
Need help with anything? I am always here."
Flow Design Checklist
Use this checklist when designing a new chatbot flow:
- ☐ Every node has a fallback path for unrecognized input
- ☐ "Talk to a person" is accessible from every question node
- ☐ No dead ends: every path reaches either an END, HANDOFF, or loops back to a question
- ☐ Bot messages are under 60 words each
- ☐ Each question asks one thing at a time
- ☐ Handoff context includes all prior user responses
- ☐ System actions have error handling (what if the API call fails?)
- ☐ Flow has been tested with 5+ real users
- ☐ CSAT survey triggers at END nodes
- ☐ Tone matches your support playbook guidelines
Metrics to Track
| Metric | Definition | Target |
|---|---|---|
| Containment rate | % of conversations resolved without human handoff | 40-60% |
| Avg. turns to resolution | Number of exchanges before the conversation ends | < 6 |
| Fallback rate | % of user messages the bot cannot match | < 15% |
| Handoff rate | % of conversations that transfer to a human | 30-50% |
| CSAT score | Customer satisfaction rating at end of bot conversation | > 4.0/5.0 |
| Drop-off rate | % of users who abandon the conversation mid-flow | < 25% |
Track these metrics per flow, not just globally. A 60% containment rate on login issues but 15% on billing tells you where to invest.
Common Mistakes to Avoid
- Building a FAQ bot instead of a flow. A FAQ bot matches keywords to answers. A flow diagnoses through questions. The difference matters. "I can't log in" could mean forgot password, account locked, 2FA issue, or browser incompatibility. A flow figures out which one through targeted questions.
- Too many options per node. Limit each node to 3-4 button options. More than that causes decision paralysis. If you need more categories, add a second level of branching.
- No escape hatch. Users must always be able to reach a human. If your bot traps users in a loop with no handoff option, you will generate complaints that are worse than the original support request.
- Ignoring the fallback path. Most teams design the happy path and forget the fallback. When a user types something the bot does not understand, what happens? Plan for this explicitly.
- Deploying without testing with real users. Internal testing catches structural issues but not confusion, tone problems, or missing paths. Test with 5 real customers and watch (or read transcripts) to find where they get stuck.
Key Takeaways
- Design chatbot conversations as decision trees, not flat FAQ lookups
- Every node needs a fallback path and a "talk to a person" escape hatch
- Keep bot messages under 60 words and ask one question per turn
- Pass full conversation context on handoff so customers do not repeat themselves
- Start with 3-5 flows and expand based on containment rate data
About This Template
Created by: Tim Adair
Last Updated: 3/5/2026
Version: 1.0.0
License: Free for personal and commercial use
