Introduction to Flows

A flow visually represents conditional branch logic that is applied to contacts upon entry. Once a contact enters a flow, they interact directly with its nodes. Nodes consist of actions and split actions, which define the flow’s length—ranging from a single node to an extended sequence.
Actions
An action signifies an operation performed within the flow. Essentially, these are commands that enable you to:
-
Send a Message (delivers a message and/or media attachment to active contacts upon reaching that node)
-
Send a Message to Someone Else (outside the current interaction)
-
Add or Update Contact Fields (e.g., using a value from a response)
These actions are executed immediately in top-to-bottom order.
Split Actions
These serve as pivot points within a flow, dividing it into new branches. They are conditional statements that direct contacts based on evaluations of:
-
An incoming message or recording
-
An airtime transfer
-
A contact’s activity in a subflow
-
A flow variable
-
An expression
-
Random branch assignment
-
Group membership
Anatomy of a Wait for Response Split Action
Split actions include five inputs that form a powerful conditional structure:
A – The type of RuleSet to create:
-
Wait for Response: Awaits an incoming message and evaluates it against response rules. An optional timer can trigger a reminder after inactivity or create a pause.
-
Call a Webhook: Calls a URL with flow context (available variables including contact responses and info). Returns are stored for reference via
@webhook
. Includes ‘Successful’ and ‘Failed’ categories for error handling.
-
Call Zapier: Adds a flow event corresponding to a Zapier trigger. Responses are sent to Zapier for integration with 500+ apps—no coding required. See the guide to begin.
-
Transfer Airtime: Transfers airtime to prepaid phones across 400+ networks in 100 countries.
-
Enter a Flow: Starts the active contact in a child flow, then returns to the parent. New conditions: Completed and Expired. Use
@parent.[field]
for parent variables and@child.[field]
for child flow variables. Learn more about variables here. -
Split by contact field: Applies response rules to a value in a contact field (e.g., Name, Phone), referenced as
@contact.[variable-name]
(e.g.,@contact.state
). -
Split by expression: Evaluates the result of an expression (e.g.,
@(REMOVE_FIRST_WORD(input.text))
), which may include variables, functions, or both. -
Split by flow result: Applies rules to values separated by a delimiter (e.g., space, plus, period). See the guide for details.
-
Split randomly: Creates evenly distributed buckets for random branching (e.g., A/B testing). Refer to the A/B testing guide.
B – The operand (a variable or expression) against which response rules are evaluated. In a Wait for Response action, this is typically @input.text
(the incoming message).
C – The response rules that assess the operand. Rules are processed left to right; the first match applies, and subsequent rules are skipped.
D – The timeout duration after which a non-responsive contact is routed via a No response category. This can connect to a reminder message or remain unconnected to exit the flow. Learn more about timeouts here.
E – The value(s) response rules match against the operand. For example, a Split Action might match Nigerian northern state names. Using has any of these words, a response containing “Adamawa” would place the contact in the “Northern States” category. The last rule must be a catch-all (e.g., “Other”) to ensure every response is categorized.
F – The category where contacts are placed if the operand matches a rule. Categories are pathways to new nodes, directing the contact onward. A category passage is recorded as a response in analytics.
G – The name of the flow variable created and populated by the Wait for Response action. In the example, the result is saved to @results.question_1_response
.
Flow Membership
Flows are states contacts enter and exit. Upon entry, a contact becomes an active flow member until exit. The journey from entry to exit—including all intermediate activity—constitutes a run. Runs and their details are displayed in flow results and can be managed via the Flow Run API endpoint.
Active members are indicated by a blue icon on the top left of each node:
Click the icon to send a follow-up message.
Entering a Flow
Contacts can enter flows via:
-
Manual placement using the “Start” button in the flow editor. Options include:
-
Have not started in this flow in the last 90 days to exclude recent participants.
-
Are not currently in a flow to avoid interrupting active flows. Note: Removing a contact from a flow prevents re-entry.
-
Have sent a message in the last [period] to target active contacts (adjustable timeframe).
-
-
Triggering by a campaign event.
-
Calling your channel’s phone number.
-
A missed call from the contact.
-
Sending an unhandled message to your channel.
Exiting a Flow
Contacts exit flows when:
-
They pass through the final node.
-
They reach an unconnected node.
-
They pass through an Enter another Flow action.
-
They expire due to inactivity (configurable in the flow editor’s ☰ Edit menu).
New flows default to a 3-day expiration, adjustable via dropdown.
Flow Membership Rules
Contacts may interact with only one flow at a time. While active in a flow, their responses are handled exclusively by that flow until exit or expiration.