Routingenqueuebeta

Send to queue

Puts the caller in a call queue. Every setting you leave blank uses the queue's own setting (Settings → Queues). Hold experience: "Queue" holds the caller…

What it does

Puts the caller in a call queue. Every field you leave blank uses the queue's own setting (Settings › Queues owns max wait, the then-go-to overflow destination, per-agent ring time, hold music + announcements, and default priority) — this node only overrides what you set explicitly.

Hold experience picks one of two shapes:

  • Queue (default): the node holds the caller right here — the queue's hold music, and "You are caller number 3." announcements if the queue has them on — until an agent answers or the max wait passes, then routes to Then go to. Nothing wired after this node ever runs in this mode: the caller either bridges to an agent or leaves through Then go to.
  • Custom: the node enqueues the caller and continues immediately to next, so your flow's own nodes play (a Say, a Play music loop, a Gather menu). An agent answering bridges the caller from wherever they are in that chain.

Leave queueId blank and set Dynamic queue (queueTemplate) to route by a template resolved at call time — a skill, a language, a digit the caller pressed. A ring group is just a queue whose strategy is ring_group: no waiting line, ringback instead of hold music, no position announcements.

When to use it

  • Drop a caller straight into a queue with its own hold experience and overflow — leave every field blank and let the queue's own settings do the work (Queue mode)
  • Build a custom hold experience — your own hold music, a "press 2 to leave a voicemail" menu, periodic status updates — while the caller stays enqueued in the background (Custom mode)
  • Route dynamically by skill or language: leave queueId blank and set queueTemplate to {{vars.skill}} or similar
  • Override just one thing for this flow (a shorter max wait for a VIP path, a different then-go-to) without touching the queue's own settings
  • Ring a whole team at once with no waiting line, via a ring_group queue

Configuration

Puts the caller in a call queue. Every setting you leave blank uses the queue's own setting (Settings → Queues). Hold experience: "Queue" holds the caller right here with the queue's music and announcements until an agent answers or the max wait passes, then sends them to the queue's "then go to" destination — nothing after this node runs. "Custom" puts the caller in the queue and continues at once to the next node, so your own audio plays; an agent answering bridges the caller from wherever they are. SKILL-BASED ROUTING: leave the queue blank and set "Dynamic queue" to a template that resolves to a queue at call time.

FieldLabelTypeRequiredDefaultNotes
queueIdQueuecallQueueOptional""The call queue (ring groups included). Leave blank only when routing dynamically with "Dynamic queue" below.
queueTemplateDynamic queue (advanced)textOptional{{vars.skill}}A template that resolves to a queue id or name at call time (e.g. {{vars.skill}} or {{vars.gatheredDigits}}_queue). Overrides the queue above when set. A queue matched by NAME stops matching if the queue is renamed.
holdExperienceHold experienceselectOptionalqueueOptions: queue, custom.
maxWaitSecsMax wait (seconds)numberOptional0How long the caller waits before "then go to". Blank = the queue's. In Custom mode, 0 means no limit (your flow decides).
thenGoToThen go toroutingTargetOptional—Where the caller goes when the max wait passes. Blank = the queue's.
ringSecsRing each agent for (seconds)numberOptional0Per-agent ring time. Blank = the queue's.
holdMusicHold musicaudioOptional—A music track from the Prompts & music library. Queue hold experience only. Blank = the queue's music (a ring group rings back).
announcePositionAnnounce positionselectOptionalinheritOptions: inherit, on, off. Queue hold experience only.
priorityCaller prioritynumberOptional0Higher is answered first when callers compete for the same agent; ties go to whoever has waited longest. Blank = the queue's default priority.

Outgoing events: next, call.hangup

Examples

Queue mode, everything from the queue's own settings

The simplest form: no overrides. The caller hears the queue's hold music (and announcements, if the queue has them on) until an agent answers or the queue's own max wait passes, then leaves via the queue's own then-go-to.

{
  "id": "support-queue",
  "type": "enqueue",
  "config": { "queueId": "{{config.queueId}}" }
}

Queue mode with a VIP override

Same queue, but VIP callers get a shorter wait and skip straight to the on-call manager instead of the queue's usual overflow.

{
  "id": "vip-queue",
  "type": "enqueue",
  "config": {
    "queueId": "{{config.queueId}}",
    "maxWaitSecs": "90",
    "thenGoTo": { "kind": "extension", "id": "{{config.managerExtensionId}}" },
    "priority": "10"
  }
}

Custom mode: your own hold experience, no limit

holdExperience: "custom" continues at once to next; maxWaitSecs: "0" means no limit in Custom mode — the flow decides when to give up (here, the wait node's own timeout).

[
  {
    "id": "sales-queue",
    "type": "enqueue",
    "config": { "queueId": "{{config.queueId}}", "holdExperience": "custom", "maxWaitSecs": "0" },
    "on": { "next": "hold-loop" }
  },
  {
    "id": "hold-loop",
    "type": "playMusic",
    "config": { "music": "{{config.holdMusic}}", "playSecs": 30 },
    "on": { "call.playback.ended": "max-wait", "call.hangup": "end" }
  },
  {
    "id": "max-wait",
    "type": "wait",
    "config": { "durationSecs": 600 },
    "on": { "wait.elapsed": "voicemail", "call.bridged": "end", "call.hangup": "end" }
  }
]

Skill-based routing with a dynamic queue

No queueId — the queue is resolved from a variable stamped earlier in the flow (a Gather Digits menu, say).

{
  "id": "route-by-skill",
  "type": "enqueue",
  "config": { "queueTemplate": "{{vars.skill}}_queue" }
}

Gotchas

  • holdMusic and announcePosition apply in Queue mode only. In Custom mode the node doesn't play anything itself — your downstream nodes own the audio, so those two fields are ignored there.
  • maxWaitSecs: 0 means "no limit" only in Custom mode, where the flow is expected to own timing (via a wait node or similar). In Queue mode the field is the actual max wait; leave it blank to use the queue's.
  • A queueTemplate that resolves to a queue NAME breaks if that queue is renamed. Prefer letting it resolve to a queue id when you can; a name match is a convenience for skill-routing setups where the id isn't handy.
  • There's no call.bridged handle on this node. An answer either ends the node's Queue-mode hold (silently, from the caller's point of view — they're just bridged) or interrupts whichever downstream node is current in Custom mode. Don't wire a call.bridged edge here expecting it to fire.
  • next never fires in Queue mode. If you wire it, it's simply never taken — Queue mode's only ways out are a bridge or Then go to.
  • A ring group is a queue, not a separate node. Set the queue's strategy to ring_group (Settings › Queues) — this node has no ring-group mode of its own.
  • This node is status: beta. The shape above is final (docs/plans/call-routing-build/CONTRACT.md §9.3), but the Queue-mode hold loop and the Custom-mode timer are landing in a later wave — treat flows built against it as not yet runnable until that ships.

See also