Skip to main content
The Chat & Voice Agent step starts a conversation between one of your Chat & Voice Agents and a person. It was called Conversation Flow before October 2026. When the workflow reaches the node, the agent sends that person an opening message on the channel you pick (email, Slack, Teams, or WhatsApp) and carries on the conversation from there. The node doesn’t wait for the conversation to finish. Instead, you add event branches to it: a branch runs each time something happens in the conversation. For example, a branch can run when the person answers a question or when the agent finishes its job.
The Qualify lead node on the canvas, connected to a Slot Filled branch and an Actor Changed branch, each continuing to further steps

The Qualify lead node with two event branches. The steps connected after a branch run every time its event happens.

When to use

Use it when the workflow needs a real back-and-forth with someone, and you’ve built the conversation as a Chat & Voice Agent:
  • Qualify a lead: a form comes in, and the agent emails the lead and asks about budget and timing.
  • Follow up with a customer: after a delivery, the agent checks in on WhatsApp and handles any problem.
  • Run a check-in: each week, the agent asks a teammate a few questions on Slack.
A different node fits better in these cases:

Before you start

The node starts an agent that already exists. Check two things on that agent first:
  1. It has an outbound channel. Open the agent and click Channels in the rail on the left of its canvas. The node can use a Gmail, Outlook, Slack, Teams, or WhatsApp Business channel. A website widget can’t start a conversation with someone, so it doesn’t count.
  2. It knows what you’ll pass in. To hand the agent details such as the person’s company or the order number, define them as Initial Parameters in the agent’s Flow settings. The agent’s prompts use each one as @param.<name>.
The node starts the agent’s last deployed version. An agent that was never deployed runs as it’s currently saved, so you don’t need to deploy it first; once you do, deploy again to send later edits (Draft and live versions). Real messages go out, so try changes in the agent’s Test drawer first.

Set it up

The Chat & Voice Agent panel with Conversation flow, Channel, Recipient email, Recipient name, the Initial parameters company and interest, and Additional context

A configured node: the agent, the channel, the recipient from the form that triggered the workflow, two initial parameters, and a note for the agent.

1

Add the node

In the Add Step picker, open Communication and add Chat & Voice Agent. Connect the step that should start the conversation (usually the trigger) to it.
2

Pick the agent

Under Conversation flow, choose the Chat & Voice Agent to start.
3

Pick the channel

Channel lists the agent’s outbound channels as channel name (channel type), for example Sales inbox (Gmail).
4

Say who to reach

The fields below the channel depend on its type (see the table below). Use {{ }} to fill them from an earlier step, for example {{new_lead.body.email}}.
5

Fill in the initial parameters

Initial parameters shows one field per parameter the agent defines. They can use {{ }} too.
6

Add context (optional)

Additional context is a note to the agent about this conversation’s goal, for example “They asked about pricing. Offer a 20-minute call this week.” The agent uses it when it writes the opening message.
7

Save, then add event branches

Click Save. Then add the branches you need; see React to the conversation.
Pick the agent’s Widget channel to create a widget link instead of sending a message. There’s no recipient: set the optional Name, Your reference and Link expires after. The node’s outputs url, embedHtml, launchId and expiresAt go to the step connected to its output, so the next step can email the link. Conversation Started runs when the person opens it.

Who to reach, by channel

The Channel list open with Sales inbox (Gmail) and Acme Slack (SlackBot (CogniAgent)), and a Slack channel or user ID field below

Pick a Slack channel and the recipient field changes to a Slack ID.

Phone and SMS channels aren’t offered in this node. To call someone, start the conversation from the agent’s toolbar instead; see Start a conversation. Telegram channels appear in the list, but Telegram can’t open a conversation with someone, so pick another channel.
If the agent has no outbound channel, the Channel list is disabled and the panel says so:
Channel disabled with No outbound channels on this flow, and a warning to add one in the flow's Channels settings

This agent only has a website widget, so there is no channel to start a conversation on.

