Skip to main content
A flow is an automation you build on a canvas: contacts enter through a trigger, move through steps you connect together, and finish at an end. Flows send texts, place calls, wait, branch on what a contact does, tag and segment them, and call out to other systems — all without code.

How a flow runs

  • One trigger, at the start. It decides who enters and when (a list, a campaign action, a reply, a click, a webhook, or a website event).
  • Steps run in order, following the wires you draw. A node with one output passes the contact to the next step; branching nodes send them one way or another.
  • A flow can have several ends — each branch can finish on its own.
  • Re-enrollment (set on the trigger) decides whether a contact can go through again: never, after they finish, or always.
  • Compliance is automatic. Every send respects opt-outs, quiet hours, and frequency limits — a contact who opted out is never messaged, whatever the flow says.
Selecting any node in the builder shows a short description of what it does right in the panel. This page is the fuller reference.

Build your first flow

A simple speed-to-lead flow: text a new lead, wait, then branch on whether they replied.
1

Set the trigger

Open the trigger node and choose how contacts enter — e.g. Contacts are in a list and pick the list, or An external webhook fires to enroll leads your site POSTs in.
2

Add the first message

Add a Send SMS node and wire trigger → send_sms. Write the text with {first_name} and a {link} if you have one.
3

Wait

Add a Wait node (e.g. 10 minutes) after the message, to give them time to respond.
4

Branch on the reply

Add a Condition on replied. Wire the yes branch to an Add tag (engaged) then End, and the no branch to a second Send SMS nudge then End.
5

Activate

Fix any validation errors the builder flags, then switch the flow to Active. Contacts start entering per the trigger; nothing sends while it’s a draft.

How key mechanics work

  • Wait timing — a wait can be a fixed delay (after the previous step), a fixed time after the contact entered (so earlier delays can’t push it later), or a time of day in the contact’s timezone. Later steps resume when the wait elapses.
  • Condition vs Switch — a Condition is a yes/no test on one attribute (replied, clicked, a field value) with two outputs. A Switch routes on a custom field’s value into several named branches plus a default — use it when there are more than two paths.
  • Split runs its branches in parallel — every connected branch fires at once. Every other node passes the contact down a single path.
  • Re-enrollment (set on the trigger) decides whether a contact can go through again: never (once per contact), after they finish, or always. Pick this deliberately — always can re-message the same person.
  • Sub-flows — a Call sub-flow node runs another flow to completion, then returns to continue. Build shared logic (a standard opt-in, a compliance step) once and reuse it. Flows can’t loop back on themselves.
  • Compliance is automatic — every messaging node honors opt-outs, quiet hours, and frequency limits, so you never have to add guard steps for them.

Triggers

entry point
How contacts enter the flow — a lead list, a campaign action (sent / replied / clicked), a reply, a link click, an inbound webhook, or a website event from the pixel. Every flow has exactly one.

Messaging

action
Sends a text to the contact. Personalize with tokens like {first_name} and {link}. Opt-outs, quiet hours, and frequency limits are enforced automatically.
action
Places an outbound call handled by a voice agent you choose — for contacts who respond better to a call, or to escalate after texts go unanswered.

Timing

pause
Pauses the contact before the next step — a fixed delay, a set time after they entered, or until a time of day in their timezone. The backbone of drip timing.
pause
Holds the contact until they reply, then continues — optionally only on a specific keyword/code, with a separate timeout path if they never respond.

Branching

branch
A yes/no fork. Contacts matching the attribute (replied, clicked, a custom field value…) take the yes branch; everyone else takes no.
branch
Routes the contact down one of several branches by a custom field’s value, with a default branch for anything unmatched. Good for routing by state, plan, or source.
branch
Runs every connected branch at the same time — do two things at once, e.g. tag the contact and send a text.
gate
Only contacts matching the condition continue past it; the rest stop here. Use it to keep a flow to a specific audience.

Data & actions

action
Writes a custom field (or adds/removes a tag) so later steps, conditions, and segments can act on it — e.g. record stage = nurtured mid-flow.
action
Adds a tag — a lightweight label you can later segment or filter on.
action
Adds the contact to a lead list, to build an audience for a later campaign or flow.
action
Adds the contact to a segment explicitly. Most segments update from rules; use this when you want to place a contact in one from within the flow.
action
POSTs the contact’s data to a webhook — notify a CRM, a Slack channel, or your own backend when a contact reaches this point.
action
Runs a reusable sub-flow, then returns to continue here. Build shared logic (a standard opt-in, a compliance step) once and reuse it.

Finishing & layout

terminal
Finishes the flow for the contact. A flow can have several ends.
canvas aid
Organizational only. A group is a container you drag to move steps together; a note is a sticky comment. Neither changes how contacts flow.