Flows & forms
A flow is an automated conversation: it greets a customer, asks questions, branches on their answers, tags the chat and hands it to a person when it is time. A form is a short questionnaire the customer fills in natively inside WhatsApp, without leaving the chat. A flow can send a form as one of its steps.
You find both in the sidebar: Flows under Automate, Forms under Engage.
Who answers a message
Section titled “Who answers a message”When a customer writes in, whatbot decides who replies in this order. The same summary is on the Flows page under Who answers a customer’s message?
- A person is assigned to the chat? Flows and AI agents stay silent, and the person answers.
- A flow is already running for this customer: it takes the reply.
- A flow matches: a voice-note flow first, then a keyword flow (the longest matching keyword wins), then the first-message flow.
- Only if no flow matched, an AI agent can answer.
Automation rules and the out-of-hours reply run on every message alongside this. They don’t wait their turn, so a customer can get a rule’s message as well as a flow’s.
Build a flow
Section titled “Build a flow”-
Open Flows and press New flow, give it a name and press Create. Or open Start from a template and press Use template on a ready-made flow. Either way you get a draft.
-
In the strip above the canvas, pick the Trigger (see below) and, optionally, an Idle timeout.
-
Add steps from the card palette on the right: click a card, or drag it onto the canvas. Connect each step to the next by dragging from a step’s right edge to the next step.
-
Click a step to edit it. Back to cards returns to the palette.
-
Test it on the Playground tab, then press Publish.
The builder saves your draft as you work (“Saving…” / “Saved” in the top bar). Undo and Redo (Ctrl/⌘ + Z, Ctrl/⌘ + Shift + Z) and Auto-arrange, which lays the steps out as a tidy left-to-right tree, are in the top bar too.
Triggers
Section titled “Triggers”| Trigger | When the flow starts |
|---|---|
| Keyword | The customer’s message contains one of your comma-separated keywords. |
| First message | The first message from a customer who has never been through a flow in that chat. |
| Voice note | The customer sends a voice note. It is transcribed, so later steps can use the words. |
| Manual | Only when someone starts it from a chat in the inbox, or through the public API. |
How keywords match:
- Case doesn’t matter, and a keyword matches at the start of a word:
plotmatches “plots” and “plot enquiry”, but not “teleplot”. - A keyword can be a phrase. When several keywords match, the longest wins,
so
book plotsbeatsbookandplot. - A keyword belongs to one flow or AI agent. The builder warns as you type if another flow or agent already uses it, and refuses to save the clash.
Only one flow or AI agent in the workspace can own the first-message trigger. The Message routing card at the top of the Flows page shows which one owns Customer’s first message and lets you change it. Picking a new one moves the old one to Manual.
If no flow has a Voice note trigger, a voice note’s transcript is checked against your keywords instead.
The palette groups the cards by what they do.
Send a message
Section titled “Send a message”| Card | What it does |
|---|---|
| Send Text | Sends a text message. Use {{variable}} to fill in saved answers. |
| Send Buttons | Sends a message with up to 3 reply buttons and waits for a tap. The flow branches on the button chosen. |
| Send Form | Sends one of your published forms (see Forms). |
Ask questions
Section titled “Ask questions”| Card | What it does |
|---|---|
| Ask Text | Asks a question and waits for any typed reply. |
| Ask Number, Ask Phone, Ask Email, Ask Date, Ask Link | The same, but the answer must look like a number, phone number, email, date or web link. An answer that doesn’t fit gets a short hint, and the question waits for a valid one. |
| Ask Buttons | The same step as Send Buttons: up to 3 buttons, and the flow branches on the choice. |
Each Ask step saves the reply under the name in Save answer as, for example
city. Later steps can use it as {{city}}. A saved answer lasts only while
that run of the flow lasts. It is not written to the contact.
Buttons hold at most 20 characters each. A button step also has a no match branch: connect it to handle a customer who types something instead of tapping. If it is not connected, the question is sent again.
| Card | What it does |
|---|---|
| Call API | Calls an outside service mid-conversation and branches on success or error. See Call an API from a Flow. |
| Card | What it does |
|---|---|
| Condition | Branches true or false on checks: the chat has a tag, the customer’s message contains a word, or a saved answer equals, contains, exists, or is greater or less than a value. Match all checks or any check. A Condition with no checks is always true. |
| Handoff to agent | Hands the chat to a person and stops the flow. Auto (least-loaded agent) assigns the least-busy teammate who is available; if nobody is, the chat stays unassigned. Leave in pool leaves it unassigned for anyone to claim; until someone does, an AI agent set to answer unhandled messages can reply to the customer. An optional internal note is added to the chat. |
| End | Ends the flow. Nothing after it runs. |
Actions
Section titled “Actions”These run in the background and send nothing to the customer.
| Card | What it does |
|---|---|
| Add Tag / Remove Tag | Adds or removes a tag on the chat. |
| Assign Agent | Assigns the chat to the least-busy available teammate. |
| Add Note | Adds an internal note to the chat. {{variable}} works here. |
| Save Feedback | Keeps every typed answer collected so far as one feedback record for this customer. Put it after your questions. |
The Action step’s dropdown has three more options that have no card of their own:
| Option | What it does |
|---|---|
| opt out | Adds the customer to your opt-out list so broadcasts skip them. |
| set lead field | Writes a value onto the lead record linked to the chat, so it stays there after the flow ends. Enter the field and a value; {{variable}} works in the value. It only does something for chats linked to a lead from your CRM — on any other chat it is skipped. |
| enroll sequence | Not available. Sequences aren’t part of Whatbot, so this option does nothing — the flow carries on as if it had run. Don’t use it. |
Variables you get for free
Section titled “Variables you get for free”| Variable | Holds |
|---|---|
{{name}} | The contact’s name |
{{phone}} | The contact’s phone number |
{{trigger_text}} | The message that started the flow |
{{voice_text}} | For a voice-note start: the transcript |
A placeholder with no value is sent as it is written, so a {{city}} that was
never asked for appears to the customer as {{city}}.
Drafts, publishing and versions
Section titled “Drafts, publishing and versions”A flow runs for real customers only once it is published. Until then it is a draft: saved, but inert.
Publish checks the flow first and lists anything that stops it:
- there is exactly one trigger, and every step is connected to something;
- button steps have 1 to 3 buttons, each no longer than 20 characters;
- Ask steps have a question;
- Send Form steps have a published form picked;
- Call API steps have a URL.
Each publish saves a new numbered version, and the top bar shows Published v3. You can keep editing a published flow: changes go live only when you publish again. A customer who is in the middle of a flow finishes on the version they started, so publishing never changes a conversation already under way. The Logs tab shows which version each run used.
Test with the Playground
Section titled “Test with the Playground”The Playground tab runs your draft, not the published version, in a chat window inside whatbot. Type as the customer and tap the buttons. Nothing is sent on WhatsApp and nothing is written to your inbox. Restart runs it again from the top. A Send Form step shows as a placeholder line.
Start a flow by hand
Section titled “Start a flow by hand”A flow with the Manual trigger never starts on its own. To run it, open the chat in the inbox, press Flows/Forms in the chat header (on narrower screens it shows only the flow icon), choose Start flow and pick the flow. Only published manual flows are listed.
A customer can be in only one flow at a time. Starting another while one is still running is refused. Unassign the chat first if the flow asks questions: as above, a flow doesn’t answer replies in an assigned chat.
Idle timeout
Section titled “Idle timeout”Idle timeout is how many minutes a flow waits for the customer to answer a question. When it runs out, the flow is abandoned and the run is marked expired. If the customer replies later, their reply is treated as a new message, so a matching keyword or voice-note trigger starts the flow again from the beginning. A first-message flow doesn’t restart: that trigger fires only in a chat that has never run a flow. Leave the box empty to wait for as long as it takes.
The 24-hour window
Section titled “The 24-hour window”WhatsApp allows free-form messages only within 24 hours of the customer’s last message (see the messaging window). A flow almost always runs in reply to the customer, so the window is open. When it is not, for example a manual flow started on a chat that has been quiet for days, the next step that would send something waits instead, and the run shows as paused window. When the customer writes again, the flow picks up from that step.
Flow logs and export
Section titled “Flow logs and export”The Logs tab lists every run of the flow, newest first: the contact, status, how many steps it got through, the version, when it started and its last step. Click the contact to open the chat. Click a row to see what the customer answered, question by question.
| Status | Meaning |
|---|---|
| active | Running right now |
| waiting input | Waiting for the customer to answer |
| paused window | Waiting for the customer to reopen the 24-hour window |
| paused handoff | Handed to a person |
| completed | Reached the end |
| expired | The idle timeout ran out |
| cancelled | The chat was closed while the flow was running |
| failed | Something went wrong. A flow that loops through 25 steps without stopping for an answer is also stopped as failed, and so is a run that reaches 500 steps in total over its whole life |
Export CSV downloads the runs that are loaded, one row per answer: contact, phone, status, start time, question number, question and answer. The note under the button says whether that is all runs or only the ones loaded so far. Press Load more first to include older runs. Phone numbers follow your workspace’s privacy settings.
To get flow results into your own systems as they happen, subscribe to the
flow.completed and flow.step_completed webhook events.
Which number a flow sends from
Section titled “Which number a flow sends from”A flow always replies from the number the customer’s chat is on, so a
workspace with several numbers needs no extra setup. A flow started through the
public API can name its sending number with from; without it, the
workspace’s default number is used.
A form is a single screen of fields with a Submit button that the customer opens and fills in inside WhatsApp. Answers come back to whatbot together.
Build and publish a form
Section titled “Build and publish a form”-
Open Forms and press New form.
-
Give it a Form name and, optionally, a Description.
-
Press Add field for each question. Give it a Label, pick a Type, and switch on Required if it must be answered. Drag fields to reorder them. The Preview on the right shows the form as you build it.
-
Press Create form to save the draft, then Publish.
| Field type | The customer gets |
|---|---|
| Text | A one-line text box |
| Phone | A text box for a phone number |
| A text box for an email address | |
| Number | A number box |
| Long text | A multi-line text box |
| Date | A date picker |
| Dropdown | A list to pick one option from |
| Radio | Options shown as a list of choices |
Dropdown and Radio fields need at least one option.
Publishing registers the form with WhatsApp. After that it can be sent.
You can edit a published form and press Re-publish to send the change to WhatsApp. In the responses, submissions are then grouped into After the latest edit and Before the edit on date, so answers to old and new questions don’t get mixed up.
Send a form
Section titled “Send a form”- From a chat: press Flows/Forms in the chat header, choose Send form and pick a published form.
- From a flow: add a Send Form step and pick a published form. The flow doesn’t wait for the form to be filled in. It moves on to the next step straight away.
The customer sees a message with a button carrying the form’s name. A form counts as a normal reply, so it can only be sent within the 24-hour window. From the inbox, a send outside the window is refused. In a flow, the step waits, as described in the 24-hour window.
Where submissions appear
Section titled “Where submissions appear”When a customer submits a form, the answers show up in two places:
- In the chat, as an internal note: ”📋 Form submitted — form name”, then each field and its answer. Customers never see notes.
- On the form, under its Responses tab, newest first. The Forms list shows how many responses each form has.
Export responses
Section titled “Export responses”- Export CSV on the Responses tab downloads the responses on screen, or use the download button on the form’s row in the Forms list. Up to the most recent 1,000 submissions are loaded.
- When a form has more than that, the Responses tab says so and offers
Export full history. Admins and supervisors can use it to get every submission: the file
is prepared in the background on the Downloads page at
whatbot.in/analytics/exports; there is no menu link to that page yet, so open it by address and download the file from there when it is ready.
Phone numbers in exports follow your workspace’s privacy settings.
See also
Section titled “See also”- AI agents: answer what no flow catches.
- Automation rules: react to tags, tickets and waiting customers.
- Call an API from a Flow
- Webhooks: the
flow.*events.