What happens when the node runs

  1. The node starts a conversation between the agent and the person, then finishes. It has no branch of its own; everything after it hangs off its event branches.
  2. The agent sends its opening message on the channel. From then on, the agent and the person talk directly; the workflow isn’t involved in each reply.
  3. Each time an event you added a branch for happens, that branch runs, with the event’s details as its data.
Three rules shape how this behaves:
  • One active conversation per person. If the person already has an active conversation with this agent on the same kind of channel, the node ends it and starts a new one. This applies whether that conversation was started by hand, by another workflow, or by an earlier run. The replaced conversation doesn’t run a Conversation Ended branch.
  • Branches belong to this node. A branch runs only for conversations this node started, never for conversations the same agent has elsewhere.
  • The run stays open. A workflow with a Chat & Voice Agent step keeps running until you stop it, so that later events can still reach its branches. Stopping the run also ends every conversation it started, and those don’t run Conversation Ended either.
If each trigger reaches a different person (a form submission, a new order), set the workflow to Multi instance in its settings; see Execution modes. Each person then gets a run of their own, so everything a branch sees belongs to that one person.

React to the conversation

To add a branch, point at the small list icon on the node’s right edge, open Add Actions & Events, and click an event under Events. The branch appears to the right of the node, already connected. Connect the steps that should run to it.
The events menu next to the node, listing Conversation Started, Conversation Ended, Message Received, Slot Filled, and Actor Changed

The events menu. Slot Filled and Actor Changed are already connected; click any event to add its branch.

Each branch runs again every time its event happens: Message Received runs once per message, and Slot Filled once per answer.

Know when the agent is done

The agent doesn’t end the conversation when it finishes; the person can always write again. Conversation Ended therefore runs only when someone stops the conversation. It doesn’t run when the agent completes its steps, when a conversation goes quiet for 24 hours, when it’s replaced, or when the opening message can’t be delivered. To act once the agent has finished, use Actor Changed. When the agent’s last actor completes its job, the branch runs with an empty currentActorId. Put a If / else on it:
An If / else named Agent finished? after the Actor Changed branch, whose passing branch leads to a Slack Send Message step

After Actor Changed: an If / else that passes only when no actor is left, then Slack. Sales hears about the lead once, when the agent is done.

The branch that passes is your “the agent is done” path. The other branch runs for ordinary hand-offs between actors; leave it unconnected.

Use the event’s data

Each branch has a key of its own, named after its event: conversation_started_handle, message_received_handle, slot_filled_handle, actor_changed_handle, and conversation_ended_handle. If you add the same event twice, the second gets a number: slot_filled_handle_1. Steps after the branch read its data with that key:
Steps can also read anything from before the node, such as {{new_lead.body.email}} from the trigger. Outputs lists every field.
The variable list offers a branch’s fields only after that branch has run once. Until then, type the reference yourself, as shown above.

Scenarios

Qualify every new lead by email

A website form posts each new lead to a Webhook trigger named New lead (so its key is new_lead). The Lead Qualification agent asks about company size, budget, and timing, and saves each answer to a slot.
Set up the node
  • Channel: Sales inbox (Gmail)
  • Recipient email: {{new_lead.body.email}}
  • Recipient name: {{new_lead.body.name}}
  • company: {{new_lead.body.company}}
  • interest: {{new_lead.body.message}}
Save each answer. In the Google Sheets Upsert Rows step, set Key column to Email, Headers to Email and {{slot_filled_handle.slotName}}, and the one row in Rows to {{new_lead.body.email}} and {{slot_filled_handle.value}}. Each answer lands in the lead’s row, in the column named after the slot, and the sheet fills in while the conversation is still going. Tell sales when it’s done. The Slack message can say “{{new_lead.body.name}} from {{new_lead.body.company}} has finished qualifying. Answers are in the Leads sheet.” Watch for: set the workflow to Multi instance, so each lead’s answers stay in its own run. Name the agent’s slots after your sheet’s columns; Upsert Rows adds a column it doesn’t find.

Follow up after a delivery on WhatsApp

