Call controlhangupstable

End call

Politely ends the call and cleans up any in-progress audio, recordings, or ringing legs. Use this whenever a flow has reached its natural end.

What it does

Ends the call cleanly when a flow has reached its natural conclusion. The worker tears down the parent leg AND every bridge leg currently associated with the call, so a hangup mid-dial cancels still-ringing extensions, a hangup mid-bridge drops the agent at the same time as the caller, and a hangup mid-recording closes the recording out before the leg goes away.

Hangup is a terminal node — once it runs, the flow run is marked completed and a final flow.end telemetry row is written. Outgoing edges on hangup are ignored: there's nothing left to advance to. If the caller hangs up first, the same teardown happens automatically — you only need this node when the flow is the one deciding to end the call. Either way, logic for afterwards goes under After the call ends (vars.callEndReason is flow_hangup when this node ended it).

When to use it

  • After voicemail save/discard to release the line ("Thanks, goodbye.")
  • At the end of an after-hours branch that reads a closed-message and drops the call
  • At the end of a path to make the flow's terminal state explicit in the editor (a path that runs off its end finishes the call too)
  • As the success path of a self-service flow that's done its job (e.g. paid a bill, confirmed an appointment) and doesn't need a human

Configuration

The node has no configuration fields — it just ends the call.

Politely ends the call and cleans up any in-progress audio, recordings, or ringing legs. Use this whenever a flow has reached its natural end.

This node has no configurable fields.

Examples

End-of-flow goodbye

Read a closing prompt and hang up when it finishes.

{
  "id": "goodbye",
  "type": "say",
  "config": {
    "prompt": { "kind": "text", "text": "Thanks for calling. Goodbye." }
  },
  "on": { "call.speak.ended": "end-call" }
}
{
  "id": "end-call",
  "type": "hangup",
  "config": {},
  "on": {}
}

Gotchas

  • Bridge legs go down with the parent. If the caller is bridged to an agent extension and the flow runs hangup, both sides drop together. This is the right behavior for ending the call but surprising if you meant to drop only the caller — there's no "hang up just one leg" node.
  • It's terminal — no outgoing edges fire. Wiring an edge out of hangup does nothing; the flow run completes the moment the node runs. If you need post-hangup work (CRM updates, SMS confirmations), put it before the hangup — there is no post-hangup trigger chain.
  • Pending playback / recording is interrupted. A speak or record command in flight when hangup runs is cut short — the platform fires call.playback.ended / call.recording.saved on the way out, but the flow has already moved to completed so those events don't route anywhere. A message being left in a Voicemail node is still saved: the platform stores what was captured when the caller hangs up.
  • Caller-initiated hangup runs the same teardown. Nothing on the call runs after the caller hangs up, so there is no hang-up edge to wire this node to; use After the call ends for follow-up work.

See also