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

Send buttons

Sends a text message with up to 3 quick-reply buttons underneath it. The run pauses here until the contact taps one.

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

Send list

Sends a message with a tappable list of options, organized into one or more sections. Good for menus with more than 3 choices. The run pauses until the contact picks a row.

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

Send message

Sends a plain text message with no reply options, then moves straight on to the next node — it never pauses the run.

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

Send media

Sends an image, video or document, with an optional caption, then moves on to the next node.

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

Collect input

Sends a prompt, then pauses the run until the contact replies with anything. The reply is saved to a variable you can reuse later in the flow.

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

If/else

Branches the run in two directions based on a rule, with no message sent to the contact.

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.

The If/else node editor, showing subject, operator and value fields plus separate next-node dropdowns for the true and false branchesThe If/else node editor, showing subject, operator and value fields plus separate next-node dropdowns for the true and false branches
None of the built-in templates use this node — added here on a blank node to show the editor.

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

Tag contact

Adds or removes one tag on the contact, then moves straight on to the next node — it never pauses the run and sends nothing to the contact.

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

Start

The entry point every flow needs exactly one of. It has no configuration beyond where the run goes next.

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

Handoff to agent

Ends the run and marks the conversation for a human agent, moving its status to pending so it surfaces in the shared inbox.

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

End

Ends the run successfully. No configuration.

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.