{{ vars.name }} and
{{ contact.name }} work anywhere a message does. {{ contact.name }},
{{ contact.phone }}, {{ contact.email }} and {{ contact.company }} are available on
every run that has a contact, and {{ vars.<key> }} reads anything the flow has captured
or set.
Message types
A Products node in single mode with more than one product sends only the first, and
the validator warns. A multi-product message needs body text; WhatsApp rejects the send
without it.
Ask and capture
These are the nodes that stop and wait for the customer.
A variable key must start with a letter or underscore and use letters, numbers and
underscores only — it is read back as
{{ vars.<key> }}.
Ask for a file’s Accept narrows what counts as an answer: a run waiting for a
document should not be satisfied by a sticker. Anything else the customer sends goes
through the flow’s unmatched-reply handling.
The media URL an Ask for a file stores is served by us, not Meta’s short-lived one,
so a value captured today is still fetchable tomorrow.
Actions and data
A failed Tag contact, Segment contact or Set attribute does not abandon the
customer mid-conversation — the failure is recorded on the run and the flow carries on.
An API request with fail on error switched on does end the run.
The URL of an API request goes through the same protection as an AI agent’s custom
actions: private, loopback and internal addresses are refused, and redirects are
re-checked at every hop.
Flow control
Connect flow does not nest, and that is deliberate: a contact can only be in one flow
at a time, so ending first is also what makes an accidental loop between two flows
terminate instead of growing. Leaving Hand to AI agent without a specific agent is the
right default — routing order is a setting the workspace already made, and pinning one
agent in a flow would quietly outrank it.