Conversation Flows

Build scripted, state-machine chatbot conversations with the visual flow editor.

A Conversation Flow defines how your chatbot talks to users using a state-machine model. Your bot moves between states based on what the user says. Each state can send a message, wait for input, and decide what to do next.

Conversation Flows work across any channel your chatbot is connected to (WhatsApp, Web Widget, REST API, etc.).


When to Use a Conversation Flow

Use a Conversation Flow when you need:

  • A scripted conversation with clear steps (e.g., collect a name → confirm → save)
  • Conditional branching (e.g., "if user says yes → go to checkout, if no → go to menu")
  • Intent detection using keywords or NLU
  • Actions like calling a webhook or querying a knowledge base at specific points
  • Have no access to Meta Business Account that is verified to allow you to use Meta Flows

For interactive WhatsApp-native UI (forms, carousels, pickers), use Meta Flows instead.


Creating a Conversation Flow

  1. Inside your chatbot, click Flows in the sidebar, then Conversation Flows.
  2. Click Create Flow (or New Conversation Flow).
  3. Enter a name and optional description.
  4. Click Create.

The flow opens directly in the Flow Editor.

Note: Your plan limits how many flows a chatbot can have. See Billing & Plans.


The Flow Editor Layout

The Flow Editor has four main areas:

AreaPurpose
Canvas (centre)Visual graph of states and transitions
Property Panel (right)Edit the selected state's details
JSON IDE (tab)Edit the raw flow JSON with live validation
Chat Preview (tab)Simulate the conversation in real time

A toolbar at the top provides: Save, Validate, and Publish buttons.


Working with States

A state is a step in your conversation — a point where the bot says something and waits for the user's response (or moves on automatically).

Adding a State

  1. On the canvas, click the + Add State button (or right-click the canvas for the context menu).
  2. A new state node appears on the canvas.
  3. Click the state to select it and edit its properties in the Property Panel.

Configuring a State

In the Property Panel for a selected state:

  • Name — A unique identifier for the state (used in transitions). Use lowercase with underscores (e.g., ask_name).
  • Actions — What the bot does in this state. You can add multiple actions:
    • Send message — The bot sends a text message to the user
    • Call webhook — Calls an external URL (e.g., to fetch data from your system)
    • Query knowledge base — Searches a connected KB for an answer
  • Is Initial State — Mark one state as the starting point of the flow (the bot begins here)

Renaming a State

Click the state name in the Property Panel and type a new name. All transitions referencing this state are updated automatically.


Adding Transitions

A transition defines where the bot goes next based on user input.

Adding a Transition

  1. Select a state on the canvas.
  2. In the Property Panel, scroll to the Transitions section.
  3. Click Add Transition.
  4. Configure:
    • Condition — What triggers this transition (see below)
    • Target State — Which state to move to

Condition Types

ConditionBehaviour
AlwaysAlways move to the target state (no user input needed)
Intent matchMove when the user's message matches a defined intent
Keyword matchMove when the user's message contains a specific word or phrase
Regex matchMove when the user's message matches a regular expression
DefaultThe fallback if no other condition matches

Drawing Transitions on the Canvas

You can also draw a transition directly on the canvas:

  1. Hover over the source state node — a small connector dot appears on its edge.
  2. Click and drag from that dot to the target state node.
  3. Configure the transition condition in the Property Panel.

Using Intents and NLU

Intents let your bot understand what the user means, not just what they literally typed.

Creating an Intent

  1. In the Property Panel, go to the Intents tab.
  2. Click Add Intent.
  3. Give the intent a name (e.g., greeting) and add example phrases (e.g., "Hello", "Hi there", "Hey").
  4. The NLU model uses these examples to match similar user messages.

Using an Intent in a Transition

When adding a transition condition, select Intent match and choose the intent from the list.


JSON IDE

The JSON IDE tab shows the complete flow as a JSON document. Advanced users can edit the flow JSON directly.

  • Live validation — Errors are underlined in red as you type
  • Error markers — Hover over an underlined section to see the specific error
  • Two-way sync — Changes in the JSON IDE are reflected on the canvas, and vice versa

Tip: If you are troubleshooting a complex flow, switching to the JSON view can make it easier to see the full structure at once.


Chat Preview

The Chat Preview tab lets you simulate a conversation with your flow before going live.

  1. Click the Chat Preview tab.
  2. Type a message as if you were a user.
  3. The preview bot responds according to your flow logic.
  4. Use this to test all your transitions, conditions, and responses.

Variables like ${user_name} are interpolated in the preview if you have set them.


Save, Validate, and Publish

Your flow must go through three steps before users can interact with it:

Step 1: Save

Click Save to save your current changes. This stores the draft on the server but does not activate the flow.

Tip: Save frequently so you don't lose your work.

Step 2: Validate

Click Validate to check your flow for errors. The backend checks:

  • All transitions point to existing states
  • Required fields are filled in
  • Actions are correctly configured

If there are errors, they appear as markers in the JSON IDE and as a list in the toolbar. Fix all errors before publishing.

Step 3: Publish

Click Publish to make the flow live. The published version is what users interact with.

Note: Only a validated flow can be published. Publishing replaces the previous live version.


Flow Status Badges

On the Conversation Flows list page, each flow shows a status badge:

BadgeMeaning
DraftThe flow has been saved but not yet published
PublishedThe flow is live and active
InvalidThe flow failed validation; cannot be published