Skip to main content

Conversation Intelligence

Conversation Intelligence answers one question: how are your customers’ conversations trending, and where is sentiment drifting? Open Insights → Conversations in the Orbit console to see every conversation your AI agents and human teams handle across SMS, WhatsApp, email, and voice rolled up into one panel — sentiment distribution, channel mix, recent threads, and a per-agent leaderboard. It is the aggregate counterpart to the per-thread views: read it first, then drill into it. Three adjacent surfaces answer different questions — the Picking the right surface section below settles which one to reach for.

What the panel computes

The panel reads one analytics payload — GET /api/v1/stats/conversation-intelligence — and renders six sections from it:
  • KPI strip. Total conversations, average messages per conversation, resolution rate, solution rate, average duration, and quality score (with a period-over-period delta when the backend has a scored prior window). Read resolution and solution side by side: resolution counts conversations marked complete (gameable — an agent that auto-closes threads drives it to 100%); solution counts only threads where the customer confirmed resolution or the workflow closed with positive sentiment. When they diverge, trust solution.
  • Conversation volume area chart. Daily conversation count over the selected window — pick 24h for incident triage, 7d/30d (default)/90d/12m for trend work, or a custom calendar range.
  • Sentiment distribution donut. The sentiment_distribution aggregate — how many conversations in the window the AI analyzer classified as positive, neutral, or negative. Coverage notes below.
  • Channel breakdown bar chart. The channelBreakdown aggregate — how many conversations each channel (SMS, WhatsApp, email, voice) contributed to the window.
  • Recent conversations table. The recent_conversations list — the latest threads across all agents and channels, each carrying the agent name, channel, status, and (when the analyzer has classified it) sentiment. Default-capped to the most recent 25 with a View all expander.
  • Agent leaderboard. Agents ranked by conversation volume, resolution rate, average handle time, CSAT proxy, and average token spend — the drill-in for “which agent is generating this sentiment.”
Below the sentiment donut, an escalation rate badge flags the fraction of conversations the AI analyzer marked negative; past 20% it renders as an error badge instead of an outlined one. Sentiment is computed from conversation text — the text channels (SMS, WhatsApp, email, web chat) always contribute. Voice conversations contribute only when voice transcription is enabled for your tenant; without transcription enablement the voice channel has no text to classify, so the sentiment widget undercounts the true voice share. The channel-mix chart still reports voice volume — the caveat is only about sentiment coverage. Platform-managed defaults set the transcription flag; see the voice transcription guide for how to enable it.

Reading the sentiment donut

The donut splits the window’s sentiment distribution into three segments: Positive (green), Neutral (slate), and Negative (red). Each legend entry pairs its color swatch with a non-colour glyph — triangle-up for positive, square for neutral, triangle-down for negative — because a color-only legend collapses Positive and Negative into the same shape for red/green colour-blind readers on your team. If you only export the summary CSV, the same three counts land in the Sentiment distribution section of the file so a screen-reader workflow loses nothing. Hover a segment to see its exact count (formatted compact — 1.2K, 4.5M) rather than the donut percentage; count is the number that survives an export.

Channel breakdown

The channel chart next to the donut shows what fraction of the window’s conversations came in over SMS, WhatsApp, email, and voice. Use it as the mix check before you act on the sentiment donut: if WhatsApp is 80% of your volume, a sentiment dip is a WhatsApp problem, not a portfolio problem. Consecutive bars share the chart palette, so the chart is categorical — read it as “how much each channel contributes,” not “how good each channel is.” The single-channel bar labels capitalize (the chart’s Y-axis formatter uppercases the first letter), so sms renders as Sms in narrow panels — channel names come from the same casing the API returns.

Recent conversations — back to the per-thread view

Aggregate widgets answer the where; the Recent Conversations table answers the which thread. Each row carries the agent name, its channel badge, the conversation status pill, and a sentiment badge when the AI analyzer has classified the thread — newest first. Use it to jump from “negative sentiment spiked this week” to the actual conversations driving it. From a row you can continue into the per-turn debug view or the unified interaction list, but for most operators the next step is simply opening the agent whose rows keep showing up. View all conversations expands past the default 25-row cap; the same cap applies to the agent leaderboard above it.

Worked example: the week-over-week sentiment dip

You are a support lead. Monday’s roll-up shows a Negative ▼ slice that doubled, from 4% to 9% of the 7d window.
  1. Check the channel mix. The channel bar shows WhatsApp still dominates; nothing about the mix changed — so the dip is not a channel migration.
  2. Scan the agent leaderboard. One agent — Order Status Bot — moved from 92% to 61% resolution. That is where the negative rows concentrate.
  3. Open Recent Conversations and filter visually. The rows tagged Order Status Bot carry red Negative badges; expanding to all rows confirms the cluster is on this one agent, not spread across the fleet.
  4. Drill into the agent. Click the agent name in the leaderboard to open its detail page; the agent conversation debug guide walks the per-turn view from there.
  5. Export a snapshot if you need an offline record. The Export CSV button emits a self-describing file (range header, summary KPIs, sentiment counts, per-channel counts) so the delta you found survives attaching to a ticket.
Conversely, if the leaderboard had stayed flat while Negative rose, the question would shift from “which agent” to “which topic” — that flips you to the Topic Intelligence surface below.

Picking the right surface

Three surfaces cover adjacent ground; the pick-order is:
  • Conversation Intelligence (this page). Aggregate sentiment, channel mix, and agent ranking across every channel — “how are conversations trending, and which agent is driving the trend.”
  • Interaction Search. A filterable, recency-ordered list over every message conversation and every voice call — “find and audit individual threads.” Reach for it when you need a specific thread, not a trend.
  • Topic Intelligence. Aggregated contact reasons — “what customers contact us about and is it rising.” Reach for it when sentiment is fine but the inbound mix is shifting.
If you want per-turn agent behavior, drill via the leaderboard into the agent conversation debug view; this panel stays aggregate on purpose.

API contract

GET /api/v1/stats/conversation-intelligence returns the payload the panel renders. Accepts the trailing-window query param ?days= (integer, 1–365, default 30). The response is the standard { data, meta } envelope, with data carrying aggregates, sentiment_distribution, channel_breakdown, agent_leaderboard, time_series (volume), recent_conversations, plus top_topics, surging_topics, escalation_rate, and avg_quality_score. A fresh tenant receives a handled 200 with zeroed aggregates, so the read is safe to poll on every warehouse sync tick. Both dashboard sessions and API keys with the analytics:read scope reach it — use the key form when you wire the read into a warehouse.

Response envelope — a realistic window

A 200 for a tenant with traffic on SMS, WhatsApp, and voice (voice sentiment requires voice transcription enabled — text channels always contribute). Field types match the typed SDK read above:
Read resolution_rate and solution_rate together: resolution_rate counts conversations marked complete — a status an auto-closing agent can flip — while solution_rate counts only customer-confirmed resolutions and workflow closes with positive sentiment. When the two diverge, weight solution_rate. recent_conversations omits sentiment and quality_score on threads the AI analyzer has not classified yet.

Fresh tenants — zeroed aggregate 200, never an error

A tenant with no conversations in the window gets the same 200 shape with zeroed aggregates and empty lists — never a 404 or a 500. Poll from day one and the numbers fill in as traffic arrives:

Errors

Valid key, but a warehouse key minted without analytics:read — 403:
Missing or invalid key — 401:

Field reference

See also