Transfer outcome states
Every call transfer reports how it ended. Use these values to track how often transfers connect, drive fallback logic, and debug individual calls.
- Outcome states say whether the transfer connected, and if not, what got in the way.
- Transfer modes decide what happens next: warm transfers can recover, while a cold transfer ends the call.
- Failure reasons name the specific cause, such as a busy line, an IVR menu, or a wrong number.
Where the values appear
The outcome is saved on the transfer action of each call:
- Get a call and List calls return it in
executed_actions, keyed by action name, asreturn_value.statusandreturn_value.failed_reason. - The post-call webhook sends the same
executed_actionsobject. - The action execution timeline records a
failed_reasonfor every failed attempt, so a transfer that retried shows the cause of each try. Itsstatusfield isstarted,success, orfailedrather than an outcome state.
Outcome states
How each transfer mode reacts
Some outcome states depend on features that only warm transfers support, so a cold transfer never produces them.
Cold transfers cannot recover from failures. If reliability is critical, use warm transfers so the agent can fall back on a failed outcome, for example apologize, take a message, try an alternate destination, or schedule a callback.
Failure reasons
Reach for the failure reason when the outcome state on its own is not specific enough, for example to tell an unanswered ring apart from a wrong number. The reasons below are grouped by what caused the failure.
Human detection
These reasons are only set when Human Detection is enabled on a warm transfer.
Busy lines, hang-ups, and declines
Carrier and SIP rejections
The carrier returned a SIP error before the transfer leg connected. All of these report the outcome state transfer-failed-connection-error.
Availability and fallback
Timestamps
A transfer records up to two timestamps, both in ISO 8601 UTC. The gap between them is how long the caller waited between asking for a person and reaching one.
Both appear on the transfer action in the same places as the outcome state.
Legacy values
Some values changed as transfer reporting became more specific. If your reporting or automation groups transfers by outcome state or failure reason, add the current values so these calls are not counted as generic failures.
FAQ
The SIP call ladder shows a successful REFER. Why did the transfer fail?
A 202 Accepted on the REFER only means the other side accepted the request to transfer. The transfer leg can still fail afterwards, and the carrier reports that in a follow-up NOTIFY, for example a 503 that is reported as carrier_unavailable. The outcome state and failed_reason reflect that final result, so trust them over the REFER in the SIP call ladder.
Why does my failed transfer only say transfer_failed?
transfer_failed is the fallback when no more specific cause is known. On transfer-failed-timeout it means the destination rang until the Timeout expired. On transfer-failed-connection-error it means the carrier did not return one of the SIP errors Synthflow recognizes.
Does a successful transfer have a failed_reason?
No. transfer-success carries no failed_reason. The field is only set on failure states.
Why does a transfer in the action execution timeline show failed instead of an outcome state?
The action execution timeline reports one entry per attempt with a simple started, success, or failed status. The failed_reason on each failed attempt uses the same values as this page, and the final outcome state is on the transfer action in executed_actions.
Can new failure reasons appear?
Yes. Synthflow adds reasons as it detects more specific causes. Treat an unrecognized failed_reason as a generic failure for its outcome state so your integration keeps working when a new value ships.