Flows are visual workflows you design in your dashboard to guide a conversation before β or instead of β your AI agent. They run on every channel your app supports (Web, WhatsApp, Messenger, Instagram) without any extra work, and the customer sees native UI on each platform.
This article walks through what Flows can do.
[SCREENSHOT 1] Flows list page (Customer Service β Flows). Show at least one Live flow and one Draft, with Switches visible.
What you can build
Anything from a one-message greeting to a multi-branch funnel that collects information, runs conditional logic, hands off to your AI with full context, or routes to a human agent with a packaged summary.
A Flow is a graph β a set of nodes connected by edges. You drag nodes from a side palette onto a free 2D canvas. There are 8 node types, grouped into three categories.
[SCREENSHOT 2] The canvas with the palette open on the left, showing the three category headers and the 8 nodes.
The 8 nodes
Functional β what the customer actually sees
Send Message β the bot sends text. Optionally include a media URL (image).
Options β ask a multiple-choice question with up to 20 buttons. The customer's pick is stored in a variable. You can set synonyms for each button (so "Yeah", "yep", "yes" all match), and choose how to handle unmatched typed text:
Strict β typed text rejected, composer disabled until a button is clicked
Match-or-reprompt (default) β fuzzy-match against labels and synonyms, retry up to 3 times
AI classify β send the typed text to a small AI model that picks the best option
Bail to AI β typed text immediately exits to Let AI Answer with collected context
Collect Input β ask a free-text question and store the answer in a variable. Optional validators: email, phone, regex.
[SCREENSHOT 3] Properties panel of any node (Send Message or Options) so the user sees the side panel where configuration happens.
Flow control
Trigger β where the flow begins. Currently fires on chat_start (the customer's first message).
Branch β routes the conversation based on conditions on collected variables. Conditions evaluate top-to-bottom; first match wins.
End β terminates the flow cleanly with an optional final message.
Integration β handing off
Let AI Answer β passes the conversation to your AI agent with all the collected context auto-injected into its system prompt. The AI takes over from here. The flow can wire what happens after the AI either resolves the question or escalates it.
Human Handover β routes to a human agent in your inbox with a packaged summary. The customer sees an automatic message ("Your query has been sent to a humanβ¦"), your admins get notified, and the chat lands in your inbox in human mode.
Variables
Variables are how you carry information through a flow. They have three scopes:
User attribute: Persists across all conversations with this user (e.g., customer_email, plan, account_id)
Conversation attribute: Persists for this chat only (e.g., topic, order_id, language_preference)
Workflow var: This run only (ephemeral) (e.g., attempt_count, selected_option)
And six types: text, number, boolean, list, date, reference.
Anywhere you have a variable, you can:
Use it as a Branch condition
Reference it later in the same flow
Have it auto-injected into the AI's system prompt at the Let AI Answer node, so the AI has full context
Publishing β the Live toggle
Each Flow has a Switch in two places: on its card in the list, and in the canvas header.
Off β Draft. Saved but not visible to customers.
On β Live. Customers see this flow on every channel.
[SCREENSHOT 4] Two cards in the list β one Live (Switch ON), one Draft (Switch OFF). Description shows "Live" / "Off".
A few rules to know:
Only one Flow can be Live per app at a time. Turning a different Flow on automatically turns the previous one off.
A Live Flow can't be deleted. Toggle it Off first.
Toggling Off doesn't lose your draft β your work stays exactly as you left it. You can re-publish anytime; that becomes the next version.
Customers mid-flow stick with the version they started on. Publishing a new version doesn't disrupt in-flight conversations; new conversations get the new graph.
Channel behavior
You design one flow. The runtime renders it appropriately on each platform.
Web widget
Options buttons are inline pills with 10px corners. They disable automatically once the customer picks (visible in conversation history but greyed out).
[SCREENSHOT 5] Web widget showing an Options message with clickable buttons.
Buttons map to WhatsApp's native interactive UI based on count:
1 β 3 buttons: Interactive Reply Buttons
4 β 10 buttons: Interactive List ("View options" β list rows)
11+ buttons: Numbered text fallback
[SCREENSHOT 6] WhatsApp Interactive Buttons message.
[SCREENSHOT 7] WhatsApp Interactive List message.
Facebook Messenger and Instagram
Buttons map to native Quick Replies:
1 β 13 buttons: Quick Reply bubbles
14+ buttons: Numbered text fallback
[SCREENSHOT 8] Messenger Quick Replies bubbles.
[SCREENSHOT 9] Instagram Quick Replies bubbles.
Markdown formatting
The AI sometimes writes in markdown (bold, ## headings, - lists, [links](url)). The runtime cleans this up automatically per channel:
Web β markdown renders normally.
WhatsApp β bold becomes WhatsApp's native bold (*bold*). Headings become bold. Bullets become β’. Links become text (url).
Messenger / Instagram β strict plain text. All markdown markers stripped.
Long messages
Customers never see truncated messages. If an AI reply exceeds a channel's text limit (1,000 chars on Instagram, 2,000 on Messenger, 4,096 on WhatsApp), the runtime splits it at the safest available boundary (paragraph β line β sentence) and sends multiple messages in order.
How it integrates with AI
When a Flow reaches a Let AI Answer node, the AI receives a system prompt with three layers stacked:
Your AI agent's persona (from your Customer Service settings)
A preamble listing every variable the flow has collected
Optional author-defined instructions you set on that specific node
So by the time the AI takes over, it knows the customer's plan, order, language, intent β whatever you've collected. It doesn't have to re-ask.
How it integrates with the inbox
When a Flow ends with Human Handover (or AI escalates), the chat moves into your inbox with mode human. Any agent on your team can pick it up by clicking Take Over in the chat header.
The Take Over button requires:
Your plan to include the Shared Inbox feature
The per-app Human Handoff setting to be enabled (Customer Service Settings β Human Handoff)
[SCREENSHOT 10] Inbox view of a chat in human mode, with the Take Over button visible in the header and the right-side panel showing the channel and mode.
The customer-facing system message and admin notifications are the same as when the AI escalates β there's one canonical escalation pipeline.
Limits
Buttons per Options node: 20 (Above 11, every channel falls back to numbered text)
Variables per app: unlimited
Live flows per app: 1
Reply Button label: 20 chars (WhatsApp / Messenger platform limit)
List row title: 24 chars (WhatsApp platform limit)
Bot text per message: 1,000 / 2,000 / 4,096 (IG / FB / WA)
Things to keep in mind
Keep button labels short (mobile messengers truncate aggressively).
Use synonyms on Options buttons if you expect customers to type variations.
Always wire the fallback edge on Options nodes β if no button matches, the flow needs somewhere to go.
Make sure every path eventually reaches an End, Let AI Answer, or Human Handover.
The same flow looks different on each channel. If your customers use multiple channels, glance at each one before publishing widely.
On the roadmap
Not yet available, but on the way:
Persistent menus for Messenger and Ice Breakers for Instagram (always-visible UI configured per app).
Multi-select Options nodes (let customers pick more than one).
Test in widget before publish.
Run inspector in the agent inbox (see the active node + collected variables on a live chat).