Skip to main content
Fires when any AI conversation ends — voice calls, chat conversations on any connected messaging channel, or web agent sessions. This is one of the most powerful triggers — it gives you access to the full conversation data including transcript, summary, outcome, and any extracted fields.
This trigger was previously called Call Completed (voice-only) and Conversation Completed. Existing workflows continue to work unchanged. The internal type identifier is still conversationCompleted.

When it fires

The trigger fires immediately after a conversation ends:

Configuration

Filters

Use filters to only trigger the workflow for specific conversations. All filters use AND logic.
Voice-only filters (direction, duration) only apply when Agent Type includes voice. If you select only chat or web, those filters are ignored. The Outcome and Extracted data filters work on every channel.

Outcome

Every conversation is classified into one Outcome from a fixed list (Appointment booked, Transferred, No answer, Voicemail, Follow up, Callback requested, Not interested, Do not disturb, Wrong number, Other). The filter is a dropdown of those values.
This filter was previously called Call disposition and took free text. Filters saved before the rename are still evaluated as they were saved, but they now match against the fixed Outcome list:
  • A filter with no operator and a legacy value such as completed or appointment_booked still matches the conversation’s stored call result.
  • Every other saved filter, including contains and custom labels such as Interested or Hot Lead, is compared with the conversation’s Outcome. It only matches when its value fits one of the fixed Outcomes (case-insensitive; contains matches part of the Outcome).
  • A filter saved with Do not call matches Do not disturb.
  • Positive is no longer an outcome, so a filter on Positive stops matching new conversations.
Open older workflows that filter on Outcome and pick a value from the list, so they keep firing.
For voice-specific routing on raw call ending reasons (voicemail, no answer, transferred, etc.), use a Condition step on {{trigger.conversation.endedReason}} — see the voice-only fields table further down.

Extracted data filters

Filter on any extraction field configured on the agent — budget, lead status, appointment date, sentiment, anything you’ve set up. The filter picker shows every extraction field defined on the agents your workflow listens to, and works across voice, chat, and web conversations. Behavior notes:
  • Filtering only fires the workflow when the field matches. Filters are AND-combined — every filter must match.
  • not equals and not contains against a missing value match (vacuous truth) — useful for “fire unless the AI said X”.
  • Extracted values are also available as variables in your actions — see {{trigger.conversation.metadata.fieldName}} further down.

Examples

Only outbound voice calls that booked an appointment:
  • Filter: Agent Type → voice
  • Filter: Call direction → Outbound
  • Filter: Outcome → is Appointment booked
All chat conversations from a specific agent:
  • Filter: Agent Type → chat
  • Filter: AI Agent → Select your support agent
Voice or web sessions longer than 30 seconds:
  • Filter: Agent Type → voice, web
  • Filter: Min duration → 30
Every conversation on every channel:
  • No filters. Leave it empty.
Hot leads only (any channel):
  • Filter: Extracted data → lead_status contains hot
Conversations where appointment date was captured:
  • Filter: Extracted data → appointment_date is not empty
High-budget leads:
  • Filter: Extracted data → budget greater than 5000

Data available

This trigger provides the richest data of any trigger type. Some fields are only present for certain agent types — use the Agent Type filter or a Condition step to branch safely.

Contact variables

Available for every conversation regardless of channel.
Dot notation ({{contact.firstName}}) is now the standard. The flat aliases on the right still work for backwards compatibility — existing workflows continue to render unchanged.

Conversation variables

The canonical namespace for all channels. Use these in new workflows. Extraction fields configured on the agent (budget, timeline, etc.) are available under {{trigger.conversation.metadata.fieldName}}.

Voice-only fields

Present when agentType is voice.
Use {{trigger.call.analysis.outcome}} for the conversation’s Outcome, or {{trigger.conversation.endedReason}} for the raw call ending reason.

Appointment variables

Present when the agent’s booking tool confirmed an appointment during the conversation, and empty otherwise. These live under {{trigger.call.*}}. Use the first two in emails, SMS and Slack messages, e.g. Appointment: {{trigger.call.appointmentDateFormatted}} at {{trigger.call.appointmentTime}}. Use the ISO value where another system or field needs a machine-readable date: webhook bodies, date-type contact fields, and greater than / less than conditions. If a workspace hasn’t set a timezone, appointmentDateFormatted and appointmentTime render empty — there’s no silent UTC fallback.

Chat-only fields

Present when agentType is chat. Chat conversations do not include direction or duration — use the Outcome and timestamps instead.

Web-only fields

Present when agentType is web. Web sessions use the voice-style fields (callId, duration, endedReason) plus channel: "web".

Legacy trigger.call.* namespace

For backwards compatibility, existing voice workflows can still use the {{trigger.call.*}} namespace. It maps 1:1 to {{trigger.conversation.*}} for voice-only fields (callId, duration, direction, summary, transcript, agentId, agentName, agentType, startedAt, endedAt, endedReason, metadata). New workflows should use {{trigger.conversation.*}} since the legacy namespace only resolves for voice conversations. {{trigger.call.agentType}} renders empty, the same as its {{trigger.conversation.*}} counterpart. Agents no longer carry a type.

Deduplication

Uses the conversation ID as the dedup key. Default window: 1 minute. Each conversation can only trigger the workflow once within the window.

Use case examples

Follow-up based on voice outcome

Different outcomes get different follow-up strategies.
  1. Trigger: Conversation ended → Agent Type: voice
  2. Action: Condition — Check Outcome (Trigger)
    • Path: is Follow up
      • Send email — “Hi {{firstName}}, great chatting! Here are the details we discussed…”
      • Update contact — Add “interested” tag
    • Path: is Voicemail
    • Path: is No answer
      • Send SMS — “Hi {{firstName}}, I just tried to reach you. Let me know a good time.”
    • Default

Post SMS summary to Slack

Every finalized SMS conversation gets a summary posted to your team channel.
  1. Trigger: Conversation ended → Agent Type: chat
  2. Action: Condition — {{trigger.conversation.channel}} equals sms
  3. Action: Slack message — #sms-conversations
    • Message: “SMS with {{firstName}} {{lastName}} ({{trigger.conversation.messageCount}} messages, {{trigger.call.analysis.outcome}})\n\n{{trigger.conversation.summary}}”

Post-call summary to Slack

Every completed voice call gets a summary posted to your team channel.
  1. Trigger: Conversation ended → Agent Type: voice
  2. Action: Slack message — #call-updates
    • Message: “Call with {{firstName}} {{lastName}} ({{trigger.conversation.duration}}s, {{trigger.call.analysis.outcome}})\n\n{{trigger.conversation.summary}}”

Sync conversation data to CRM

Push conversation details to your CRM after every conversation, regardless of channel.
  1. Trigger: Conversation ended (no filters)
  2. Action: Send webhook — POST to CRM

Do Not Disturb compliance

A conversation whose outcome is Do not disturb (the contact asked not to be contacted) turns on Do Not Disturb (DND) for that contact automatically, on every channel: calls, chat, SMS, email and the rest. Nothing more is sent to them. A Not interested outcome does not turn on DND. Use a workflow to tell your team.
  1. Trigger: Conversation ended → Outcome: is Do not disturb
  2. Action: Slack message to #compliance
    • Message: “{{firstName}} {{lastName}} ({{phone}}) asked not to be contacted. Do Not Disturb is now on.”

Tag engaged web visitors

When a web agent session finishes with a Follow up outcome, mark the contact as engaged.
  1. Trigger: Conversation ended → Agent Type: web
  2. Action: Condition — Outcome (Trigger) is Follow up
  3. Action: Update contact — Add “engaged-web” tag