> ## Documentation Index
> Fetch the complete documentation index at: https://docs.verbose.cx/llms.txt
> Use this file to discover all available pages before exploring further.

# Flow Builder

> How flows work, and what every node does.

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.

<Tip>
  Selecting any node in the builder shows a short description of what it does
  right in the panel. This page is the fuller reference.
</Tip>

## Build your first flow

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

<Steps>
  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="Wait">
    Add a **Wait** node (e.g. 10 minutes) after the message, to give them time to
    respond.
  </Step>

  <Step title="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**.
  </Step>

  <Step title="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.
  </Step>
</Steps>

## 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

<ResponseField name="Trigger" type="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.
</ResponseField>

## Messaging

<ResponseField name="Send SMS" type="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.
</ResponseField>

<ResponseField name="Voice call" type="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.
</ResponseField>

## Timing

<ResponseField name="Wait" type="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.
</ResponseField>

<ResponseField name="Wait for reply" type="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.
</ResponseField>

## Branching

<ResponseField name="Condition" type="branch">
  A yes/no fork. Contacts matching the attribute (replied, clicked, a custom
  field value…) take the yes branch; everyone else takes no.
</ResponseField>

<ResponseField name="Switch" type="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.
</ResponseField>

<ResponseField name="Split (parallel)" type="branch">
  Runs every connected branch at the same time — do two things at once, e.g. tag
  the contact and send a text.
</ResponseField>

<ResponseField name="Filter" type="gate">
  Only contacts matching the condition continue past it; the rest stop here. Use
  it to keep a flow to a specific audience.
</ResponseField>

## Data & actions

<ResponseField name="Set field" type="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.
</ResponseField>

<ResponseField name="Add tag" type="action">
  Adds a tag — a lightweight label you can later segment or filter on.
</ResponseField>

<ResponseField name="Add to list" type="action">
  Adds the contact to a lead list, to build an audience for a later campaign or
  flow.
</ResponseField>

<ResponseField name="Add to segment" type="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.
</ResponseField>

<ResponseField name="Send to integration" type="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.
</ResponseField>

<ResponseField name="Call sub-flow" type="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.
</ResponseField>

## Finishing & layout

<ResponseField name="End" type="terminal">
  Finishes the flow for the contact. A flow can have several ends.
</ResponseField>

<ResponseField name="Group / Note" type="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.
</ResponseField>
