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
completedorappointment_bookedstill matches the conversation’s stored call result. -
Every other saved filter, including
containsand custom labels such asInterestedorHot Lead, is compared with the conversation’s Outcome. It only matches when its value fits one of the fixed Outcomes (case-insensitive;containsmatches part of the Outcome). -
A filter saved with
Do not callmatchesDo not disturb. -
Positiveis no longer an outcome, so a filter onPositivestops matching new conversations.
{{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 equalsandnot containsagainst 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 →
isAppointment booked
- Filter: Agent Type → chat
- Filter: AI Agent → Select your support agent
- Filter: Agent Type → voice, web
- Filter: Min duration → 30
- No filters. Leave it empty.
- Filter: Extracted data →
lead_statuscontainshot
- Filter: Extracted data →
appointment_dateis not empty
- Filter: Extracted data →
budgetgreater than5000
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 whenagentType 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 whenagentType is chat.
Chat conversations do not include
direction or duration — use the Outcome and timestamps instead.
Web-only fields
Present whenagentType 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.- Trigger: Conversation ended → Agent Type: voice
- 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
- Send email — “Hi
- Path: is
Voicemail- Wait — 4 hours
- Voice call — Retry
- Path: is
No answer- Send SMS — “Hi
{{firstName}}, I just tried to reach you. Let me know a good time.”
- Send SMS — “Hi
- Default
- Update contact — Add “needs-review” tag
- Path: is
Post SMS summary to Slack
Every finalized SMS conversation gets a summary posted to your team channel.- Trigger: Conversation ended → Agent Type: chat
- Action: Condition —
{{trigger.conversation.channel}}equalssms - Action: Slack message — #sms-conversations
- Message: “SMS with
{{firstName}}{{lastName}}({{trigger.conversation.messageCount}}messages,{{trigger.call.analysis.outcome}})\n\n{{trigger.conversation.summary}}”
- Message: “SMS with
Post-call summary to Slack
Every completed voice call gets a summary posted to your team channel.- Trigger: Conversation ended → Agent Type: voice
- Action: Slack message — #call-updates
- Message: “Call with
{{firstName}}{{lastName}}({{trigger.conversation.duration}}s,{{trigger.call.analysis.outcome}})\n\n{{trigger.conversation.summary}}”
- Message: “Call with
Sync conversation data to CRM
Push conversation details to your CRM after every conversation, regardless of channel.- Trigger: Conversation ended (no filters)
- Action: Send webhook — POST to CRM
Do Not Disturb compliance
A conversation whose outcome isDo 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.
- Trigger: Conversation ended → Outcome:
isDo not disturb - Action: Slack message to #compliance
- Message: “
{{firstName}}{{lastName}}({{phone}}) asked not to be contacted. Do Not Disturb is now on.”
- Message: “
Tag engaged web visitors
When a web agent session finishes with a Follow up outcome, mark the contact as engaged.- Trigger: Conversation ended → Agent Type: web
- Action: Condition — Outcome (Trigger) is
Follow up - Action: Update contact — Add “engaged-web” tag
