10 Conversational Design Patterns That Actually Work
After analyzing thousands of successful conversations, we've identified 10 patterns that consistently create great user experiences. Here's what works.
Pattern 1: Start Open, Then Guide
Don't start with: "What would you like to do? [Option A] [Option B] [Option C]"
Instead start with: "What can I help you with?"
Let users express their need in their own words, then guide them to the right solution.
Example:
User: "I need to change my billing"
Bot: "I can help with that. Would you like to:
- Update your payment method
- Change your plan
- Cancel your subscription
- View billing history"
- Users aren't forced into preset categories
- Bot understands intent, then shows relevant options
- Feels more natural
- Prevents mistakes
- Gives users a chance to clarify
- Shows what will happen
Why it works:
When to use: Starting conversations, unclear user intent
---
Pattern 2: Confirm Before Action
Always confirm before doing something important.
Bad:
User: "Cancel my subscription"
Bot: "Done. Your subscription has been canceled."
(User meant "cancel my upcoming meeting")
Good:
User: "Cancel my subscription"
Bot: "Just to confirm—you want to cancel your Pro subscription ($99/month)? You'll lose access at the end of your billing period on September 30."
User: "Yes"
Bot: "Subscription canceled. You'll remain active until September 30. Feedback on why you're leaving?"
Why it works:
When to use: Destructive actions, important changes, ambiguous requests
---
Pattern 3: Progressive Disclosure
Don't dump all options at once. Reveal complexity gradually.
Bad:
Bot: "Configure your integration:
API Key
Webhook URL
Retry Strategy (Exponential/Linear/None)
Timeout (ms)
Max Retries
Error Handling (Fail/Skip/Log)
Rate Limit
Authentication Method (OAuth/API Key/Basic)
..."
Good:
Bot: "Let's set up your integration. First, connect your account:"
[Show OAuth button]
(After connected)
Bot: "Connected! Want to customize how it works, or use the defaults?"
Use Defaults
Customize Settings
Why it works:
When to use: Complex configurations, multi-step processes, optional features
---
Pattern 4: Show, Don't Tell
Use rich components instead of describing things.
Bad:
User: "Show me available times"
Bot: "I have availability at: 9:00 AM, 9:30 AM, 10:00 AM, 10:30 AM, 11:00 AM, 2:00 PM, 2:30 PM, 3:00 PM, 4:00 PM. Which one works?"
Good:
User: "Show me available times"
Bot: [Shows interactive calendar with available slots highlighted]
Why it works:
When to use: Dates, times, products, locations, any visual data
---
Pattern 5: Provide Escape Hatches
Always give users a way out.
Example conversation:
Bot: "What's your company name?"
User: "Actually, never mind"
Bot: "No problem! Is there anything else I can help with?"
Or:
Bot: "What's your email?"
User: "I don't want to share that"
Bot: "That's okay. You can still browse our docs without an account. Want me to show you around?"
Why it works:
When to use: Always have an escape hatch available
Implementation:
javascript
bot.onIntent('cancel', () => ({
content: "No problem! What would you like to do instead?",
actions: [
{ label: 'Browse Features', action: 'show_features' },
{ label: 'Talk to Sales', action: 'human_handoff' },
{ label: 'Just Looking', action: 'goodbye' }
]
}));
---
Pattern 6: Handle Failure Gracefully
When things go wrong, be helpful.
Bad:
User: "Show me my invoices"
Bot: "Error 500: Database connection failed"
Good:
User: "Show me my invoices"
Bot: "I'm having trouble accessing your invoices right now. While I work on that, you can:
I've notified our team about this issue."
Why it works:
When to use: API failures, timeouts, unexpected errors
---
Pattern 7: Personalize Based on Context
Use what you know about the user.
Generic:
Bot: "Welcome! What brings you here?"
Personalized:
Bot: "Welcome back, Sarah! I see you were looking at the Pro plan last time. Want to continue where you left off, or can I help with something else?"
Or:
Generic: "Our plans start at $29/month"
Personalized: "Based on your team size (15 people), I'd recommend the Business plan at $199/month. It includes everything you mentioned you needed."
Why it works:
When to use: Returning users, mid-conversation, follow-ups
Implementation:
``javascript
bot.onMessage(async (message, context) => {
const user = await getUser(context.userId);
const lastAction = user.lastAction;
if (lastAction?.type === 'viewed_plan') {
return {
content: Welcome back! Still interested in the ${lastAction.plan} plan?,
actions: [
{ label: 'Yes, Sign Up', action: 'start_signup' },
{ label: 'Compare Plans', action: 'show_plans' },
{ label: 'Start Over', action: 'reset' }
]
};
}
// Default greeting
});
---
Pattern 8: Chunk Information
Break long responses into digestible pieces.
Bad:
User: "Tell me about your product"
Bot: [Sends 500-word description in one message]
Good:
User: "Tell me about your product"
Bot: "Acme helps teams manage projects more effectively. We focus on three things:
1. Simple task management - Create tasks in seconds
2. Real-time collaboration - See updates instantly
3. Intelligent automation - Less busywork
Want to dive deeper into any of these?"
Why it works:
Easier to read
Users can ask about what interests them
Works better on mobile
When to use: Long explanations, lists, multi-part responses
---
Pattern 9: Suggest Next Steps
Don't end with "anything else?" Always suggest what's next.
Bad:
Bot: "I've created your account. Anything else I can help with?"
(User doesn't know what to ask next)
Good:
Bot: "Account created! Here's what most people do next:
Import your existing projects
Invite your team
Take a quick tour
Which sounds good?"
Why it works:
Guides users through journey
Reduces "now what?" moments
Increases feature discovery
When to use: After completing any action
---
Pattern 10: Use Natural Language Variations
Don't be robotic. Vary your responses.
Robotic:
Bot: "Task created successfully."
Bot: "Task created successfully."
Bot: "Task created successfully."
Natural:
Bot: "Added that task."
Bot: "Got it, task created."
Bot: "Done! Your task is on the list."
Why it works:
Feels more human
Less repetitive
Better user experience
Implementation:
javascript
const confirmations = [
"Done!",
"Got it.",
"Added.",
"All set.",
"Task created."
];
function randomConfirmation() {
return confirmations[Math.floor(Math.random() * confirmations.length)];
}
``
---
Bonus Patterns
Pattern 11: Graceful Degradation
When AI can't understand, fall back gracefully:
User: "asdkjfh sdkljfh"
Bot: "I didn't quite understand that. I can help you with:
Or just ask me a question!"
Pattern 12: Use Positive Language
Negative: "You can't access that feature"
Positive: "That feature is available on the Pro plan. Want to upgrade?"
Negative: "Invalid email"
Positive: "That email format doesn't look quite right. Try again?"
Pattern 13: Provide Examples
When asking for input, show examples:
Bad: "What's your use case?"
Good: "What will you use Acme for?
Examples: 'Managing client projects', 'Team task tracking', 'Product launches'"
---
Anti-Patterns (What NOT to Do)
❌ Don't Pretend to Be Human
Bad: "Hi! I'm Sarah from the support team..."
(Then user realizes it's a bot and feels deceived)
Good: "Hi! I'm the Acme bot. I can help you with..."
❌ Don't Ask Unnecessary Questions
Every question should have a purpose.
Bad:
"How are you today?"
"What brings you here?"
"What can I help with?"
"What specifically?"
Good:
"What can I help you with today?"
❌ Don't Make Users Repeat Themselves
Bad:
User: "I need to book a table for 4 people on Friday at 7pm"
Bot: "How many people?"
User: 🤦
Good:
Bot: "Table for 4 on Friday at 7pm. I have availability at 6:30pm and 7:30pm. Which works?"
❌ Don't Use Too Much Personality
Bad: "OMG! 🎉 That's so awesome! 🔥 Let's totally do that! 💪"
Good: "Got it. I'll set that up."
---
Putting It All Together
Example conversation using multiple patterns:
User: "I need help" *(vague request)*
Bot: "I'm here to help! What are you trying to do?" *(Pattern 1: Start open)*
User: "Set up a new project"
Bot: "Great! What should we call this project?" *(Pattern 9: Suggest next step)*
User: "Website Redesign"
Bot: "Added 'Website Redesign'. Want to add team members now or skip that for later?" *(Pattern 3: Progressive disclosure, Pattern 5: Escape hatch)*
User: *Clicks "Add Team Members"*
Bot: "Who should I add? You can type their emails or names." *(Pattern 13: Provide examples)*
User: "sarah@company.com, mike@company.com"
Bot: "Added Sarah and Mike to the project. They'll get an invite email." *(Pattern 10: Natural language)*
What's next?
---
Measuring Success
Track these metrics to see if your patterns are working:
Efficiency:
Satisfaction:
Understanding:
---
Get Started
Want to implement these patterns in your product?
---
*Have a pattern we missed? Email hello@ilq.ai*
