Inbox dispositions — outcome labels on closed conversations
A disposition is the recorded outcome of a conversation — “Resolved”, “Refund issued”, “Escalated to billing”. Dispositions are the labels agents pick (or the AI judge assigns) when a conversation closes, and the axis the Distribution view, your reports, and conversation-intelligence operators query against. Dashboard: Inbox → Settings → Dispositions (owner / admin only — the label-set editor is a tenant-owned control). Base path:/api/v1/inbox/dispositions
1. Disposition sets vs. voice disposition tags
Three surfaces nearby answer different questions; make sure you are on the right one:- Inbox disposition sets (this page) — the outcome label taxonomy for digital queue conversations: chat, email, social messaging, SMS-style inbound threads. A set is one list of up to 50 labels scoped to a conversation type (
inbox,voice, orany), and one set per type can be marked the default. A conversation carries one label from one set. - Voice disposition tags (Define and use disposition tags) — the per-call outcome tags voice agents stamp during wrap-up on voice queues, where a call can carry several overlapping tags at once. That is a separate catalog living under Voice → Disposition Tags; do not land it here.
- Wrap-up codes enforced by a queue — the per-queue required-code gate on voice ACD queues. Disposition lifecycle rules below enforce the state transitions a disposed conversation may take; wrap-up codes gate agent availability. Different axis, different console.
2. Walkthrough — create and edit label sets
Disposition sets are created and edited at Inbox → Settings → Dispositions → Label sets (the first tab). Each set is a named list of labels agents and the AI judge pick from when a conversation closes.- Click Create disposition set.
- Name the set — e.g. “Support outcomes”, “Sales call results”.
- Pick the conversation type the set applies to:
inbox,voice, orany. The type is immutable once the set is created; a set that should apply to both digital and voice channels usesany. - Add label rows. Each label has a display text (what agents see in the close picker), a slug id (
resolved,refund-requested), an optional color, and an optional description. The slug auto-fills from the display text until you hand-edit the id, and must be unique within the set. The description is the guidance the AI judge reads when deciding which label fits a closed thread — “When the AI judge should pick this label”, not just a note for humans. - Toggle Default for this type if this set should be the one applied automatically when a conversation of that type closes.
422s): set name up to 128 chars, up to 50 labels per set, label id must be a lowercase slug (a–z 0–9 _ -), label text up to 128 chars, description up to 500 chars, and a tenant cap of 20 sets. Click Create set.
Edit an existing set from its row’s pencil icon. The conversation type is locked there (the PATCH contract omits it by design, so relabeling rows cannot turn a voice set into an inbox one). Setting a new default demotes the prior default for the same conversation type — the trial closing pipeline always uses exactly one default per type.
3. Distribution view — read the outcome split
The second tab, Distribution, aggregates the last 30 days of disposed conversations into a per-label breakdown. Filter it to one set or view All sets. Four summary tiles sit above the bars:- Total disposed — closed conversations carrying a label in the window.
- AI auto — labels the AI judge assigned at close time, no human edit.
- Agent manual — labels an agent stamped at close, after one of the above passes or the AI lane was skipped.
- Override rate — the fraction of AI-auto labels an agent later corrected. A rising override rate means the AI judge’s label descriptions are vague or the taxonomy’s labels overlap; tighten the label guidance until auto stays where agents agree it should.
/inbox/dispositions/stats) with an explicit from / to.
4. AI-assigned dispositions — which role applies them
At close time two paths stamp a disposition:- Agent manual — the agent picks a label from the applicable set in the close dialog before the thread moves out of open. If a set that applies to the conversation’s type has a default marked, agents see only that set’s labels.
- AI auto — when the agent closes without stamping, the AI judge reads the thread transcript and assigns a label plus a confidence score, using the label descriptions in your set as guidance. It fires on every closed conversation for which a default taxonomy is configured; if no default set exists, the AI lane skips silently. Re-open then re-close replaces the prior assignment. The judge never blocks the close path — a judge failure logs and skips rather than stalls the agent.
5. How dispositions feed reports and conversation intelligence
Dispositions are the outcome axis several tenant surfaces slice on:- Reports — the Distribution tab itself, plus any saved report that groups by disposition label; auto-closed volume is split from agent-driven closes by
closed_reason, so disposition mix stays meaningful even with the auto-close sweep enabled. - Conversation-intelligence operators — an operator scoped to a conversation can filter or group by the disposition a thread carries once closed (Conversation intelligence operators covers operator setup). Dispositions are the typed outcome the operators report against when you ask “which intents resolve on first touch?” or “which escalations land in refund-requested?”
- Ticket automation + routing rules — both match on the stamped outcome, so a rule can route
escalated-closed conversations to a senior queue or open a follow-up task when the AI judge landsunresolvedwith low confidence.
6. Lifecycle rules — which transitions a disposed conversation may take
The third tab, Lifecycle rules, defines the allowed transitions a disposed conversation may take between the three work-item states (open → pending → resolved).
- Empty ruleset = built-in defaults apply — open ↔ pending, open → resolved, pending → resolved — and
resolvedcloses the work item. - Your first rule replaces the defaults wholesale. Adding one custom edge turns off all four built-in edges; define every transition your workflow needs, including the ones the defaults covered, or agents will find paths they relied on blocked.
- Terminal rules — a rule pointed into
resolvedis final and can carry two controls: an aging window (within_hours, so the move is rejected once the current state has lasted longer) and the closes work item flag the close-enforcement gate honors. Neither control exists on non-terminal edges; the form disables them rather than return a422. - Caps and duplicates — up to 9 rules per tenant, and a duplicate edge (
open → resolvedtwice) is refused inline before it can reach the API. Deleting back to zero rules reverts the tenant to the built-in defaults.
resolved is terminal — no rule can route out of it — so a lifecycle setup closes each conversation at exactly one state.
7. Merge rules — which thread’s dispositions survive
When two threads about the same contact collide,POST /api/v1/conversations/:id/merge folds the secondary rows into the primary. For dispositions:
- The primary conversation’s dispositions survive. The merged (source) rows are archived with
metadata.merged_intopointing at the primary; their disposition history does not transfer onto the surviving thread’s close-time record. - Tags and dispositions attached before merge stay attached on whatever row they were stamped on — a merged thread’s Distribution slice reads the surviving conversation only, so a label you need to persist must be stamped on the primary (the one you keep).
- Re-stamp after merge if the surviving thread needs a label the archived source had: the label is per conversation, not per contact, and does not follow the merge.
8. API parity
Everything the console does is available via the inbox API, so tenant automation and the dashboard stay in lock:- List sets —
GET /api/v1/inbox/dispositions/taxonomiesreturns the tenant’s sets default-first; a tenant whose tables are not yet provisioned gets an empty list rather than an error. - Create / edit sets —
POST /api/v1/inbox/dispositions/taxonomies(owner/admin, 422 on bounds) andPATCH /api/v1/inbox/dispositions/taxonomies/{taxonomyId}(rename, relabel, set default — the PATCH omitsconversation_typeby design). - Read distribution —
GET /api/v1/inbox/dispositions/statswith optionalfrom/to/taxonomy_id; returns the per-label split plus the AI-auto / agent-manual / override-rate summary. - Lifecycle rules —
GET /api/v1/inbox/dispositions/lifecycle/rules+POST/DELETEfor rule CRUD; the ruleset is what the close-enforcement gate consults.
See also
- Inbox settings map — where this console sits among the other operator consoles.
- Define and use voice disposition tags — the separate voice-catalog surface.
- Conversation merge troubleshooting — the confirmation gates and undo path for folding threads.