Skip to main content

Call park and the lobby: the slot aliasing model

A call is parked when it is put into one of the tenant’s nine shared slots and left for any operator to claim. This page defines that model — what parked, held, and transferred mean, why slot numbers are the lobby’s public aliases, which consoles render the lobby, and how park interacts with conferences and hand-offs — so the Parked Calls lobby guide stays a thin procedure surface. Read this before you brief a new floor on park-versus-queue-versus-transfer, or wire a client against /api/v1/voice/park. The full step-by-step flows live in the guide; the PARK_… error codes live in the voice call park troubleshooting catalog. Park is a softswitch control-plane operation on an already-answered call leg — no outbound origination. Over the product’s termination paths, origination defaults to the Devotel softswitch and a tenant-configured trunk is allowed; none of that matters here, because park never originates at all.

1. Parked vs held vs transferred

Operators use three verbs loosely; the platform treats them as three distinct models. Choose the model deliberately:
  • Hold keeps the waiting private to the holder. Two colliding retrievals on the same numbered alias become a race; every later attempt is rejected rather than race-resolved.
  • Park publishes the waiting caller to the floor and trades control for reachability — anyone can claim the slot, audit-logged per claim.
  • Transfer addresses exactly one destination. When the destination is not “next free person,” a transfer is the right primitive; when it is, a directed transfer stops retries at the wrong desk.
A held call is not a parked call. Hold never publishes the caller to the lobby, so no teammate can help with it; park exists precisely for that publication.

2. Park-slot aliasing — deterministic names for the lobby

The tenant’s lobby is nine shared slots, numbered 1 through 9 — the same digits a desk phone dials with *N to retrieve. The (slot, occupant) pair is the coordination contract: “Billing is on 4” is a well-defined alias the whole floor resolves identically. The alias is deterministic because anyone can map “slot N” to exactly one occupant at a time, and a park that omits the slot auto-picks the lowest free number in one transaction. Deliberately named slots and auto-picked slots mix freely; 409 PARK_SLOT_OCCUPIED fires only on a named-slot collision and names the occupant, the parked-at time, and the caller, so the operator re-parks elsewhere instead of blind-retrying. Auto-pick is collision-free by construction — it claims a free slot atomically. Three rules keep the aliases honest:
  • Auto-pick is the default. Leave the slot blank and share “lowest free” muscle memory — the digits mean “next free slot,” not “my slot.”
  • Named slots are for deliberate placement. When a receptionist says “Santos on 4,” the number is the message — pick the slot explicitly.
  • Release frees the same alias. The slot is reusable immediately; an occupant’s park_… id is never the public handle — the number is.
The entire role guard (owner / admin / developer / agent) sees the final authority as the tenant’s audit trail; PII-bearing rows make the guard server-side, not cosmetic.

3. Which consoles surface parked calls

Two first-party surfaces render the lobby; both read the same /api/v1/voice/park surface and poll it every ten seconds.
  • Voice → Parked Calls — the dedicated lobby page. Its shell (apps/web/src/app/[locale]/(dashboard)/voice/park/page.tsx mounts the client parked-calls-content.tsx) carries the four park endpoints (list, park, retrieve, release) under one role guard, because parked rows show caller PII. This is the operator-grade surface: rows show the slot alias, the caller’s E.164 number and name, and a live “parked for” counter.
  • Attendant Console — the four-panel operator workspace with the shared lobby as one panel (attendant console guide). Parked rows land here alongside extensions and ring groups, so a receptionist never leaves the workspace to claim a slot.
Beyond the consoles, a desk phone retrieves by number (*N on any registered device) — the lobby’s numeric aliases work outside the browser too. Viewer and observer roles see nothing — the lobby list is gated server-side, not hidden by the UI.

4. How park works with conferences and hand-off

Park is single-leg holding; a conference is multi-leg bridging, and a warm transfer is an announcement step. Each maps to one leg of the floor’s hand-off lifecycle.
  • Into a conference: a warm conference bridge announces the caller to the specialist before joining. A parked call can supply that leg — the retriever hears the party piece before the slot frees. Pure park has no announcement step; warm-transfer tooling composes the two.
  • Out of a conference: a conference leg parked frees the conference to shrink; the lobby keeps the held leg visible while the conference runs. A blind flip out of conference is the call-flip console path for directed hand-offs.
  • Park or transfer? If the next handler is “anyone free,” park; if it is a named person or extension, transfer. The queue alternative is for inbound volume never parked at all (see the guide’s “When NOT to use park” section).

5. Failure modes — recall, expiry, and supervised takeover

The lobby’s failure modes live on the queue’s two tenant limits (mirrored by the expiry update) — plus the supervisor path for bell calls:
  • Recall (recall ringback): after the queue’s recall window (30s default) the parking operator’s softphone rings back via SSE — “your parked call still waits.” Recall is a prompt, not an expire; the slot remains claimed until action or expiry.
  • Expiry (hard cap): after the queue’s max park limit (300s default) the slot auto-releases with releaseReason='timeout'. A hangup webhook against the parked leg clears the slot in milliseconds; the sweeper is the backstop for silent disconnects.
  • Supervised takeover: the supervisor’s live-monitoring console (guide) offers listen/whisper/barge/takeover on live calls; a parked call belongs to the parking claim, not the supervisor — handle lobby reclaim with retrieve/release, and treat barge or takeover as supervision. Audit the claim either way.
Match the failure mode to the discipline the guide prescribes: recall is audible, expiry closes dangling slots, and supervisory takeover is for on-bell calls, not lobby claims. For a fleet-level diagnosis, the troubleshooting catalog maps every PARK_… code to a fix.

See also