Most AI support bots are terrible. You know the ones:
"I'm sorry, I didn't understand that. Would you like to speak to a human?"
Repeated 47 times before you get actual help.
I've built support bots for 6 different businesses. Here's what separates the useful ones from the frustrating ones.
Why Most Bots Fail
Problem 1: No context awareness
User: "My order hasn't arrived"
Bot: "What is your order number?"
User: "12345"
Bot: "How can I help you today?"
The bot forgot the conversation already.
Problem 2: Rigid decision trees
If the user's question doesn't match your predefined paths, the bot breaks. Real questions are messy. "My thing didn't come and also I was charged twice and the app crashed" — good luck with your flowchart.
Problem 3: Trying to do too much
Bots that try to handle everything handle nothing well. The best bots do 3-5 things excellently.
What Actually Works
1. Narrow Scope, Deep Capability
Pick the top 5 questions you get. Make the bot amazing at those. Everything else goes to humans.
For an e-commerce store:
- Order status ✓
- Return requests ✓
- Shipping info ✓
- Product availability ✓
- Store hours ✓
- Complex complaints → Human
That's it. Don't try to make the bot handle "I bought this for my grandmother and she didn't like it but also the color was wrong and can you recommend something else?"
2. Persistent Context
The bot needs memory. Not just within a conversation — across conversations.
# Bad
def handle_message(message):
response = llm.respond(message)
return response
# Good
def handle_message(user_id, message):
history = get_user_history(user_id)
orders = get_user_orders(user_id)
context = f"""
User history: {history}
Recent orders: {orders}
Current message: {message}
"""
response = llm.respond(context)
save_to_history(user_id, message, response)
return response
When a returning customer says "same problem as last time," the bot should know what that means.
3. Graceful Escalation
The bot should know when it's failing. Signals:
- User repeats the same question
- User uses angry language
- Question doesn't match any known pattern
- User explicitly asks for human
def should_escalate(conversation):
if len(conversation.user_messages) > 5:
return True # Going in circles
if detect_frustration(conversation.last_message):
return True
if "human" in conversation.last_message.lower():
return True
return False
And when escalating, pass the full context to the human. Don't make the customer repeat everything.
4. Admit Uncertainty
Bad: "Your order will arrive tomorrow!" (when the bot doesn't actually know)
Good: "Based on the tracking info, your order is in transit. Typical delivery is 2-3 days from this status. Want me to email you when it updates?"
Users forgive uncertainty. They don't forgive confident wrong answers.
The Stack I Use
LLM: Claude API
- Better at following instructions than GPT for support contexts
- Handles edge cases more gracefully
- ~$0.01 per conversation
Orchestration: n8n or custom Python
- Webhook receives message
- Enriches with user data
- Sends to LLM with context
- Processes response
- Sends reply
Data sources:
- CRM (user history)
- Order system (order status)
- Knowledge base (FAQs, product info)
- Conversation history
Channels:
- Telegram (easiest to build)
- Website widget (Intercom, Crisp)
- Email (for async)
Sample Prompt Engineering
The prompt matters more than the model:
You are a customer support assistant for [Company].
CAPABILITIES:
- Check order status (you'll receive order data)
- Explain return policy (30 days, free returns)
- Provide shipping estimates
- Answer product questions using the knowledge base
RULES:
- Never make up information. If unsure, say so.
- If the user is frustrated, acknowledge it before solving.
- If you can't help, offer to connect with a human.
- Keep responses under 3 sentences unless more detail requested.
- Use the customer's name if available.
CONTEXT:
Customer name: {name}
Recent orders: {orders}
Previous conversations: {history}
Knowledge base results: {kb_results}
CUSTOMER MESSAGE:
{message}
This prompt alone handles 80% of what you need.
Measuring Success
Track these:
- Resolution rate: What % of conversations end without human escalation?
- First response relevance: Did the first bot response address the actual question?
- Time to resolution: How long before the issue is solved?
- CSAT after bot interactions: Do users rate bot conversations poorly?
Aim for:
- 60%+ resolution rate (for common issues)
- <10 seconds first response
- Higher CSAT than email support
Common Mistakes
1. Launching without testing edge cases
Test: typos, multiple questions in one message, angry users, confused users, users who don't speak English well.
2. No feedback loop
You need to read failed conversations. Every week, look at the ones where users asked for a human. Why did the bot fail? Update the prompt.
3. Treating the bot as "done"
Support bots need continuous improvement. New products, new policies, new questions. Budget for ongoing maintenance.
4. No human backup
The bot should always have a human fallback. "Our team will respond within 2 hours" is fine. "Sorry, I can't help with that" without an alternative is not.
ROI Reality
For a business handling 1,000 support tickets/month:
Before bot:
- 1,000 tickets × 10 min average = 167 hours
- At $20/hour = $3,340/month
After bot (60% automation):
- 400 tickets × 10 min = 67 hours = $1,340
- Bot cost: ~$50/month (API + hosting)
Monthly savings: ~$1,950
Pays for itself in week one.
I cover the complete architecture — prompts, n8n workflows, escalation logic, and channel integrations — in AI Automation Blueprint 2026. $29 for the full system.
Top comments (0)