Your store calls a Webhook trigger when an order is delivered (order_delivered). The Delivery check-in agent asks the customer how it went and handles simple questions itself.
Set up the node
  • Channel: Store WhatsApp (WhatsApp Business)
  • Recipient phone (E.164): {{order_delivered.body.phone}}
  • order_number: {{order_delivered.body.order_number}}
  • Additional context: “The order was delivered today. Ask whether everything arrived in good condition.”
Escalate problems. The If / else step reads {{message_received_handle.content}} in AI mode. The Slack alert can quote the message and give {{order_delivered.body.order_number}}, so support can step in straight away. Watch for: Message Received runs for every message the customer sends, so keep the steps after it light. Phone numbers must include the country code (+44…), or the agent can’t reach the customer.

Run a weekly check-in on Slack

A Scheduled Trigger fires every Monday at 09:00. The Weekly check-in agent asks a team lead three questions on Slack.
Set up the node
  • Channel: Acme Slack (SlackBot (CogniAgent))
  • Slack channel or user ID: the team lead’s Slack user ID, for example U01ABC23DEF
  • Additional context: “Ask about progress, blockers, and plans for next week. Keep it short.”
Watch for: If last week’s check-in is still active when Monday comes, the new one replaces it. That’s usually what you want: only this week’s questions are open.

Troubleshooting

Settings

agent
required
The Chat & Voice Agent to start.
channel
required
One of the agent’s outbound channels: Gmail, Outlook, Slack, Teams, or WhatsApp Business.
text
required
Who to reach. The field depends on the channel: an email address, a Slack user or channel ID, a Teams chat ID, or a phone number. Supports {{ }}.
text
One field per parameter the agent defines. The agent uses the values wherever its prompts say @param.<name>. A red asterisk marks the parameters the agent expects, but the node lets you save with one empty; an empty parameter becomes blank text in the prompt. Supports {{ }}.
text
Optional. A note on what this conversation should achieve; the agent uses it when it writes the opening message. Supports {{ }}.

Outputs

Each event branch passes on its event’s details. Every branch includes sessionId (the conversation’s ID), conversationFlowId, and eventType.
  • channelType: the kind of channel, for example gmail
  • participantIdentifier: who the conversation is with
  • startedAt: when it started
  • initialParameters: the Initial Parameters the conversation started with, for example {{conversation_started_handle.initialParameters.company}}
  • parameterSources: where each value came from — page (the widget’s embed code), url (the widget’s page address), launch (a widget link); empty when the values came from this node or the Start Conversation form
  • content: the text of the message. An image or file arrives as [Sent file: …].
  • participantIdentifier: who sent it
  • messageId: the message’s ID
  • role: always user, since only the person’s messages trigger this branch
  • timestamp: when it arrived
  • slotName: the slot the agent saved, for example budget
  • value: the saved answer
  • previousValue: what the slot held before this turn (empty the first time)
  • actorId: the actor that saved it
  • timestamp: when it was saved
  • previousActorId: the actor before; empty on the conversation’s first turn
  • currentActorId: the actor now; empty when the agent has finished its job
  • reason: sequential-transfer (an actor handed off), global-router-direct (the router picked another actor), or turn
  • timestamp: when it changed
Actor IDs are the actors’ internal IDs, not their names.
  • reason: why it ended, for example operator_stopped when someone clicked Stop
  • finalState: every slot’s value at the end, for example {{conversation_ended_handle.finalState.budget}}
  • endedAt: when it ended
  • initialParameters and parameterSources: as in Conversation Started
The node itself also records sessionId, channelType, participantIdentifier, and timestamp in the run’s history. With a Widget channel it outputs url, embedHtml, launchId and expiresAt instead, and sessionId stays empty until the person opens the link. Like every output, the link is kept in the run’s history, so anyone who can view the workflow’s runs can open it. In a branch, read sessionId from the branch ({{slot_filled_handle.sessionId}}); that way it’s always the conversation the event came from.

Next steps

Chat & Voice Agents

Build the agent this node starts.

Initial Parameters

Define the details a workflow passes to the agent.

Human Step

Bring one person in for an approval or a quick answer, and continue on their outcome.

Start a conversation

Start one by hand from the agent’s toolbar, including phone calls.