Call flows
A voice call takes one of two paths, decided by the campaign's mode:
- Customer-first (power, predictive): the customer is dialed first and an agent is found once they answer.
- Agent-first (preview, progressive, agent callbacks): the agent is taken and put on the line first, then the customer is dialed.
Customer-first call
Used by power and predictive. The customer is called first, and an agent is found only once the customer answers. To Flex the call looks like an ordinary inbound voice task, so conferencing, hold, transfer and recording all work natively.
Between the customer's "hello" and the agent joining, the customer is on the line with no agent. Even with a free agent this takes about 3.5 s, because Flex in the browser has to accept the task and bridge the call (measured on a live account). What the customer hears if the wait runs longer is described in Hold instead of hang-up.
What matters in this flow
- An ordinary Flex task. The call reaches the agent as a voice task with the lead's campaign, attempt and phone number, plus the lead fields your administrator chose to show. Other personal data stays in the dialer. For reporting the task is marked as an outbound contact initiated by the dialer.
- Routing. Each campaign has its own queue in the Dialer TaskRouter workflow. Agents join it when they are assigned to the campaign.
- Pause and stop. No new calls are placed; calls already in progress are allowed to finish.
Agent-first call
Used by preview, progressive and agent callbacks. The order is reversed: the dialer first reserves the agent and puts them on the line, and only then dials the customer. The agent hears the ringing. The customer talks to a person right after "hello": in the live test the silence was about 330 ms, against about 3.2 s customer-first.
While the customer's phone rings, the agent is on the line listening to ringback. The dialer plays a ringback tone with the Israeli cadence (1 s on, 3 s off) that can be replaced with your own (agentFirst.ringbackUrl). While it rings, the task header shows "Calling the customer…". If nobody answers, the dialer closes the task itself and the agent quietly returns to the pool.
Why. It closes the gap where a customer is lost. Customer-first, while the customer's phone rings, the agent is free as far as TaskRouter knows, and any other voice reservation can take them, even one not yet accepted. In the live test a customer who answered in that situation never got an agent within 90 s. Agent-first holds the agent in TaskRouter from the start.
Cost. The agent listens to ringing. Time spent reaching the customer becomes agent idle time, and every dial costs two calls (the agent leg plus the customer) and two CPS tokens. That is why power and predictive, which by design open more lines than there are agents, never use agent-first.
Agent-first outcomes
| Outcome | When | Lead |
|---|---|---|
agent_unavailable | No reservation within reserveTimeoutSec (15 s), or the agent did not answer or dropped the browser leg before the customer was dialed | ready, attempt not counted |
agent_abandoned | The agent left while the customer's phone was ringing; the customer call is canceled | ready, attempt not counted |
abandoned | The customer answered but the agent had already left the call; the customer hears the end-of-call message | Retry by the abandoned rule |
If the agent does not answer the browser leg, TaskRouter moves them to Offline on its own, because the reservation (10 s) expires before the leg does (agentRingSec = 15 s). If the agent stays Available but the leg failed, the dialer temporarily excludes them from dialing so the same lead does not keep cycling back to the same agent. AMD is always off in agent-first: the agent hears the greeting and can leave a voicemail if needed.
By default a no-contact agent-first task is closed by the dialer; with agentFirst.wrapOnNoContact it stays in wrap-up so the agent can record a disposition.
Hold instead of hang-up
Customer-first, a customer sometimes answers when no agent is free. The dialer does not hang up: someone the centre called itself is better off waiting than being dropped. The "at most 3 % wait" target steers the pacer; it is not a reason to hang up on anyone.
What the customer hears after "hello" when no agent is free:
| Time after "hello" | What the customer hears |
|---|---|
| 0 to about 3.5 s | Normal connect time to a free agent: silence |
plus 2 s (waitGraceSec) | Still silence |
| From about 5.5 s | The hold message (who is calling, and that an agent is about to join), then hold music. Without music the message repeats every 15 s, so there is never dead air |
90 s (maxHoldSec) | "Sorry, we'll call you back", then a callback; no attempt is spent |
"Normal connect time" is the campaign's median: it starts at 3.5 s and is learned from connections where an agent was already free. Until connect time plus grace has passed the line stays silent, because most customers are connected before then, and a message cut off by the agent's "hello" sounds like a glitch.
| Outcome | What happened | What next |
|---|---|---|
human_connect | An agent joined (before or after the threshold) | Conversation, disposition. A late connect counts against the pacer's wait target |
abandoned | The customer hung up while waiting | Retry by the abandoned rule (15 min, up to 2 times by default) |
hold_timeout | The customer waited until maxHoldSec | Campaign callback (source = system) after the abandoned rule's delay; the attempt is not counted |
The hold and end messages (holdMessage, abandonMessage) and the hold music (waitAudioUrl) are set per campaign under Customer audio; see the settings reference.