onCalleeAnsweredstableOn callee answered
Fires when an outbound dial to an external party (not an internal agent) is answered. Use it for "play message on pickup" outbound campaigns or to log the…
What it does
Fires when a bridged leg picks up and the leg is not an internal
extension — typically a dial to an external PSTN number, a partner
answering service, or any third-party destination. The worker's bridge-leg
handler tries to resolve the answering leg to a known internal extension
first; when that lookup fails, it treats the leg as a "callee" and fires
this trigger instead of onAgentAnswered. The two are mutually exclusive
on a given bridge: exactly one of them fires per pickup.
While the chain runs, the worker stashes a small callee context on
state.triggerCallee — including the bridge leg's call-control id —
exposed to templates as {{callee.legCallControlId}} and
{{callee.e164}}. As with the other answered triggers, the chain runs
in an isolated state branch so it can't move the main flow's cursor;
the bridge stays connected and audio flows normally throughout.
When to use it
- Play a "compliance announcement" to the caller (or both legs) the moment an external partner answers, before any conversation begins.
- Log the moment a third-party answered for a partner-routing analytics pipeline, separate from internal-agent answer events.
- Fire a webhook for outbound campaign auditing — "callee answered at HH:MM" with the destination number captured upstream.
- Branch on whether the dial resolved to an internal agent or an external callee by wiring different chains under each trigger type.
If the bridge target is one of your own extensions, use On agent
answered — that fires for internal pickups and gives you full agent
identity (agent.userId, agent.extensionNumber).
Configuration
_label and _note are author-only metadata; this trigger has no runtime
configuration of its own.
Fires when an outbound dial to an external party (not an internal agent) is answered. Use it for "play message on pickup" outbound campaigns or to log the moment the recipient came on the line. Distinct from "On agent answered" — that fires for internal extensions; this fires for everything else.
| Field | Label | Type | Required | Default | Notes |
|---|---|---|---|---|---|
_label | Trigger label | text | Optional | — | |
_note | Internal note | textarea | Optional | — |
Outgoing events: triggered
Examples
Play a recording disclosure when a partner answers
A side-chain that whispers a compliance message to the external party the moment they pick up, while the caller continues to hear silence on the bridge.
{
"id": "callee-answered",
"type": "onCalleeAnswered",
"config": { "_label": "Disclosure to external party" },
"on": { "triggered": "compliance-whisper" }
}
[onCalleeAnswered] ──► [say
prompt: "This call may be recorded.",
target: "agent"]
──► [end]
target: "agent" reuses the bridge-leg targeting logic — with no internal
agent identity in scope, the worker uses the first active bridge leg,
which here is the external callee.
Gotchas
state.triggerCalleeis only set inside this chain. Templates like{{callee.e164}}and{{callee.legCallControlId}}only resolve while the chain is running. To use the callee number later in the call, copy it intovarshere with asetVar.callee.e164resolves to the dialed E.164 for legs originated by thedialnode — the worker stamps the rendered destination into abridgeLegToCalleemap when it originates the leg, and looks it up here. If a callee leg fires this trigger but has no entry in that map (a future dial path we don't yet instrument, or a leg surfaced through some other origin),callee.e164falls back tonulland templates render empty — guard with{{#if callee.e164}}if you read the value defensively.- Mutually exclusive with
onAgentAnswered. Each bridge fires exactly one of the two. The router uses the bridge leg's extension-mapping table — if it finds an extension id, you getonAgentAnswered; if not, you getonCalleeAnswered. There's no way to fire both for one pickup. - Agent-only nodes don't work here. Screen pop, Custom pop,
and Agent toast all require
state.triggerAgent, which is not set in anonCalleeAnsweredchain. They log a warning and skip — usesay/playAudio/httpCall/customScriptfor callee-answer side effects instead. - Side-chain runs in an isolated state branch. Shares
varswith the main flow but cannot move its cursor. The bridge stays connected while the chain runs; if your chain takes a long time (a slowhttpCall), the conversation has already started and the chain catches up in the background.
