> ## Documentation Index
> Fetch the complete documentation index at: https://docs.open.cx/llms.txt
> Use this file to discover all available pages before exploring further.

# Phone call lifecycle and outcomes

> Understand call status, outcome, and disposition; use call completion events without assuming a connected call reached a person or has a final summary.

A phone attempt has a connection lifecycle and a result. Keep these separate from the session's resolved or unresolved status: a connected call does not prove the customer's request was resolved.

<Note>
  Disposition-based follow-ups require **Call → Disposition** in your workflow builder. If it is absent in your workspace, contact support before configuring these recipes. Existing **Outcome** values alone cannot distinguish busy, declined, and voicemail.
</Note>

## Status, outcome, and disposition

| Field | What it describes | Examples |
| - | - | - |
| Call status | The attempt's connection state | Initiating, ringing, in progress, completed, missed, no answer, busy, rejected, failed, canceled. |
| Workflow outcome | The broad way an AI call ended | `completed`, `transferred`, `unanswered`, `failed`. |
| Disposition | The more specific result supported by available evidence | `busy`, `voicemail`, `human_answered`, or `unknown`. |
| Session status | Whether the customer session remains open or has been closed | Independent of whether a person answered the phone. |

## Disposition reference

| Disposition | Meaning |
| - | - |
| `human_answered` | Answer detection identified a person on a connected call. |
| `no_answer` | The attempt ended without an answer. |
| `busy` | The call result explicitly reported a busy line. |
| `declined` | The call was rejected; the result does not necessarily identify who rejected it. |
| `voicemail` | Answer detection identified something other than a person: a voicemail greeting, a phone menu, a call-screening prompt, or a carrier announcement such as a full or unset mailbox. |
| `failed` | The attempt failed. |
| `canceled` | The attempt was canceled. |
| `unknown` | There is insufficient evidence to identify the answer type. |

Busy, declined, canceled, and voicemail attempts use the broad workflow outcome `unanswered`. A connected call can have `completed` with disposition `unknown`. Keep an explicit fallback branch instead of treating every unclassified call as answered by a person.

For outbound AI calls with answer detection, the agent starts its greeting after pickup while checking for voicemail in the background. Recipients do not need to speak first. When voicemail is detected, the agent stops speaking and ends the call; part of the opening may already have played. If detection is inconclusive or unavailable, the call continues normally. Test the languages and routes you use. In sequences, detected voicemail is a failed voice step with reason `voicemail`, and does not count as a reply that exits the journey. A connected call on which the recipient never speaks is recorded as no answer, not as a reply: only a call where the recipient actually spoke, or where answer detection identified a person, concludes the journey.

## Use Call Finished

The **Call Finished** trigger supports follow-ups after AI calls, including outbound attempts that fail before the agent speaks. It is separate from **Make phone call**, which starts a call and can wait for its outcome. See [Workflow call results](/phone/outbound-calls#workflow-call-results) for that action's statuses, timeout behavior, and guidance for updating existing workflows. Neither a completed call nor an immediate `success` result proves a person answered.

| Workflow field | Reference | Use |
| - | - | - |
| Call ID | `trigger.call.callId` | Identify an attempt when available. |
| Direction | `trigger.call.direction` | Restrict outbound follow-ups to `outbound`. |
| Disposition | `trigger.call.disposition` | Choose the follow-up branch. |
| Outcome | `trigger.call.outcome` | Preserve existing broad outcome rules. |
| End Time | `trigger.call.endTime` | Record when the call ended. |
| Duration | `trigger.call.duration` | Call duration; may be zero on failed attempts. |
| Summary | `trigger.call.summary` | Available summary text; may be empty. |
| Session ID | `trigger.call.ticket.ticketId` | Link the attempt to its OpenCX session. |
| Contact ID | `trigger.call.ticket.contact.id` | Select the OpenCX contact for a follow-up. |

<Warning>
  **Call Finished can run before the final summary is generated.** Log the outcome immediately if needed. Retrieve the finished session later before updating a CRM note with a final summary. A fixed delay alone is not proof that the summary is ready.
</Warning>

The `ticket` segment in workflow references is the existing field identifier for the session. Keep it unchanged in expressions.

## Webhooks and repeat attempts

External receivers can use [`phone_call.ended`](/api-reference/webhooks/types#phone-call-ended). Its optional `call_id` and `disposition` fields describe the attempt; workflow fields use `callId` instead. Check the actual payload before building rules for a human-call or legacy calling route.

A session may contain multiple attempts. Each AI call attempt can trigger its own **Call Finished** workflows; repeated completion events for the same attempt do not run them again. Store the attempt identifier alongside any CRM note or follow-up you create, and make your receiver handle repeated delivery without repeating that side effect. When a call ID is missing, review the event rather than grouping every call from that customer under one permanent deduplication key.

Continue with [Follow-up workflows](/phone/follow-up-workflows) for WhatsApp, callbacks, and CRM logging.

## Read evidence for a specific call

Add **Get Phone Call Details** after **Call Finished**, using `trigger.call.callId` and `trigger.call.ticket.ticketId`. The lookup checks both the session and organization and never substitutes a newer call.

The result provides recorded duration, queue waiting time, human pickup evidence, and the end actor when known. **Ended by** is `agent` for a recorded teammate end action, `system` for a completed IVR hang-up command, and `unknown` when neither is recorded. A teammate ending the human part and the IVR later ending a survey are separate events; the teammate ID remains available. Do not infer the end actor from the current assignee or from a generic disconnect.

Use **Answer time seconds** against the source queue's target in a workflow. For inbound calls, it measures the time from the first recorded invitation until an identified teammate joins the call, excluding the initial IVR. External phone transfers and conference participants do not count as teammate pickup. Accepting an invitation alone does not count as pickup; if no teammate join is recorded, pickup remains unconfirmed. For outbound calls, **Human answered** is false and the pickup and queue-timing fields are empty: a teammate joining does not establish that the customer answered. Calls without confirmed teammate pickup have no answer-time value. **Queue wait seconds** can describe an unanswered attempt when its end is recorded. An unanswered call is not automatically an abandoned call: use caller hang-up evidence before classifying abandonment. These fields do not create an aggregate service-level report or apply a chat reply SLA.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.