Skip to main content
Back to blog

AI containment rate analytics: the dedicated dashboard and how to read it

Devotel Orbit's dedicated /insights/containment dashboard: what the page shows, how to read containment by agent and channel, safe champion/challenger thresholds, and the CSAT-only contrast.

Orbit Editorial Team

Quick answer

Containment is the share of AI-agent conversations the bot resolved without handing off to a human. Orbit computes it as the conversations where the AI never escalated, per agent, over whatever window you pick. It is the right primary KPI for an AI agent because it measures the one thing the AI exists to do: carry a conversation end to end without spending a human on it. It is counted from actual conversation outcomes, not surveys. CSAT tells you how customers felt; containment tells you whether the agent worked. The two pair, they are not interchangeable.

Devotel Orbit ships a dedicated surface for this at `/insights/containment`: four header cards (containment rate, resolution rate, escalation rate, total conversations), a daily containment-vs-resolution trend chart, and a per-agent breakdown table with conversations, escalated and resolved counts, and both rates per agent. Rates render "—" when the window has no conversations; a rate over zero traffic is undefined, not a real 0%.

What the shipped page shows

Open /insights/containment in the Devotel Orbit dashboard and you get:

  1. Header stat cards. Containment rate (handled without a human handoff), resolution rate (reached a resolved status or passed a rubric outcome), escalation rate (handed off to a human agent), and total conversations in the window, with the count of agents that had traffic.
  2. Containment vs resolution trend. A daily chart over your chosen window (24h, 7d, 30d, 90d, 12m, or a custom range). The gap between the two lines is the conversations the bot kept but did not resolve.
  3. Per-agent breakdown. For each agent: model, conversations, escalated count, resolved count, containment %, resolution %. Truncated lists get a shown-of-total note so a partial table never reads as authoritative.

The rate definitions sit in a footnote on the page: a conversation counts as resolved when it reached a resolved status or passed a rubric outcome, and contained when the AI never escalated it to a human. The page links through to /insights/agent-roi when you want the money side; containment is counted in conversations, and ROI converts that to avoided human loading.

If you have no AI agents configured, the page routes you to agent setup instead of rendering an empty chart. If agents exist but had no traffic in the window, it says so explicitly; a failed load shows a Retry control, never a confident zero.

Reading the rate by channel, agent, and flow

The aggregate header cards are a sanity check; the decisions happen one level down.

By agent. The breakdown table ranks your agents against each other in the same window, with the model id on each row. A fleet-wide 70% can hide one agent at 40% subsidized by three at 85%. The 40% might be the right target for that flow's complexity, or a real regression. The table tells you which.

By flow and intent. The IVR-vs-AI decision guide in this blog argues containment should be gated per intent, not per queue, because queue-level numbers hide where an agent underperforms. That decision context lives there; the per-agent view here is how you verify the per-intent readings stay honest once you name flows as separate agents.

By fallback signal. Pair the containment rate with two sibling surfaces:

  • High-friction sessions (the Insights overview). A containment drop shows up as friction before it shows up as escalations, because customers fight the bot before they ask for a human.
  • Leaderboards. Human and AI agents ranked on one weighted scorecard (QA scorecard, handled volume, CSAT). When a contained conversation still scores low on QA, the bot kept the session but did not serve it well. That is resolution quality, not containment, and the leaderboard catches it.

The trend chart's containment-vs-resolution gap is the fastest single reading: a wide gap means kept-but-unresolved, which is the failure mode raw containment hides.

Setting safe thresholds — champion/challenger

Thresholds should be chosen against a baseline, not a target in the abstract. The canary-rollout post describes the workflow: a challenger prompt version ships to a percentage ladder (default 5 → 25 → 50 → 100) gated by a six-metric quality scorecard (rubric pass rate, sentiment, p50 and p95 latency, thumbs-down, error rate). Any regression rolls the challenger back.

Before you start a rollout, run the champion for a full week and read containment on /insights/containment. That week's containment and resolution rates are your champion baseline. The canary scorecard then gates promotion on regression against that baseline window. When containment drifts after rollout, the same dashboard gives you the per-agent before/after. The Insights KPI-alerts panel can notify you when an AI-containment rule breaches a threshold you set on it.

A containment alert exists because the "set it and watch the dashboard" loop does not scale past one or two agents. Alert on containment dropping below the champion week's low-water mark, not on a round number someone picked in a planning document.

Examples on shipped channels

The page reads any conversation the AI handled, across the shipped channels, and the window updates the moment a conversation closes.

Voice. An inbound AI voice agent answers by speech; containment here is the share the agent concluded without a transfer to a queue. The escalation count maps to live-agent transfers.

WhatsApp. A business-messaging agent handles inbound Meta traffic over the session window; the contained share is the conversations that reached a resolved status inside the session or passed the rubric.

SMS. Two-way texting agents resolve on shorter conversations; escalation is the "reply HUMAN" or flagged-keyword handoff to a shared inbox.

Set the window to 24h for a same-day triage reading, to 12m to see whether a seasonal containment dip is recurring, and to custom when you need the exact pre/post-canary range. Mixing channels into one number is fine at the header; the per-agent breakdown is where a channel-specific reading comes from.

Containment versus CSAT-only measurement

CSAT-only measurement was the default before AI agents, because the human handled the conversation either way and the only question left was how it felt. Once the handler is a bot, that flips: the primary question becomes whether the bot handled it at all, which CSAT cannot answer.

CSAT also has a sampling problem: it measures the customers who answered the survey. Contained-and-resolved conversations often skip the survey, so a CSAT-only view systematically underweights the conversations the AI actually won. Containment is counted from every conversation outcome, not a survey sample.

Use both, in order. Containment tells you the agent worked; CSAT, together with the rubric-based QA scorecards feeding the leaderboards, tells you it worked well. The Insights KPI-alerts panel watches both (CSAT, NPS, CES, LLM spend, and AI containment), so a quality drop on a contained conversation triggers an alert the same way a handoff spike does.

Read your own numbers

Open [`/insights/containment`](https://orbit.devotel.io) in the dashboard, set the window to 30 days, and read the per-agent breakdown. If an agent's containment line moved after the last prompt change, the canary workflow is the safe way back. If it has always been low, the IVR-vs-AI decision guide has the structured "keep or route to a human" decision table to rework the flow against.

AI containment rate analytics: the dedicated dashboard and how to read it — Orbit by Devotel