Overflow & Exit Destinations
A queue can’t hold a caller forever, and sometimes shouldn’t admit them at all. Exit destinations define where a call goes instead of bridging to an agent. SIP.IO models five queue exits in two phases, plus a single ring-group exit, each a normal route target:
- At enqueue (before the caller ever waits):
queue_fullandewt. - While waiting (runtime outcomes):
timeout,abandon, andno_agents.
In-queue exits
Section titled “In-queue exits”These fire while a caller is already holding:
{ "id": "q_01j160r23gw5zkpfjme3fwzs5k", "name": "Support", "max_wait_sec": 600, "timeout_dest_kind": "voicemail", "timeout_dest_id": "vm_01jg8asp59ps9rtt7azhrhvcre", "abandon_dest_kind": "flow", "abandon_dest_id": "flow_01jzqag8s7k8tan2475cshesh4", "no_agents_dest_kind": "flow", "no_agents_dest_id": "flow_01jzqbs3hn9rb3sp06ypecjn0t"}| Exit | Fires when | Typical destination |
|---|---|---|
timeout | The caller waited longer than max_wait_sec. | Voicemail, a callback offer, or another queue. |
abandon | The caller hung up while waiting. | A flow that triggers a callback or logs the abandon. |
no_agents | There is no viable agent at all (none registered + logged in). | An after-hours flow, an overflow queue, or voicemail. |
Each exit is a *_dest_kind / *_dest_id pair: point it at a voicemail, flow, queue, user, forward, or hangup.
Deflect at enqueue: queue_full and ewt
Section titled “Deflect at enqueue: queue_full and ewt”The best overflow is the one that never makes the caller wait. These two exits are evaluated the moment a caller would join; if they fire, the caller is deflected before holding at all.
{ "max_queued": 25, "queue_full_dest_kind": "voicemail", "queue_full_dest_id": "vm_01jg8asp59ps9rtt7azhrhvcre", "ewt_threshold_sec": 180, "ewt_aht_sec": 240, "ewt_dest_kind": "forward", "ewt_dest_id": "fwd_01j3nnnyejaj858ffg9t764m43"}| Exit | Fires when | Config |
|---|---|---|
queue_full | Callers already waiting ≥ max_queued. | max_queued (NULL = unlimited). |
ewt | The new caller’s estimated wait would exceed ewt_threshold_sec. | ewt_threshold_sec + ewt_aht_sec (handle-time estimate, default 180). |
Estimated wait time is computed at the moment of joining:
ahead = max(0, waiting + 1 − ready_agents)EWT = ahead × ewt_aht_sec / viable_agents (seconds)Idle (ready) agents collapse ahead toward zero, so a queue with spare capacity reports an EWT near 0 and admits normally; a deep queue with few agents trips the ewt exit and deflects to, say, a callback or voicemail. Both checks fail open: a transient read error admits the caller rather than wrongly turning them away.
”No viable agent” vs. “all agents busy”
Section titled “”No viable agent” vs. “all agents busy””The distinction between timeout and no_agents is what makes the routing feel intelligent:
- All agents busy: members exist and are reachable, just occupied. The caller waits, and if nobody frees up in time, exits via
timeout. - No viable agent: no member is reachable and logged in. There’s no point waiting out the full
max_wait_secfor help that can’t come, so the caller overflows immediately viano_agents.
Viability is “any member reachable and not offline”: a busy or paused agent still counts (they’ll be free soon), but an empty or fully-logged-out queue does not. See Queues & ACD.
caller would enqueue │ ── evaluated at join ── ├─ queue already at max_queued? ──▶ queue_full_dest (deflect, no wait) ├─ estimated wait > threshold? ──▶ ewt_dest (deflect, no wait) │ ── now holding ── ├─ no viable agent at all? ──▶ no_agents_dest (immediately) ├─ caller hangs up while waiting ──▶ abandon_dest └─ waited past max_wait_sec ──▶ timeout_destRing-group exit
Section titled “Ring-group exit”A ring group has a single exit_dest_* that fires when the ring times out with no answer.
Chaining exits automatically
Section titled “Chaining exits automatically”When a number points directly at a queue or ring group, the platform synthesizes a flow and chains the configured exits into it, so “DID → queue, on timeout → voicemail” becomes a real multi-node graph with no flow-building required. Read how synthesis works.
Business hours are a separate gate
Section titled “Business hours are a separate gate”Exit destinations handle runtime outcomes (waited, abandoned, nobody home). Being closed is handled earlier by business hours attached to the queue: a closed/holiday schedule overrides the route into the queue before the caller is ever enqueued. Use business hours for “we’re closed”; use no_agents for “we’re open but nobody’s logged in right now.”
Recommended pattern
Section titled “Recommended pattern”A robust support queue usually wires all three:
no_agents→ an after-hours/overflow flow or voicemail (nobody’s available),timeout→ voicemail or a callback offer (waited too long),abandon→ a flow that captures the number for a callback (they gave up),
plus a business-hours schedule on the queue for the closed/holiday case.