Reply flows are a beta. Your team must be enrolled before the API accepts
reply flow requests; other teams receive
403 feature_unavailable.How a reply flow runs
- Create a reply flow revision with the Messaging API (Create project campaign reply flow) or the Platform API (Create campaign reply flow).
- Attach it to a draft or scheduled campaign (Messaging, Platform).
- When a campaign message is sent, the flow starts for that recipient on the entry step, which sends nothing and waits for the first reply.
- A reply that matches one of the step’s branches moves the recipient to the next step, which sends its message. A reply that matches nothing is ignored.
Limits
A revision cannot be edited. To change a flow, create a new revision with the
same
flowKey and a higher revision, then attach it to a new campaign. A
launched campaign keeps the revision it launched with.
Branches
Each branch has amatch and the step it moves to:
choice: the recipient tapped a reply button (replyKind: "button") or a list row (replyKind: "list") with thisid. A step that sends buttons or a list can branch only on the choices it offers.keyword: the reply text equals this keyword, ignoring case. A reply that quotes the step’s message always counts. An unquoted reply counts only when this is the recipient’s only waiting flow and no other campaign message reached them since the step’s message. Built-in STOP and START words cannot be flow keywords.flow_submission: the recipient submitted the Flow form this step sent. Polymorfa does not store the form answers.
Messages a step can send
A
flow_form step on a linked number ends the recipient’s flow without
sending. Follow-up messages use the same sending checks, funding, and number
protection as other messages from that number. If Polymorfa cannot confirm
whether a follow-up message reached WhatsApp, it never sends it again. It checks
the send record: a confirmed send continues the flow, and a message that was
never sent, or a flow that reaches its 24-hour lifetime first, ends the flow.
Example
message.received events
with payload.replyChoice. See Webhooks.