Node reference
Every node you can drop onto the canvas (or add from List view), grouped the same way the Add node menu groups them. Each card lists the limits Relay enforces — either when you try to save an invalid config, or when WhatsApp itself rejects a message that's over its own limit.
Two kinds of limit show up below:
- Save-time limits block the flow from activating and show up in the validation panel with a message pointing at the exact node.
- Send-time limits are enforced by the WhatsApp Cloud API when Relay actually sends the message — Relay checks the ones it can ahead of time, but a couple (footer length, number of list sections) are only caught when the message goes out.
Messaging
Only a tap on one of these buttons advances the run — anything else re-prompts (see How flow runs work). If a contact types free text instead of tapping, even text that matches a button title exactly, Relay treats it as an unrecognized reply and counts it toward the re-prompt limit. It does not fall through to the first button.
Limits
- Body text: required, no length cap enforced by Relay (WhatsApp effectively limits interactive body text to 1024 characters)
- Footer text: optional, ≤60 characters
- Buttons: 1–3, each needs a title and its own next node
- Button title: ≤20 characters
- Each button must point to a different (or the same) next node — Relay does not require branches to diverge
Each row has its own next node, same as a button.
Limits
- Body text: required
- Button label (the tap-to-expand text): required, and keep it to 20 characters or fewer. WhatsApp rejects longer labels, and Relay doesn't check the length when you save
- Rows: 1–10 total across all sections
- Row title: ≤24 characters
- Row description: optional, ≤72 characters
- Sections: WhatsApp allows up to 10 — Relay does not block adding more in the editor, but WhatsApp will reject the send if you go over
Use this for anything that doesn't need a decision from the contact — a greeting, an answer, a confirmation. You can reference a variable an earlier Collect input node saved with {{vars.key}} — see the lead capture tutorial for an example.
Limits
- Text: required
- No length cap enforced by the editor
Supported formats follow WhatsApp's own list: images as PNG/JPEG/WebP, video as MP4/3GP, documents as PDF, Word, Excel, PowerPoint or plain text.
Limits
- Media type: image, video, or document
- File: required, uploaded ahead of time — max 16 MB
- Caption: optional, ≤1024 characters
- Filename (documents only): shown to the contact
Logic & data
Reuse a captured value in a later node's text with {{vars.key}}, where key is the variable key you set here — for example {{vars.name}}. This works in Send message text, Send media captions and later Collect input prompts. It does not work in button or list text, or in a Handoff to agent note.
Limits
- Prompt text: required
- Variable key: required, letters/numbers/underscore, must start with a letter or underscore
Common uses: check whether a Collect input node's answer matched something specific, or whether the contact already carries a tag, before deciding where the conversation goes next.
Limits
- Subject: a captured variable, a contact tag, or a contact field
- Operator: is present, is absent, equals, or contains
- Value: required for "equals" and "contains"
- Both branches (true and false) must point to a next node
Useful for marking who reached a certain point in a flow — a lead that finished intake, a customer who picked a particular topic — so you can filter or trigger other automation off it later.
Limits
- Mode: add or remove
- Tag: required
Flow control
A flow can only have one entry node. You pick which node is the entry from that node's editor ("Set as entry") — it doesn't have to be the node literally called start.
Limits
- Must point to a next node
This is a terminal node — nothing comes after it. The note is saved exactly as typed: {{vars.key}} references in it are not filled in. To pass a Collect input chain's answers on to whoever picks up the conversation, put them in a Send message just before the handoff, as the lead capture tutorial does. The answers also appear in the run's Captured vars on the Runs page. The builder doesn't currently offer a way to route the handoff to a specific agent from this node — it always lands in the shared inbox as unassigned.
Limits
- Internal note: optional. Saved with the run's handoff event; not shown in the inbox and not sent to the contact
Terminal node — when the runner reaches it, the run is marked Completed. A flow can have more than one End node if different branches should all finish the conversation.
Why an unreachable node doesn't block activation
If a node has no path leading to it from the entry node, the validation panel flags it — but only as a warning, not an error. That means you can still activate a flow with a stray, disconnected node sitting on the canvas. It's worth cleaning up (it's dead weight nobody will ever reach), but it won't stop you from shipping. Everything else on this page — a missing button title, an unconnected branch, a missing keyword — blocks activation as a hard error until it's fixed.