Skip to main content

Per-digital-queue inbox SLA escalation policies

A digital queue’s SLA is a promise with a consequence attached. The promise lives on the queue: wait no longer than N seconds for an open conversation. The consequence: the moment the queue falls behind that promise, Orbit logs the breach, bells the supervisors you named, and posts the queue escalation webhook your paging tool subscribes to. This page is the map of that system for digital queues — WhatsApp, chat, email, social — the inbox-sided counterpart of the per-queue voice SLA pipeline. Two levels of inbox SLA exist and they answer different questions:
  • Workspace SLA policies (Inbox SLA timers) hang first-response, next-response, and resolution clocks on individual conversations and fire breach tiers as each clock crosses a percentage of its target. They answer: this conversation waited too long.
  • Per-digital-queue escalation policies (this page) watch the queue as a whole: how many open conversations in it already breached, and how old the oldest still-open conversation is. They answer: this queue is stalling — page someone now.
Resolution order is simple: the per-queue policy governs the queue it is attached to; workspace policies govern conversation clocks. Neither overrides the other — a queue can run a workspace policy for its conversation timers and this queue-level policy for its backlog at the same time. A digital queue with no escalation policy behaves exactly as before: it queues conversations, and nothing alerts.

The per-queue policy shape

The policy is stored per queue and resolves against the queue’s own SLA target — the same target the supervisor wallboard and queue stats render. Four gates and two routes: The route is chosen between the single-shot action and the escalation ladder:
  • breachAction — the one-shot response when no ladder is configured: notify_supervisors (org admins see a bell/email notification), page_supervisor (the outbound tenant webhook your paging tool subscribes to), both, or none (record-only — the breach event is still logged).
  • escalationSteps[] — the ladder, up to 20 rungs. Once any rung exists the ladder wins and the single-shot action is ignored — the same supersession rule the voice ladder and the workspace SLA tiers use. Rungs at delayMinutesAfterBreach: 0 fire the instant the scan records a breach; delayed rungs are fired afterward by the scheduled executor while the queue still hasn’t recovered. Step actions reuse the workspace breach-action vocabulary — notify, reassign, slack_alert, slack_webhook, teams_webhook, webhook, none — so a supervisor who already runs conversation-level SLA tiers is composing the same building blocks against a queue clock.
Every policy write is audit-logged, and managing policies requires an owner or admin role. Unlike voice, this surface only alerts: the queue’s own overflow configuration still owns routing, and no conversation moves because a breach fired — the alert tells humans, the alerted humans act.

Scan and events API

Digital messaging has no per-call aggregation to server-side, so the queue-scan model runs on a caller-measured snapshot: your monitoring loop reads the queue’s live counters and posts them at POST /api/v1/inbox/digital-queues/{queueId}/sla-escalation/scan; the server resolves the stored policy for that queue and evaluates the snapshot against it. An unknown queue or a queue with no policy returns a no-op verdict rather than an error.
On a breach with a clear cooldown the scan appends the breach to the queue’s event log and fans out to the policy’s surfaces: the org-admin bell/email notification, and the outbound conversation.queue_sla_escalation tenant webhook. The response says what actually happened — breached, event_logged, cooldown_active, and the alert_fired list — so a caller driving the scan can distinguish “breached and paged” from “breached but inside cooldown” without re-reading the log. The event log is the audit half:
GET .../sla-escalation/events returns the newest-first log (up to 200 entries retained per queue, 100 per request): the queue’s SLA seconds in force, the breached-conversation count and oldest wait at the time, the effective route (escalation_ladder or the single action verb), and the surfaces that actually fired. That last field records what the ladder did, not what it was configured to do — the same audit discipline as the voice breach log. Subscribe to the same breach stream outbound through the conversation.queue_sla_escalation tenant webhook described in the webhook event reference.

Configure the policy from the dashboard

The same endpoints back the policy editor under Inbox → Settings → Digital queues → ‹queue› → SLA escalation policy. The dialog exposes exactly what the API stores:
  1. Enable the policy and set the gates. The master switch, the breached-conversation severity floor, the oldest-wait buffer in seconds, and the cooldown. The wait gate is always “the queue’s own SLA seconds plus this buffer,” so edit the queue’s SLA target in the queue form and use the buffer here only to raise the gate — never to lower it.
  2. Pick the single action, or add rungs to the ladder. The breach-action dropdown carries the four one-shot verbs; Add step opens a ladder rung with its action, optional config (webhook URL, supervisor user ids), and delay in minutes. The dialog states the supersession rule inline: when any rung exists, the ladder takes over from the single-shot action.
  3. Read the breach history in place. The same dialog’s events table renders the newest-first log — timestamp, live counters, effective action, surfaces fired — so a policy change and its evidence sit on one screen.
A queue with no policy opens in the disabled shape; clearing the policy (the API’s DELETE, or disabling and saving) returns the queue to record-only silence.

End to end: a WhatsApp support queue

The WhatsApp support queue, doing the work: a 120-second queue SLA, a severity floor of two breached conversations, a 5-minute cooldown, and a two-rung ladder — notify the shift lead immediately, then page the senior team if nothing recovers.
  1. Steady state. The queue answers inside 120s. Your monitoring tick posts breachedConversations: 0, oldestWaitSeconds: 45 — no breach, a no-op, nothing logged.
  2. The surge starts. A campaign lands and four conversations stack up; the oldest is 260 seconds old. The next scan posts breachedConversations: 4, oldestWaitSeconds: 260 — the wait gate (120 + 60 = 180s) trips and the severity floor (2) is met. The cooldown is clear, so the scan appends the breach, bells the shift lead (rung 1, delay 0), and posts the conversation.queue_sla_escalation webhook with the snapshot numbers. The event log records escalation_ladder as the route and ["bell", "webhook"] as the surfaces fired.
  3. The repeat tick does nothing. Your loop scans again a minute later — same breach, but cooldown_active: true comes back and no second page goes out. One breach pages once.
  4. Nobody fixes it for 15 minutes. The backlog is still deep, so the scheduled executor fires rung 2: the senior team’s paging endpoint receives the escalation webhook, and a supervisor reassigns two agents onto the queue.
  5. Recovery. The wait collapses back under the gate; the scans turn to no-ops again. The breach log holds the full record for the QA review — observed counters, the route, and exactly which surfaces fired.

See also

  • Inbox SLA timers — the workspace SLA engine: conversation-level first-response and resolution clocks, breach tiers, and acknowledgement.
  • Per-queue SLA breach alerting and escalation policies (voice) — the voice sibling; the two pages share the action vocabulary and the ladder-wins rule, and differ in windows (voice evaluates percentage-over-window call aggregates; digital queues evaluate single-sample backlog gates).
  • List digital ACD queues — queue CRUD and live queue stats the scan snapshot draws from.
  • Webhook events — the conversation.queue_sla_escalation outbound webhook payload your paging tool consumes.