A flow is the engine that powers automated conversations in RapidPro.app. It lets you design step-by-step logic—messages, questions, decisions, and updates—that contacts move through once they enter. Understanding how flows are structured, and how contacts enter and exit, helps you build reliable automations that scale.
In this guide, you’ll learn what flows are made of (nodes, actions, split actions), how split actions route contacts, how flow membership works (runs and active members), and the main ways contacts enter and exit flows.
10–12 min read
Flows
Updated on: 17/12/2025
Understand flows (fast path)
If you just need the essentials, follow this:
- Learn what a flow is: nodes + connections
- Use actions to do things (send, update, start, notify)
- Use split actions to branch contacts into paths
- Master Wait for Response + always keep an Other path
- Know how contacts enter flows (triggers, campaigns, manual start)
- Know how contacts exit flows (complete, unconnected, expire)
- Remember the rule: typically one active flow at a time
You’re done. These basics help you build flows that route correctly, collect clean data, and avoid overlapping conversations.
Step-by-Step Process
A flow is a visual map of logic applied to contacts after they enter.
- A flow is built from nodes connected by paths.
- Nodes contain either:
- Actions (do something immediately), or
- Split actions (evaluate something and branch).
- A flow can be as short as one node or as long as you need.
[CAPTURE: Flow editor showing a simple flow with 3–4 nodes connected, including at least one action and one split.]
Actions are commands your flow performs on behalf of the contact or your workspace.
Common actions include:
- Send Message (send text and/or media to the contact)
- Send Message to Someone Else (notify a supervisor or third party)
- Add Labels to Responses (organize responses)
- Update Contact Fields (save responses or modify contact attributes)
- Add/Remove from Group (segment contacts)
- Call a Webhook (send data to an external system)
- Send Email (send notifications or exports by email)
- Set Contact Preferred Language (route translations correctly)
- Enter Another Flow (launch a child flow)
- Start Someone Else in a Flow (start a different contact)
- Add an action node in your flow.
- Configure the action settings (message text, field updates, webhook URL, etc.).
- Actions run immediately, top-to-bottom, when the contact reaches the node.
[CAPTURE: An action configuration panel open (e.g., Send Message or Update Contact), showing the fields a user edits.]
Split actions are decision points. They evaluate a value (like a message reply or a contact field) and route the contact into different categories.
Split actions can evaluate:
- Incoming message content (text or recording)
- Webhook response data
- Zapier flow events
- Airtime transfers
- Contact activity in a child flow
- Contact fields (
@contact.*) - Flow variables/results (
@results.*) - Form fields (if applicable)
- Expressions
- Random distribution (A/B testing)
- Group membership
[CAPTURE: Flow editor showing a split action node with multiple exits/categories.]
Wait for Response is a split action that:
- Waits for an incoming message
- Evaluates it against response rules
- Routes the contact based on what they sent
- Optionally saves the response into a flow result variable (
@results.*)
A typical Wait for Response setup includes:
- Rule type: Wait for Response
- Operand: what you evaluate (usually the incoming text, like
@input.text) - Response rules: the matching logic (e.g., “has any of these words”)
- Timeout (optional): how long to wait before routing to “No response”
- Categories: the paths (e.g., “Yes”, “No”, “Other”)
- Result name: the variable name saved under
@results.*
[CAPTURE: Wait for Response configuration panel showing the operand, response rules, categories (including Other), and a result name.]
Depending on your use case, you can branch on different sources of data.
Common split action types include:
- Call a Webhook: send flow context to a URL and branch based on success/failure and returned JSON
- Call Zapier: trigger a Zapier event and pass contact responses to other apps
- Transfer Airtime: send airtime and branch based on success/failure
- Enter a Flow: start a child flow and branch on Completed vs Expired
- Split by contact field: evaluate
@contact.*(e.g.,@contact.state) - Split by expression: evaluate the result of an expression (functions + variables)
- Split by flow result: evaluate stored results, including delimiter-based parsing
- Split randomly: evenly distribute contacts into buckets for A/B testing
[CAPTURE: Split action type dropdown open, showing multiple split action options.]
Flows are states that contacts enter and exit.
Key concepts:
- A run is one complete journey through a flow (entry → exit).
- A contact is an active member of a flow while they are still inside the run.
- Active members may be indicated by a badge/icon on nodes in the editor.
- Use the flow’s results/analytics to review runs and behavior.
- Use the active member indicator to see where contacts currently are.
[CAPTURE: A node in the flow editor showing the “active member” indicator and a way to message them.]
Contacts can enter flows in multiple ways, including:
- Manually, from the flow editor using Start
- Through a campaign event
- By sending a keyword trigger
- By calling your channel phone number
- By triggering a missed call flow (if configured)
- By sending a message not handled elsewhere
When starting a flow manually, you may see options such as:
- “Have not started in this flow in the last 90 days”
- “Are not currently in a flow”
- “Have sent a message in the last 90 days” (to target active contacts)
[CAPTURE: Start Flow dialog showing targeting checkboxes like “not currently in a flow” and “have not started in last 90 days”.]
Contacts exit flows when:
- They reach the final node and complete the flow
- They reach an unconnected node (no next step)
- They pass through Enter Another Flow (depending on your design)
- They expire after a period of inactivity
Flow expiration settings are usually configured from the flow editor menu (often a ☰ icon), where you can set:
- Default expiration (often 3 days in new flows)
- A custom expiration period (dropdown)
[CAPTURE: Flow editor menu open showing “Expiration” settings and a dropdown to set duration.]
Flow membership rule:
- A contact can only interact with one flow at a time.
- While a contact is active in a flow, their replies are handled only by that flow until they exit or expire.
Common Issues & Quick Fixes
Problem: My flow isn’t capturing responses correctly.
Fix: Confirm the Wait for Response node has a Result name set. Make sure response rules match what contacts actually send. Add a clear Other path with a correction message and loop-back. Test in the simulator and check the action log.
Problem: Contacts get stuck in the flow.
Fix: Check for unconnected nodes (no outgoing path). Add a No response timeout to Wait for Response and route it to a reminder message. Review your flow expiration setting and extend it if needed.
Problem: Starting a flow interrupts another flow.
Fix: When starting flows manually, select “Are not currently in a flow” if available. Avoid launching new flows for active contacts unless it’s intentional. Use triggers and campaigns carefully to prevent overlaps.
Problem: I can’t permanently delete a flow.
Fix: In many environments, flows cannot be permanently deleted. Instead, archive the flow (or remove triggers and stop starting it), then label it as inactive.
