Skip to main content

Message nodes

A Message node sends a message to the customer, on the same channel the conversation is on.

Configure

  • Template — the text, with variable substitution (e.g. {{contact.first_name}})
  • Delay — optional delay before sending (seconds, minutes, hours). Useful for a natural-feeling follow-up.

Variables

A flow message can use these contact variables. A variable without a value renders empty. Flows don’t fill {{contact.last_name}} or the other macro variables, such as {{account.name}}. In a flow message they render empty.

Contact details on website conversations

On the web widget, Keloa can’t tell who is typing unless your site signs them in with identity verification. So a flow message on a website conversation only shows contact details the person chatting is known to own:
  • {{contact.email}} shows the address when the visitor typed it in that conversation (in a message or the contact form) or in the contact form of one of their own earlier conversations your team merged into it, or when it is the verified email your site signed for the signed-in user of that conversation.
  • {{contact.phone}} shows the number when the visitor typed it in that conversation, or when your site signed it for the signed-in user of that conversation.
Otherwise the placeholder renders empty, so on an anonymous conversation it stays empty unless the visitor typed the detail there. Names follow the same rule. On an anonymous website conversation, {{contact.name}}, {{contact.first_name}} and {{contact.company}} only show a name the visitor gave in that conversation, in the chat or in the contact form, or in the contact form of one of their own earlier conversations your team merged into it; otherwise they render empty, because a name your team, an email or a merge put on the contact may be someone else’s. Contact and company custom fields count as unknown there too. On a signed-in user’s conversation, they show the name and company your site signed for that user. Signed-in users’ conversations follow the rules above for email and phone. Other channels, such as email and WhatsApp, render every placeholder as usual. The same rules apply wherever a flow reads the contact on a website conversation: Condition nodes, and {{contact.*}} values you pass to an action. A detail the visitor isn’t shown to own counts as empty there too.

Use a macro instead

In the template field, click Use macro to pull from your saved replies. Keeps voice consistent across manual and automated messages.

Channel quirks

  • WhatsApp, Messenger and Instagram only deliver within the reply window (24 hours after the contact’s last message; 72 hours after a click-to-WhatsApp ad). A Message node on a conversation whose window has closed isn’t delivered.
  • Telegram and Slack have no reply window.
  • Email messages go as a reply in the existing thread.
  • Webchat messages appear with the agent’s avatar.

Action nodes

An Action node changes something about the conversation or contact — no message is sent.

Available actions

Each action runs instantly. The flow continues to the next node.

Chaining

Put several actions in a row — tag, set priority, notify — all on one incoming message. Each action node has one output to keep the graph linear.

Example: after-hours flow

The customer gets a friendly acknowledgement, the conversation is tagged for analytics, and the AI still processes the message so it’s ready with context when you log in.

Example: auto-tag refund requests

Now every refund conversation is pre-tagged and prioritised without anyone lifting a finger.