Flow Builder
/dashboard/flows — a canvas with steps and blocks. Each step is one node;
each node holds one-or-more blocks (text, buttons, AI reply, HTTP call). Steps wire
to each other via the customer’s button taps, the next-step “Continue” edge, or
conditional branches.
The mental model
- Step = one “screen” the customer interacts with
- Block = a piece inside a step (a message, a side-effect, a wait, a condition)
- Edge = how the runtime advances from one step to another
- Flow run = one customer’s journey through the flow (stored as a
FlowStaterow)
A flow has a DRAFT version (what you edit) and a PUBLISHED version (what the runtime executes). Edits don’t disrupt live flows — they keep running on the snapshot taken at publish time.
Where to start
Every block type, what it does, what it stores.
Block referenceHow a flow actually starts on a conversation.
TriggersCurly-brace substitution + run-time vars.
VariablesDraft → published → live customers.
PublishingWhen a customer’s button tap doesn’t advance.
DebuggingTwo execution modes
The runtime engine chains depending on what each block does:
- Auto-advance — text / template / media blocks send their message AND immediately advance to the next step’s nextStep edge (“Continue” socket)
- Wait-for-customer — interactive blocks (reply_buttons, wa_list, user-input, flow_wait, booking pickers) send the message and PARK the flow until the customer responds. The reply matches a wired socket → flow advances.
You’ll see both patterns mixed in the same flow.
The Flow Builder + runtime engine combined are the largest surface of the platform — expect to spend most of your reading time here.