WhatsApp Flows
Design interactive multi-screen forms and guided experiences that run natively inside WhatsApp — no links, no redirects.
What are WhatsApp Flows?
WhatsApp Flows (part of the official Meta Flows API) let you build interactive screens that appear inline in a WhatsApp conversation. They're ideal for:- Lead capture forms (name, email, phone, interest)
- Appointment booking and scheduling
- Product catalog browsing and ordering
- Customer satisfaction surveys (NPS, CSAT)
- Registration and onboarding questionnaires
- Support ticket creation
Note
Flows run entirely within WhatsApp — the contact never leaves the app or opens a browser. This dramatically increases completion rates compared to external form links.
Flow Builder
1
Create a new Flow
Go to Dashboard → Flows → New Flow. Give it a name and select the category (Sign Up, Appointment, Customer Service, Survey, etc.). The category is reported to Meta and affects how the flow is reviewed.
2
Add Screens
A Flow is made of one or more Screens. Each screen is a page the contact sees. Use the + Add Screen button and drag to reorder. Common patterns:
- Single screen — simple lead form
- Two screens — collect info → confirmation
- Multi-screen — wizard / booking flow
3
Add Components to each Screen
Drag components from the right panel onto your screen:
| Component | Use case |
|---|---|
| Heading / Subheading / Body / Caption | Static text. |
| Rich Text | Markdown — headings, lists, links, tables. |
| Text Input | Single line. Text, number, email, phone, password or passcode, with an optional validation pattern. |
| Text Area | Multi-line text. |
| Dropdown | Pick one from a long list (up to 200). |
| Radio Buttons | Pick exactly one (up to 20). |
| Checkboxes | Pick any number (up to 20). |
| Chips | Multi-select chips. |
| Date Picker | A single date. |
| Calendar | A date or a date range, with blocked dates and selectable weekdays. |
| Photo Upload | Camera or gallery. Up to 25 MB per file. |
| Document Upload | File attachments. Cannot share a screen with Photo Upload. |
| Image / Image Carousel | One picture, or swipe through up to three. |
| Opt-in | A consent checkbox, optionally linking to your terms. |
| Link | An inline tappable link. |
| Navigation List | A rich list where each row opens a different screen. |
| If / Switch | Show different components depending on an earlier answer. |
| Footer Button | The screen's primary action — next screen, or finish. |
4
Configure routing
Each screen's footer button can route to the next screen or complete the flow. On completion, you define what data is sent back to MotherBot and how it's used (store in contact fields, trigger a chatbot action, send a template reply).
5
Add live data (optional)
A plain form shows the same thing to everyone. Turn on Live data in the flow's settings and each screen can load information that only exists when the customer opens it — your products, the appointment times still free today, or what you already know about that contact. The same setting lets you check answers before the customer moves on, send different people to different screens, and write answers straight onto their contact record. There is nothing to host and no code to write.
6
Publish the Flow
Click Submit for Review. Meta reviews Flows (usually within 24 hours for standard categories). Once approved, the Flow status changes to Published.
Attaching Flows to Messages
Published Flows can be triggered in two ways:- Template button — add a Flow button to a message template. Works in a broadcast, so you can collect structured data from a large audience.
- Chatbot — a Send Flow node opens the form mid-conversation, and a Receive Data node picks the answers back up.
- Live chat — an agent can send a form straight into an open conversation.
- API — POST /v1/messages with an interactive message of type flow.
Tip
However it is sent, the answers come back linked to the contact who filled it in — and to the chatbot run, broadcast or agent that sent it.
Tip
Combine a campaign with a Flow button template to collect structured data from a large audience. This is powerful for surveys, registrations, and appointment booking at scale.
Live Data From Your Connected Apps
With Live data on, a screen can load its lists from the apps you have already connected — no code, and no API token pasted into a form.| App | What a screen can show |
|---|---|
| Shopify / WooCommerce | Live products, or this customer's own orders. |
| Zoho CRM | This customer's leads, contacts, deals — or any module you use, by its API name. |
| HubSpot | This customer's record, or the deals attached to it. |
| Salesforce | This customer's contact, leads, cases or opportunities. |
| LeadSquared | This customer's lead record, matched on their number. |
| Zendesk / Zoho Desk | Your groups or departments, or this customer's own tickets. |
| Shiprocket | This customer's shipments, or one consignment's tracking history. |
| Calendly | Your event types, or the real free times for one of them. |
| Trello | Lists on a board, or the cards in a list. |
| Google Sheets | Rows from a tab, filtered on any column. |
| Your own API | Any HTTPS endpoint, with the response mapped to a list. |
Showing One Customer Only Their Own Records
Every list of records that belongs to a person — orders, tickets, deals, leads, shipments — asks whose before it will run. The answer defaults to whoever opened the form, matched on their WhatsApp number, so “your orders” means theirs.Warning
There is no “show everything” option, and that is deliberate. If we cannot work out whose records to show, the screen shows none. A list that quietly widened to the whole account would hand one customer another customer's name, order value or complaint — on a screen nobody would think to check.
- Numbers are matched on their last ten digits, so a record saved as 9876543210 still matches a customer who arrives as 919876543210.
- Zendesk finds a ticket by its requester's email address — a contact with no email on file sees nothing rather than everything.
- HubSpot deals are read through the matched contact, because a deal carries no phone number of its own.
Reacting While the Customer Is Still Filling It In
A form that only reports back at the end is a form. A form that answers as the customer moves through it is an application — and every screen component that can be picked, cleared or tapped can ask your server what to do about it.- When they pick an option — a dropdown, radio, checkbox, chips or date changed.
- When they clear one — they took a choice back.
- When they tap something — a link, an opt-in, or a row in a navigation list.
- When the screen opens — before they have touched anything.
Tip
Scope the rule to one component when a screen has several. A country, state and city cascade fires from all three, and a rule left unscoped answers for every one of them.
| What you want | How it is built |
|---|---|
| A dependent list — pick a country, the city list reloads | Bind the second list to a data source filtered by the first answer. Nothing else is needed: the list is re-read on every selection, with the new answer already in scope. |
| A live total — quantity × price, with tax | A Do a calculation rule on select, writing into a data field the screen displays. |
| Real availability — the slots still free for that date | The Slots data source, plus a rule on select so it refreshes when the date changes. |
| Stock, price or eligibility from your own system | A Call a URL rule on select, then Set a value from what it returns. |
| Telling them straight away that something will not work | A Show an error rule on select. They stay on the screen and see why. |
| Jumping ahead when they choose “something else” | A Go to a screen rule on select. Routing on an interaction is allowed — it is just not the default. |
What a Button Sends
WhatsApp sends your server — and returns to you at the end — exactly what the button is set to carry, and nothing else. It does not attach the rest of the form on your behalf.Tip
Left alone, every finish button and every “ask the server” action sends every answer on its screen, plus anything carried in from an earlier one. That is almost always what you want. Open What to send on the button only when you need to send something different.
Accessing Submitted Responses
Every submission is stored. You can read it in:- Responses — each flow has its own list of submissions, with a CSV export.
- Contact profile — answers you mapped to contact fields are written onto the contact.
- Conversations — the thread shows the completed form with the answers.
- Chatbots — a Receive Data node reads the answers into variables and carries on the conversation.
- Workflows — a “Form submitted” trigger, which can be pointed at one particular form.
- Webhooks — a flow.submitted event carries the answers both as typed values and as display strings.
Reading the Answers in a Chatbot
Use a Receive Data node set to Flow response, or a Send Flow node set to wait for the reply. Either way the answers arrive as variables named after the fields, under the prefix you choose:- {{flow_email}} — one variable per field, ready to put in a message.
- {{flow_interests}} — a multiple-choice answer as a readable list, e.g. “pricing, demo”.
- {{flow_interests_count}} — how many were ticked, for branching without parsing text.
- {{flow_json}} — everything at once, for a Call a URL step.
- {{flow_name}} — which form it was, when one node handles several.
Reading the Answers in a Workflow
Choose the Form submitted trigger and, if you want, pick which form. Then insert the answers anywhere a workflow takes text:- {{trigger.values.email}} — an answer as it reads, which is what you want in a message.
- {{trigger.responses.interests}} — the same answer with its type intact, for a step that needs a real list.
- {{trigger.flowName}} — which form was submitted.
- {{trigger.contactPhoneNumber}} — who submitted it.
Tip
The Insert button beside any text box lists every one of these for the trigger you picked, so there is nothing to memorise or spell correctly.
Flow Limits
| Limit | Value |
|---|---|
| Components per screen | 50 |
| Screens a single screen can lead to | 10 |
| Dropdown options | 200 (100 when options carry images) |
| Radio / checkbox / chips options | 20 |
| Option label | 30 characters |
| Footer buttons per screen | 1 |
| Links per screen | 2 |
| Opt-ins per screen | 5 |
| Images per screen | 3 |
| Uploaded file size | 25 MB |
| Whole flow | 10 MB |