On this page

Every node in Flow Builder is a small, specific unit of behavior: send this, wait for that, branch here, call an external system there. This reference lists all 16 working node types plus the Trigger and End nodes, the exact fields each one takes, and how it behaves when a real conversation runs through it.
Node reference
- 1Open the flow you want to check
- 2Match the node's palette label
- 3Check the Fields column
- 4Save and re-test
Before you start
- Click any node on the canvas to open its properties panel; every field below appears there under a label matching this article, not the internal field name.
- Nodes that send free-form content (anything that is not a pre-approved template) are checked against the conversation's 24-hour service window before they fire. If the window is closed, the node does not attempt the send; it logs a visible message reading "[Not sent: node_type]" in the conversation and the flow moves on.
- Every node runs only after the executor confirms the contact is not blocked and has not opted out, checked fresh before each node, not only when the flow starts.
- A flow loop tracks which nodes have already run in the current execution; revisiting the same node twice in one run breaks the loop rather than sending duplicate messages forever.
Steps
Reading this reference alongside the canvas is the fastest way to use it:

- Open the flow you want to check and click the node in question.
- Match the node's palette label (shown at the top of its properties panel) against the table below.
- Check the Fields column for what each visible input actually controls, then the Runtime notes column for anything that is not obvious from the UI alone, such as the 24-hour window guard or a fallback behavior.
- Save and re-test on your own connected number after changing a node's configuration, since a field's effect is not always visible until the node actually runs.
What you will see
Each node renders on the canvas as a labeled box in its palette color, with a small handle for outgoing edges (two handles, labeled true and false, on a Condition node; one handle per button on a Quick Replies node with more than one option). A node's properties panel only shows the fields relevant to its current configuration, for example a Delay node hides the relative-appointment fields entirely until you switch delay_type to relative.
Settings and options
| Node (palette label) | Type value | Fields | Runtime notes |
|---|---|---|---|
| Trigger | trigger | Trigger Type, Keywords (for Keyword / Inbound Message), Segment, Tag, Service, Hours before, Form, Label | Every flow starts here; see flow triggers for the full breakdown of each trigger type's fields |
| Send Message | send_message | Message body | Free-form; supports {{name}}, {{phone}} and {{variable}} interpolation; blocked by the 24-hour window guard |
| Send Template | send_template | Template name, Language, Variable mapping | Not affected by the 24-hour window; a carousel template sends automatically as a carousel if the named template has carousel cards |
| CTA Button | send_cta_url | Body, Button text, URL, Header text (optional), Footer text (optional) | Free-form; the URL must start with http:// or https://, and the node is skipped for website chat contacts, which have no CTA button support |
| Image Carousel | send_carousel | Body, Cards (image URL, body text, up to 3 buttons per card) | Free-form; needs at least 2 cards to send, skipped for website chat contacts |
| Wait for Reply | wait_for_reply | Variable name, Timeout (hours) | Pauses the flow until the contact's next message is captured into the named variable, or the timeout passes and the flow resumes with the variable unset |
| Quick Replies | quick_replies | Body, Buttons (up to 10), Variable name | Free-form; up to 3 options render as buttons, 4 to 10 render as a list message; the flow waits here until a button is tapped |
| Request Location | request_location | Body, Variable name | Free-form; sends WhatsApp's native location-request prompt and waits; skipped for website chat contacts |
| Contact Card | send_contact | Name, Phone, Email, Company, Title, URL | Free-form; sends a WhatsApp native contact card; skipped for website chat contacts |
| WhatsApp Form | send_wa_flow | WA Flow, Header, Body, Button text, Wait for completion | Free-form; the linked form must already be a published WA Flow; turning on "wait for completion" pauses the flow until the customer submits |
| Send Product | send_product | Catalog, Product (retailer ID), Body (optional) | Free-form; the org must have a connected Meta catalog with the product active; skipped for website chat contacts |
| Condition | condition | Field, Operator, Value | Not a send; routes to a true or false edge based on the comparison; case-insensitive on all operators |
| Delay | delay | Delay type (fixed or relative to appointment), Hours/minutes, or Direction + days/hours offset | Not a send; the flow execution pauses and is resumed by cron; a relative delay with no upcoming appointment is skipped, not held forever |
| Human Handoff | human_handoff | Handoff message | Sends the message, then ends the execution; the conversation is left for a human agent, it is not automatically assigned |
| API Call | api_call | URL, Method (GET or POST), Variable name | Not a send to the customer; POSTs the flow's current variables as JSON, or appends them as a GET query string; the response text is stored in the named variable, default api_response |
| AI Response | ai_response | AI provider, System prompt, Knowledge base, Conversational mode, Booking link (optional) | Free-form; falls back automatically to any other configured provider key if the saved one has none; in conversational mode the flow stays on this node and waits for the next customer message rather than advancing |
| Action | action | Action type (Add Tag, Remove Tag, Mark Opted Out, Resolve Conversation), Tag name | Not a send; Mark Opted Out and Resolve Conversation need no extra value; the next iteration of the executor loop cancels the run if the action just opted the contact out |
| End Flow | end | None | Terminates the branch; a flow with no more edges from a node also ends implicitly, this node exists to make an intentional stop explicit on the canvas |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| A Send Message or Quick Replies node never delivers | The 24-hour service window was closed when the node ran | Check the conversation thread for the logged "[Not sent: ...]" entry, then switch that step to Send Template if it is scheduled after a Delay |
| A Condition node always takes the false branch | The field is comparing a variable that was never set, so it evaluates as an empty string | Confirm the variable name matches exactly what an earlier node set it to, including the var. prefix for flow variables |
| An API Call node's response is not usable in later messages | The endpoint returned a full JSON object, which is stored as one string in the variable | Have your endpoint return only the specific value the flow needs, or fetch and parse the field server-side before responding |
| A Delay node with a relative-to-appointment offset never fires | The contact has no scheduled appointment when the node runs | Confirm the appointment exists and is still in "scheduled" status; a completed or cancelled appointment does not count |
| Send Product or Send Contact silently does nothing | The contact is a website chat contact, which has no Meta API target for these node types | This is expected; these nodes are WhatsApp-only and are skipped automatically for chat widget conversations |
| An AI Response node answers off-topic | No knowledge base is attached, or the attached one is scoped to a different chatbot widget than the one this flow is meant to represent | Attach the correct knowledge base in the node's Knowledge base field, or check its per-widget scope in Settings, then Chat Widget |
Related reading
Pair this reference with flow triggers for the six ways a flow can start, and the broader Flow Builder guide for how to wire nodes together on the canvas and test the result.