Most chatbot dashboards are built to make you feel good, not to tell you the truth. Total messages, active users, average session length - these numbers go up whether your bot is useful or annoying. They measure activity, not value.
If you're running an AI chatbot for support or lead gen, you need metrics that tie back to money saved or money made. Here are the seven that do.
1. Resolution Rate
The percentage of conversations the bot fully closed without a human touching them. This is the single most important support KPI.
Be strict about the definition. A "resolved" conversation means the user got what they needed and didn't reopen the ticket or bounce to a human within, say, 24 hours. A bot that says "Was that helpful?" and gets ignored is not a resolution.
def resolution_rate(conversations):
resolved = [
c for c in conversations
if c["closed_by"] == "bot"
and not c["escalated"]
and not c["reopened_within_24h"]
]
return round(len(resolved) / len(conversations) * 100, 1)
Benchmark: a decent bot lands 40-60%. Anything above 70% either means great automation or a definition that's too generous. Audit it.
2. Deflection Rate
Deflection is close to resolution but framed around cost. It's the share of inbound volume that never reached a human agent - because the bot handled it, or the user self-served from a bot-surfaced article.
The difference matters: deflection includes cases where the user got their answer and left satisfied without a formal resolution event. Both metrics together tell you how much load you took off your support team.
Tie it to dollars:
const deflectedTickets = totalInbound - ticketsToHumans;
const costPerTicket = 6.50; // your fully-loaded agent cost
const monthlySavings = deflectedTickets * costPerTicket;
That one line converts a fuzzy "the bot is helping" into a number your CFO respects.
3. Escalation Rate (and Escalation Quality)
The inverse of resolution, but don't treat it as pure failure. A good escalation is a feature: the bot recognized it was out of depth and handed off cleanly with full context.
Track two things:
- Raw escalation rate - what fraction goes to a human.
- Escalation quality - did the agent get a summary, the user's intent, and prior steps? Or did the customer have to repeat everything?
A bot with a 45% escalation rate but seamless handoffs can beat one with a 30% rate that dumps confused users on agents.
4. Containment by Intent
Aggregate resolution hides the truth. Break it down by intent.
Your bot might crush "reset password" (95% resolved) and completely faceplant on "cancel my subscription" (12% resolved). The average looks fine. The reality is you have a broken cancellation flow bleeding trust.
from collections import defaultdict
def containment_by_intent(conversations):
totals = defaultdict(int)
resolved = defaultdict(int)
for c in conversations:
totals[c["intent"]] += 1
if c["closed_by"] == "bot" and not c["escalated"]:
resolved[c["intent"]] += 1
return {
intent: round(resolved[intent] / totals[intent] * 100, 1)
for intent in totals
}
This is where you find your highest-ROI fixes. Improve your three worst high-volume intents and your overall numbers jump.
5. Qualified Leads Captured
For a lead-gen chatbot, message count is meaningless. What matters is qualified leads - contacts that match your ICP, gave real intent signals, and got routed to sales.
Define qualification explicitly: budget mentioned, decision-maker role, timeline, or a demo booked. Then measure the conversion from conversation to qualified lead. A bot that talks to 5,000 people and produces 4 qualified leads is a very expensive toy.
6. Pipeline Influenced
This is the metric that gets budget approved. Connect chatbot-sourced leads to your CRM and track the pipeline value they generate.
Don't over-claim. Use influenced pipeline (deals the bot touched) alongside sourced pipeline (deals it originated). The honest split protects your credibility when leadership digs in.
When you can say "the bot booked 38 demos last quarter, contributing $210K in influenced pipeline," nobody asks about session length again.
7. Cost Per Resolution
The efficiency check. Take your total bot cost - platform, LLM tokens, engineering time, maintenance - and divide by resolved conversations.
const totalCost = platformFee + tokenSpend + engHours * hourlyRate;
const costPerResolution = totalCost / resolvedConversations;
// Compare against ~$6-$15 for a human-handled ticket
If your cost per resolution creeps toward human cost, something's wrong - usually token bloat from bad prompts or a bot escalating too much while still burning compute.
Put Them Together
No single number wins. Resolution and deflection prove support ROI. Escalation quality protects experience. Containment-by-intent shows you where to build next. Qualified leads and pipeline prove revenue impact. Cost per resolution keeps you honest.
Build a dashboard around these seven and kill the vanity charts. The goal isn't a bot that's busy - it's a bot that provably saves money and makes money. If you can't draw a straight line from your metrics to one of those two outcomes, you're measuring the wrong thing.
Originally published at getmichaelai.com
Top comments (0)