Most AI support projects fail the same way. Someone bolts a chatbot onto the help center, it hallucinates a refund policy, CSAT drops eight points, and leadership quietly kills the initiative six weeks later.
The 40% number is real. We've hit it repeatedly. But it comes from architecture decisions, not from replacing humans with a magic model. Here's the actual playbook.
Start with deflection math, not model selection
Before you write a line of code, categorize your last 1,000 tickets. You're looking for three buckets:
- Deflectable: password resets, order status, plan changes, doc lookups. High volume, low risk.
- Assistable: the AI drafts, a human approves. Refunds, account changes, edge-case troubleshooting.
- Human-only: churn saves, legal, angry escalations, anything touching money above a threshold.
In most B2B SaaS support queues, 55-70% of tickets are deflectable or assistable. That's where your 40% lives. Trying to automate the human-only bucket is where CSAT dies.
Run this on your export before anything else:
import pandas as pd
tickets = pd.read_csv("tickets_90d.csv")
# tag by intent using your existing categories or a quick classifier
deflectable = tickets[tickets.intent.isin([
"order_status", "password_reset", "plan_change", "how_to"
])]
volume = len(deflectable) / len(tickets)
avg_handle_min = tickets.handle_time_min.mean()
hours_saved = (len(deflectable) * avg_handle_min) / 60
print(f"Deflectable share: {volume:.0%}")
print(f"Monthly human-hours reclaimable: {hours_saved:,.0f}")
If that number is small, an AI agent won't save you. Fix your product or docs first.
Build the agent around retrieval, not vibes
The fastest way to torch trust is letting the model answer from training data. Every response must be grounded in your content: docs, past resolved tickets, policy pages.
Use retrieval-augmented generation with a hard rule: no source, no answer.
def answer(question, kb):
chunks = kb.search(question, top_k=5, min_score=0.75)
if not chunks:
return escalate(question, reason="no_confident_source")
context = "\n\n".join(c.text for c in chunks)
prompt = f"""Answer ONLY using the context below.
If the context does not fully answer, say you'll connect a human.
Never invent policy, prices, or steps.
Context:
{context}
Question: {question}"""
reply = llm.generate(prompt, temperature=0.2)
return reply, [c.source for c in chunks] # always cite
Two details matter here. Low temperature kills creative fabrication. And the min_score threshold on retrieval is your first safety net: weak matches trigger escalation instead of a guess.
Escalation design is the whole game
CSAT rarely dies because the AI answered wrong. It dies because the AI trapped the customer. Loop them through the same three suggestions, refuse to hand off, force them to rephrase five times.
Design explicit escape hatches:
- Confidence-based: retrieval score below threshold - escalate silently.
- Sentiment-based: frustration detected in the message - escalate immediately, don't try to help.
- Intent-based: refund, cancel, legal keywords - route to human queue.
- Loop-based: same customer, same unresolved intent, second attempt - escalate.
def should_escalate(msg, history, retrieval_score):
if retrieval_score < 0.75:
return True, "low_confidence"
if detect_frustration(msg) > 0.6:
return True, "negative_sentiment"
if any(k in msg.lower() for k in ["cancel", "refund", "lawyer", "gdpr"]):
return True, "sensitive_intent"
if repeated_unresolved(history):
return True, "loop_detected"
return False, None
A good AI agent should feel eager to hand off, not desperate to close the ticket itself. The metric to optimize is resolution, not containment.
Protect CSAT with measurement, not hope
Instrument from day one. Track these per conversation:
- Deflection rate (resolved without human touch)
- Escalation rate and reason
- CSAT split: AI-only vs. AI-assisted vs. human-only
- Reopen rate (did the "resolved" ticket come back?)
That last one is the honest metric. A high deflection rate with a high reopen rate means you're not resolving anything - you're delaying tickets and annoying people.
Set a CSAT floor. If AI-handled conversations drop below your human baseline minus two points, you route more aggressively to humans until you fix the gap. Cost savings that cost you retention aren't savings.
Roll it out like an engineer, not a gambler
Don't flip 100% of traffic. Stage it:
- Shadow mode: AI drafts answers, humans send. Measure quality with zero customer risk.
- Single intent live: turn on one deflectable category, e.g. order status.
- Expand by confidence: add intents as each proves its CSAT and reopen numbers.
Within 8-12 weeks, a well-scoped agent handles 40-60% of volume end to end, your team focuses on the hard, high-value tickets, and CSAT holds or climbs because response times collapse from hours to seconds.
The 40% cost cut is a byproduct. The actual goal is a support system where the AI knows what it doesn't know - and gets out of the way fast when it doesn't.
Originally published at getmichaelai.com
Top comments (0)