Skip to main content
A WhatsApp Flow is a structured, multi-screen experience that runs inside WhatsApp. The customer taps a button and steps through screens with inputs like text fields, dropdowns, date pickers, and checkboxes, then submits, all without leaving the chat.

Sign-up & onboarding

Lead capture

Surveys & feedback

Bookings & reservations

You design and publish a flow in WhatsApp Manager, then reference it by its flowId. This page covers how to send one through the API.

Sending a flow

A flow is delivered as a message whose single call-to-action button opens the flow. Send it with message.flowMessage:
FieldDescription
flowId / flowNameIdentifier or name of your flow. Provide exactly one.
flowTokenYour own reference string. WhatsApp returns it unchanged in the flow response webhook, so you can match the response to this send. See flow_token.
flowCtaText on the button that opens the flow.
flowActionnavigate or data_exchange. See navigate vs data_exchange.
flowActionPayloadScreen and data to start with. Required or forbidden depending on flowAction, see below.
flowMessageVersionWhatsApp Flow message version. Currently "3".
WhatsApp only allows a pre-approved template as the first message to a customer you have not been messaging. To reach someone new, put the flow on a template as a flow button, see Opening a conversation with a template.
A flow opens in one of two modes. Choose based on how the first screen is built.
navigatedata_exchange
Who builds the first screenYou. A static screen already defined in the flow.Your endpoint, at open time.
flowActionPayload.screenRequired. Must be the flow’s entry screen id.Must be omitted. The endpoint decides the first screen.
flowActionPayload.dataOptional. Passed to that screen.Optional starting data for the endpoint.
Endpoint needed to openNo. Renders on the device.Yes. WhatsApp calls your endpoint.
Use it forStatic flows, or when you already know the entry screen.Dynamic flows whose content is fetched live.
These two mistakes return a 400 from the API, instead of a 200 that fails silently at WhatsApp:
  • data_exchange with a flowActionPayload.screen. The endpoint owns the first screen, so no screen may be specified.
  • navigate without a flowActionPayload.screen, or omitting flowAction (it defaults to navigate). Navigate always needs the entry screen.
A navigate example, opening at a specific screen:
The screen value must exactly match the flow’s entry screen id. WhatsApp rejects any other value.

Endpoints (data_exchange)

A data_exchange flow calls an endpoint you host to build each screen. Your endpoint implements the WhatsApp Flows data-exchange contract: WhatsApp calls it (encrypted) when the flow opens and on each screen submit, and it returns the next screen and its data.
Opening a data_exchange flow triggers a call to your endpoint. If it is unreachable or errors, WhatsApp shows “Something went wrong” when the customer opens the flow. The send itself still succeeded; only the open failed.

flow_token

flowToken is any string you generate to identify a send, for example an order or record id. It is not a credential and does not need to be secret. WhatsApp stores it and returns it unchanged in the flow response webhook when the customer completes the flow, so you can tie the response back to the right customer and context.

Opening a conversation with a template

WhatsApp requires the first message to a customer to be a pre-approved template. To start a flow with someone you have not been messaging, attach the flow to a template as a flow button in WhatsApp Manager, where it is bound to your flowId, mode, and entry screen. Then send the template:
button_N_custom_wa_flow_action_data (where N is the flow button’s position, 1-based) passes starting data for the first screen as a JSON string. It is optional. See Send template messages for the full parameter reference.