Flows execute linearly when triggered — once a trigger matches, every connected node runs in order. Branching happens where a customer taps a button: each button on a Button Message node is a separate output handle that can lead to a different downstream node.
When to reach for a Bot Flow
Pick a Bot Flow over a Message Bot or Template Bot when you need one or more of:- A conversation with more than one step.
- Buttons that lead to different outcomes (not just the same reply).
- Media — images, video, audio, documents, stickers.
- A WhatsApp list picker with multiple sections.
- A location pin or a contact card.
- An API call to a service you operate (CRM, order system, knowledge base).
- Handover to an AI Assistant.
Open the builder
Go to Automations → Bot Flows.
- Click Create Flow to start a new one.
- Click any row to open the visual builder and edit an existing flow.
| Field | Limit | Purpose |
|---|---|---|
| Name | 255 characters | Internal — customers never see it. |
| Description | 1000 characters | Optional note about what the flow does. |
| Active | on / off | When off, the flow is saved but won’t run. |
Flows do not have a draft state. As soon as the flow is saved and active, it runs on matching incoming messages. Keep a flow inactive while you’re still editing.
How a flow runs
When a message comes in:- Xobito compares the message against every active flow’s Trigger node.
- The first matching flow wins — its nodes execute one after another, following the edges from the Trigger.
- At a Button Message, the flow pauses and waits for the customer to tap a button. The tap determines which edge runs next.
- The flow ends when it reaches a node with no outgoing edge.
The trigger
Every flow starts with exactly one Trigger node. It’s created for you when you start a new flow. The Trigger defines two things — who this flow applies to and when it fires:| Field | Values |
|---|---|
| rel_type | lead or customer — the contact type the flow applies to. |
| reply_type | 1 on exact match, 2 message contains, 3 on first message, 4 fallback (no other keyword matched). |
| trigger | Comma-separated keywords. Required for reply types 1 and 2. Ignored for 3 and 4. |
The 10 node types
Inside the builder, after the Trigger you can add any combination of these nine action nodes:Text Message
Send a plain text reply. Up to 1000 characters.
Button Message
Send text with up to 3 quick-reply buttons. This is how flows branch.
Call To Action
Send text with a URL button that opens a link.
List Message
Send a WhatsApp list picker with up to 10 sections.
Media Message
Send an image, video, audio, document, or sticker.
Location
Send a pin with latitude, longitude, name, and address.
Contact Card
Send one or more vCard contacts.
API Request
Call an external HTTP endpoint mid-flow.
AI Personal Assistant
Hand the conversation over to an AI Assistant (if the module is enabled).
Only the AI Personal Assistant node is conditional — it appears in the builder only if the AI Assistant module is enabled on the workspace. All other nodes are always available.
How branching works
Bot Flows branch on a Button Message node. Each button you define (up to three per Button Message) is a separate output handle —button-0, button-1, button-2 in the underlying graph. Connect an edge from each handle to a different downstream node, and the flow picks a path based on which button the customer tapped.
Variables and merge fields
Inside any text field of any node — reply text, headers, button labels, URLs, API bodies — you can insert merge fields using single curly braces:What is and isn’t a variable
- Predefined merge fields (the nine above) — supported everywhere.
- Custom fields you’ve defined on contacts — not currently usable as merge fields inside flows.
- Flow-local variables (storing “the answer the customer just gave”) — not available. The flow has no state between nodes, so you can’t capture a customer’s reply into a variable and reuse it later. If you need that, use an API Request to push the data to your own system.
Validation and limits
When you save a flow, Xobito checks:| Rule | Details |
|---|---|
| Orphan nodes | Every node except the Trigger must have at least one incoming edge. Orphan nodes are rejected. |
| Required fields per node | For example Text Message must have reply text; Button Message must have at least one button; Trigger must have a reply type. |
| Per-field limits | Reply text up to 1000 chars, header up to 60, buttons up to 20, list items capped at 10 per section and 10 items total, etc. See the node reference. |
| Flow name | Max 255 characters. |
| Flow description | Max 1000 characters. |
Activation
A flow runs only when both conditions are true:- The
is_activetoggle is on. - The flow is saved (no unsaved edits).
Execution order vs other automations
When a message arrives, Xobito evaluates automations in this order:- Bot Flows — first match wins.
- Message Bots — only checked if no flow matched.
- Default greeting / away message — only checked if neither of the above fired.
Where flows are stored
Each flow is stored as a single row in thebot_flows table on your tenant database. The visual graph is serialised into a flow_data JSON column. You don’t normally need to know this, but it explains two useful things:
- Exporting / importing flows happens by copying the JSON blob.
- Each tenant has their own flows — flows never leak across workspaces.
Permissions
| Permission | Allows |
|---|---|
tenant.bot_flow.view | See the Bot Flow list and open the builder read-only. |
tenant.bot_flow.create | Create new flows. |
tenant.bot_flow.edit | Edit existing flows and change the active toggle. |
tenant.bot_flow.delete | Delete a flow. |
Feature availability
Bot Flows require thebot_flows feature on your subscription. If the link is missing from the sidebar, your plan doesn’t include them.
Good practice
Start with a skeleton, fill it in
Start with a skeleton, fill it in
Drop in the Trigger → Text Message → Button Message → (three buttons to three Text Messages) skeleton first. Save, activate on your own number, and walk through it. Then replace the placeholder text with real content one node at a time.
Keep flows short
Keep flows short
A flow longer than 10–12 nodes becomes hard to reason about. If a flow needs to branch deeply, break it up into smaller flows that each handle one sub-topic, and chain them with a Button Message whose buttons include keywords that trigger the next flow.
Don't put secrets into API Request headers
Don't put secrets into API Request headers
The
flow_data JSON is stored in your database. API keys you put into API Request headers live there. Prefer endpoints that don’t need static secrets, or rotate the keys regularly.Test as a real contact
Test as a real contact
Save your own phone number as a contact before testing. If the flow’s trigger is
rel_type=lead, make sure you’re a lead, otherwise the flow won’t fire on your messages.What to read next
Bot Flow Nodes reference
Every node, every parameter, every limit — with JSON examples.
Message Bots
When a flow is overkill, try a keyword-to-reply bot.
Template Bots
Send an approved template on a keyword.
Activity Log
See who changed a flow and when.