transfer_cancelled means the transfer did not connect. The agent stays on the line and tells the caller the transfer failed, so the call continues.
When it fires#
After transfer_started, when:
- The destination did not answer, was busy, or rejected the transfer. The driver's reason is passed through.
- The transfer raised an error, for example a SIP failure. The reason starts with
error:. - The driver reported failure without a reason. The reason is
failed.
Phone calls only.
Which settings enable it#
- Off by default. Add
transfer_cancelledto the agent'swebhook_events. - URL: the agent's
webhook_url, else the workspace URL (no{{variable}}substitution). - Timeout: the workspace timeout, else 10 s.
Payload#
{
"event": "transfer_cancelled",
"call": {
"call_id": "call_8c2e5a1f7b3d9e0c4a6f2b18",
"call_type": "phone_call",
"agent_id": "agent_5b0e2c7d9a1f4e3b8c6d2a10",
"agent_version": 2,
"agent_name": "Bondi Dental Front Desk",
"call_status": "ongoing",
"direction": "inbound",
"from_number": "+61412345678",
"to_number": "+61291234567",
"metadata": {},
"retell_llm_dynamic_variables": { "business_name": "Bondi Dental" },
"collected_dynamic_variables": {},
"start_timestamp": 1760675400120,
"end_timestamp": null,
"duration_ms": null,
"transcript": "Agent: Hi, thanks for calling Bondi Dental, this is Ava. How can I help you today?\nUser: I need to talk to the dentist about my bill.\nAgent: Sure, I'll put you through to our practice manager now.",
"transcript_object": [
{ "role": "agent", "content": "Hi, thanks for calling Bondi Dental, this is Ava. How can I help you today?", "words": [] },
{ "role": "user", "content": "I need to talk to the dentist about my bill.", "words": [] },
{ "role": "agent", "content": "Sure, I'll put you through to our practice manager now.", "words": [] }
],
"transcript_with_tool_calls": [
{ "role": "agent", "content": "Hi, thanks for calling Bondi Dental, this is Ava. How can I help you today?", "ts": 1760675400340 },
{ "role": "user", "content": "I need to talk to the dentist about my bill.", "ts": 1760675405910 },
{ "role": "tool_call_invocation", "tool_call_id": "call_tool_01", "name": "transfer_to_manager", "arguments": "{}", "ts": 1760675406650 },
{ "role": "agent", "content": "Sure, I'll put you through to our practice manager now.", "ts": 1760675406700 },
{ "role": "transfer", "event": "transfer_started", "destination": "+61298765432", "ts": 1760675409210 },
{ "role": "transfer", "event": "transfer_cancelled", "destination": "+61298765432", "reason": "no_answer", "ts": 1760675439400 }
],
"recording_url": null,
"recording_multi_channel_url": null,
"public_log_url": "https://api.tried.com.au/public/calls/call_8c2e5a1f7b3d9e0c4a6f2b18/log?exp=1761280239500&sig=2a5d8c1f4b7e0a3d6c9f2b5e8a1d4c7f0b3e6a9d2c5f8b1e4a7d0c3f6b9e2a5d",
"knowledge_base_retrieved_contents_url": "https://api.tried.com.au/public/calls/call_8c2e5a1f7b3d9e0c4a6f2b18/kb-retrievals?exp=1761280239500&sig=7d0c3f6b9e2a5d8c1f4b7e0a3d6c9f2b5e8a1d4c7f0b3e6a9d2c5f8b1e4a7d0c",
"transfer_destination": "+61298765432",
"llm_token_usage": { "values": [1650, 1720], "average": 1685, "num_requests": 2 },
"disconnection_reason": null,
"call_analysis": null,
"latency": {
"e2e": { "p50": 702, "p90": 702, "p95": 702, "p99": 702, "max": 702, "min": 688, "num": 2, "values": [688, 702] }
},
"call_cost": null,
"batch_call_id": null,
"contact_id": "contact_6e2a9c1f4b7d0e3a5c8f1b24"
},
"transfer": {
"destination": "+61298765432",
"reason": "no_answer",
"timestamp": 1760675439400
}
}Fields#
| Field | Type | Description |
|---|---|---|
transfer.destination |
string | The number or SIP URI that was dialled |
transfer.reason |
string | Why it failed: the transfer driver's reason, error: <message> (up to 200 characters) for exceptions, or failed |
transfer.timestamp |
integer | When the failure was recorded, Unix ms |
call.transfer_destination stays set to the attempted destination even though the transfer failed. Check for a transfer_bridged entry in transcript_with_tool_calls to know whether a call was really transferred.
The exact reason strings for unanswered or rejected transfers depend on the transfer driver and carrier. Log them rather than matching on fixed values.
Alerting on failed transfers#
The transfer_call_failure_count alert metric counts these failures. Create an alert rule on it in Alerting to get alert_triggered when transfers start failing.
How to respond#
Reply 2xx. The body is ignored. Retries: up to 3 (1 s, 2 s, 4 s).
Typical use: create a callback task for the person who was meant to answer.