Flow steps reference
Every trigger and step the flow builder offers, what each one does, its settings and the exits it leaves by.
This page lists every step in the builder's Add a step list, grouped as the list groups them. For each step you'll find what it does, its settings and its exits (the connections it can leave by).
Exits marked optional may be left unconnected: a run that leaves by an unconnected exit stops there. Every other exit must be connected before you can publish.
Start when (triggers)
A trigger starts a run for one contact. Every trigger sets {{triggered_at}}. Each trigger has a single exit, next.
Several triggers let you tick Only messages to these numbers (or Only conversations on these numbers / Only chats opened with these numbers). None ticked means every WhatsApp number of your organisation; you can tick at most 50. See Flows and WhatsApp numbers.
| Trigger | Starts when | Settings | Sets |
|---|---|---|---|
| Customer sends a message | A customer's message arrives. | Start on: Any message, or A message that is exactly a keyword (up to 20 keywords of up to 64 characters), with Start even while a person is handling the chat for a keyword. When. Numbers. | {{message_text}}, and WhatsApp Flow answers |
| Conversation opens | A new conversation starts, from a customer's message or a team member's direct message. | When. Numbers. | — |
| Customer opened the chat | A customer opens a chat with your number for the first time. | When. Numbers. | — |
| Tag added to a contact | A contact is given the chosen tag. | Tag. | — |
| Tag removed from a contact | The chosen tag is taken off a contact. | Tag. | — |
| Contact field changes | The chosen custom field gets a new value. | Contact field. | — |
| Webhook received | Your system posts to an inbound webhook. | Inbound endpoint, Where the contact's WhatsApp number is, Copy from the delivery. | Your mapped variables |
| On a schedule | Once, or every week at a set time. | How often (Once or Every week), When or At + On (days) + Time zone. | — |
| Started by a person | A team member starts it for one contact from the Runs tab. | Nothing to set. | — |
| Intent detected | A customer message is read as one of your intents. | Intents (leave empty for every intent; up to 50). When. Numbers. | {{message_text}}, {{intent}} |
| Conversation attributed | A new conversation is known to come from an ad, a tracked link or a campaign. | Sources: A Click-to-WhatsApp ad, A Facebook or Instagram post, A tracked link, A reply to one of our campaigns (none ticked = any source). Tracked links (optional). When. Numbers. | {{source_kind}}, {{source_id}} |
| Customer sends a cart | A customer's order message arrives from a product list. | Only carts worth at least (optional). Numbers. | {{cart_id}}, {{amount_micros}}, {{currency}} |
| Payment received | The payment gateway confirms a payment link was paid. | Numbers. | {{order_id}}, {{payment_link_id}}, {{amount_micros}}, {{currency}} |
| Payment failed | A payment link was declined, mismatched, errored or expired. | Failures (none ticked = any). Numbers. | As Payment received, plus {{payment_failure}} |
| Cart abandoned | A cart has had no order for the time you set. | Consider a cart abandoned after (10 minutes to 24 hours). Numbers. | {{cart_id}}, {{amount_micros}}, {{currency}} |
Good to know:
- When (on the message, conversation, chat-opened, intent and attribution triggers): Any time, Only while the number is open, or Only while the number is closed or on holiday, by the business hours of the number the customer wrote to. A number with no hours is always open.
- Keywords match the whole message. "order" does not start the flow on "cancel my order". Case and extra spaces are ignored. Opt-out words can't be used as keywords: opting out always wins.
- Messages sent by a flow never start a flow. Only your customers' messages do.
- Customer opened the chat does not open the 24-hour window, so reply with a template. The builder warns you if a free-form step follows this trigger before any template step.
- Tag and field triggers can be set off by another flow's tag change, up to five flows deep; past that the chain stops.
- On a schedule runs have no contact, so they can't message anyone. They can call your systems. To message a list of contacts on a schedule, use a broadcast.
- Webhook received finds the contact by the WhatsApp number at the path you give (for example
customer.wa_id), which must belong to an existing contact. See Inbound webhooks. - Intent detected relies on the AI classifier, so it only fires when AI is switched on for your workspace. See Intents.
Message
All message steps go through the same checks as any other message: the contact's consent, the 24-hour window and template approval. While a person owns the conversation, a flow's messages are not sent. Most message steps have a Send from setting; see Flows and WhatsApp numbers.
Send buttons
A message with up to three reply buttons. Each button is its own exit.
- Header (optional, up to 60 characters), Message (up to 1,024), Footer (optional, up to 60).
- Reply buttons: 1 to 3, each with a title of up to 20 characters. Titles must all differ.
- Wait for a reply for: 1 minute to 24 hours (default 24 hours).
- Send from.
Exits: one per button; no reply (optional: the wait ran out, or the 24-hour window closed); failed (optional: the send was refused or failed).
A customer can tap a button or type its exact title. Any other reply leaves the run waiting.
Send a list
A menu that opens a list of up to 10 options. Each row is its own exit.
- Header, Message, Footer as above; Menu button (the label that opens the list, up to 20 characters).
- List rows: up to 10 rows in total, grouped into up to 10 sections. Row titles up to 24 characters, with an optional Description of up to 72. Section titles up to 24 characters, required when there is more than one section.
- Wait for a reply for, Send from.
Exits: one per row; no reply; failed.
Ask a question
Sends a question, waits for a typed answer, checks it and saves it in a variable.
- Question (up to 4,096 characters).
- Expect: Any text, A number, An email address, A phone number or A date.
- Save the answer in: a variable you declared whose type fits the answer.
- Ask again: Never to 5 times (default 2). When the answer does not fit, say: optional; otherwise the question is repeated.
- Also save it on the contact: optional contact field.
- Wait for a reply for, Send from.
Exits: answered; invalid answer (optional: still wrong after the retries); no reply; failed.
Send a message
Free-form text. Sent only inside the 24-hour window after the customer last wrote.
- Message: the text, with variables.
- Send from.
Exits: sent; refused (optional: outside the window, opted out, a person owns the conversation, and similar); failed (optional).
Send a template
An approved message template, which can be sent outside the 24-hour window.
- Send from: choose this first, because it decides which templates are offered.
- Template: an approved template.
- One value per template variable (
{{1}},{{2}}, ...): Text, A variable, or A fixed number or true/false. Fill them in order. - Coupon code: shown only for a template with a copy-code button, and then required. It can be The same code for everyone, A variable or contact field, or Text with variables; up to 15 characters.
Exits: sent; refused; failed.
A variable with no value refuses the step rather than sending a message with a gap. If a template has an image, video or document header, set its default header media on the template (see Template variables and buttons); the step has no media picker.
Decide
Business hours
Asks whether you are open right now. Whose hours: This number's hours (the number the customer wrote to: its own hours, or the organisation default), A schedule, or A department's hours. Set hours under Settings → Business hours; see Business hours in a flow.
Exits: open; closed; holiday (optional; unconnected, a holiday leaves by closed). Leaving by closed or holiday sets {{next_open_at}}; a holiday also sets {{holiday_name}}.
Condition
Branches the run. Click Add branch for each path; branches are tried in order and the first whose rules match is taken. If none match, the run leaves by otherwise.
Each branch has an Exit name (shown on the canvas), Match: All of these rules or Any of these rules, and rules added with Add rule. A rule can test:
| Subject | Tests |
|---|---|
| A variable | is, is not, is more than, is at least, is less than, is at most, contains the text, starts with the text, has a value, has no value |
| A contact tag | has the tag, does not have the tag |
| Business hours | A department is open now / is closed now |
| The time of day | is before / is after a time, in a time zone you choose |
| The day of the week | is one of / is not one of the days you tick |
| How an earlier step went | A step went / did not go through, refused or failed |
Exits: one per branch, plus otherwise.
Consent is not something a condition can test: a flow can't branch around an opt-out.
Wait
Wait
Pauses the run. Choose Wait:
| Mode | Continues |
|---|---|
| For a set time | After the time you set (1 minute to 30 days). |
| Until a date and time | At that moment, or at once if it has passed. |
| Until the time in a variable | At the time in a Date and time variable, or at once if empty or past. |
| Until a department's business hours | When the department is open (at once if it already is). |
| Until a person releases the conversation | By released when nobody owns the conversation, or by timed out after the limit you set. |
Exits: next, or released and timed out for the last mode.
Tip: Any loop in a flow must include a For a set time wait (or a step that waits for the customer's reply). Without one, publishing is refused, so a loop can't repeat instantly.
People
Assign
Gives the conversation to A department, A queue or A person through your routing rules, and carries on.
Exits: assigned; queued (nobody was free, so it waits in the queue); refused; failed. Once a person owns the conversation, the flow's later messages are not sent, so nobody is talked over.
Hand over to a person
Assigns like Assign, then the flow stays silent while a person owns the conversation.
- Give the conversation to.
- Continue the flow when the person releases the conversation: off, the flow ends here; on, the flow pauses until nobody owns the conversation or until Pause for at most (required) passes.
Exits: with the switch on, released and timed out; always refused and failed (optional).
Tag the contact
Add the tag or Remove the tag, and the Tag. Changing a tag can start other flows (up to five deep). In a test, it starts no other flow.
Exits: next; failed (optional).
AI
AI agent
One of your AI agents answers the customer's latest message from your knowledge, or hands the conversation over to a person.
- AI agent: any of your agents. The step always uses the agent's live version, so publishing the agent changes what this flow says from the next run on. Open the agent and Manage agents take you to the agent pages.
Exits: answered; handed over (optional; unconnected, the run ends); refused; failed.
The flow can't be published until the chosen agent has a published version, and it is refused if AI is switched off for your workspace. See AI agents overview.
Commerce
These steps need the Commerce features (catalogs and orders). See Catalogs and Orders.
Send products
Sends one product, or a list of 2 to 30 products in one section, from a Catalog. Optional Header, Body, Footer, and a Section title (up to 24 characters) for a list. Inside the 24-hour window only.
Exits: sent; refused; failed.
Send a payment link
Creates a payment link for the run's order and sends it as a message. Settings: Gateway, Link expires after (10 minutes to 7 days) and Message (use {{link}} where the link goes; blank uses a standard sentence). The run needs an order: a cart the flow accepted, or a run started by a payment or order trigger.
Exits: sent; refused; failed.
Note: A flow with this step can only be published when payment links are switched on for your workspace.
Update the order
Set the order to: Accept the cart (placed), Fulfilled, Cancelled or Refunded. Only these moves are allowed: paid to fulfilled; placed or paid to cancelled; paid to refunded. "Paid" is never set by hand: an order becomes paid only when the gateway confirms it. Accepting the cart turns it into an order and sets {{order_id}}.
Exits: next; refused (a move that isn't allowed); failed.
Call out
Both steps call your own system over https (port 443, a domain name). A call that times out may still have arrived and can be retried, so your system may receive it more than once; every call carries an Idempotency-Key header with the same value each time so your system can ignore repeats. Redirects are never followed.
HTTP request
Calls your system and reads the answer, for example a CRM or order lookup.
- Method (GET, POST, PUT, PATCH, DELETE) and URL (variables may go in the path or query, never the host).
- Sign in with: No credential or A stored credential (see Credentials).
- Headers: stored in plain text, so never put a secret here.
- Body fields (not for GET or DELETE): the JSON body, built key by key.
- Copy from the answer: paths like
order.items[0].sku, each into a variable.
Exits: success (a 2xx answer); refused (the address was refused); failed (timeout, error status, or an answer that can't be read).
Send a webhook
Posts the run's data to your system. URL, Sign in with, Headers, Include the contact's id and WhatsApp number, and Include variables (tick the ones to send).
Exits: delivered (a 2xx answer; its body is ignored); refused; failed.
Finish
End
Finishes the run. Nothing to set up. It has no exits.
Limits worth knowing
- A run stops after 200 steps and shows Stopped at the step limit.
- A flow started by another flow (through a tag or field change) can chain at most five deep.
Still need help?
Write to us at [email protected] and tell us what you were trying to do. Already a customer? Sign in to IconEngage — the same articles are under Help in the app.