Skip to main content
A SEND_MESSAGE node sends an approved WhatsApp template. Templates have positional placeholders ({{1}}, {{2}}, …). You fill each one by setting templateBindings on the node — a map from a placeholder to the path of the value it should carry:
If a placeholder has no binding, or its path doesn’t resolve, the message goes out with that slot blank. So bind every placeholder, and use a path that actually resolves.

Where the values come from

A binding path starts with one of three roots — the data available when the message is sent: A custom attribute you set on a person (for example bank) is referenced as person.bank — not attributes.bank.
attributes.<key> is the syntax for DECISION / CASE conditions, a different part of a journey. It does not work in a message binding. In a SEND_MESSAGE template binding, a custom person attribute is always person.<key>.

Discover the valid variables

Rather than guess, ask the API (or MCP) for the exact set a given journey can bind — the same list the visual builder shows:
It returns the variables grouped by source, each with a ready-to-use path. Copy a path straight into templateBindings.

Validation

When you save or validate a journey, a binding whose path can’t resolve (for example attributes.bank or customer.attributes.bank) is reported as an error and blocks publishing, so a broken binding never ships silently. Fix it by switching to a path from the catalog above (custom attributes → person.<key>).