🇪🇸 Español 🇬🇧 English 🇧🇷 Português
Guides

Workflow variables: personalize every message with {{data}}

Learn how to use variables in Omnifox workflows to personalize messages with contact, conversation and CRM data, and chain one node's output into the next.

July 11, 2026

A message that says "Hi" converts worse than one that says "Hi Ana, we saw your order #4821." The difference is workflow variables: small placeholders like {{$contact.first_name}} that Omnifox replaces at run time with each contact's real data. In this guide you'll see which variables exist, how to drop them into nodes, and how to chain one node's output into the next so your automations feel handwritten.

What a variable is and where it works

A variable is text wrapped in double curly braces that the engine substitutes right before sending. Omnifox's golden rule: if the variable doesn't exist or is empty, it becomes an empty string and the message never breaks. That lets you write templates without fear of an ugly null showing up.

Variables work in almost any node that accepts text: Send message, Ask a question, Send WhatsApp template, Send email to customer, Add internal note, Notify team by email, and also inside Update contact or Set variable.

The variable families

Omnifox groups variables by source. These are the ones you'll reach for every day:

  • Contact: {{$contact.first_name}}, {{$contact.last_name}}, {{$contact.email}}, {{$contact.phone}}, {{$contact.company}}, {{$contact.tags}}.
  • Conversation: {{$conversation.status}}, {{$conversation.channel_name}}, {{$conversation.assignee}} (assigned agent) and {{$conversation.summary}}, an AI-generated recap of the chat.
  • Message: {{$message.text}}, {{$message.type}}, {{$message.media_url}}.
  • Call (if you have the calling plan): {{$call.from}}, {{$call.direction}}, {{$call.duration}}, {{$call.recording_url}}.
  • IVR: {{$ivr.digit}} and {{$ivr.option_label}}.
  • Deal / trigger: {{$trigger.title}}, {{$trigger.amount}}, {{$trigger.stage_name}} when the workflow starts from a CRM event.

A real personalized welcome flow

Let's combine them in a concrete workflow. The goal: greet the first message using the name and the channel.

  1. Trigger Message received with the first only filter on, so it fires solely on the first inbound.
  2. Send message node with the text: Hi {{$contact.first_name}}, thanks for reaching out on {{$conversation.channel_name}}. We'll be right with you. If the contact has no name yet, {{$contact.first_name}} stays empty and the greeting simply reads "Hi,".
  3. Add tag node to mark it as a new lead.
  4. Transfer to an agent node so a human takes over.

The order is: Message received (first only) -> Send message -> Add tag -> Transfer to an agent.

Chaining a node's output with {{steps.last}}

Here's the powerful part. Some nodes produce a value when they run, and that value stays available for the nodes downstream. The classic case is {{steps.last.created_item_id}}: when a Create item node (or Create card from conversation) creates a record, it leaves the ID of the freshly created item, and a later node can reuse it.

Example of a support workflow that opens a ticket on a board and tells the customer the number:

  1. Trigger Tag added (say, the "complaint" tag).
  2. Create item node on the Support board, using {{$contact.first_name}} in the title.
  3. Send message node: We opened your case with number {{steps.last.created_item_id}}. We'll update you here as it moves.

The flow: Tag added -> Create item -> Send message. The second message grabs the ID the previous node left behind. This pattern works for anything that generates an identifier: creating a deal, a task, or a card.

Defining your own variables

When you need a computed value or want to store something for later, use the Set variable node. For example, save the origin channel into your own variable at the top of the flow and reuse it across several messages, or combine {{$contact.first_name}} with fixed text for a greeting you use in multiple nodes. You can also capture the customer's answer with Ask a question and stash it for a downstream node.

Common mistakes to avoid

  • Typing the variable with an extra space, like {{ $contact.first_name }}, when the correct name has no internal spaces. Always copy from the editor's variable picker so you don't slip.
  • Assuming a call variable exists in a chat flow: {{$call.duration}} only has a value if the workflow started from a call event. In a messaging flow it stays empty.
  • Relying on {{$contact.first_name}} when many contacts have no name. Since it renders empty, your sentence must still make sense without it. Write "Hi" rather than "Dear Mr." followed by an empty last name.
  • Forgetting {{$conversation.summary}} is AI-generated and may take a moment; use it once there's enough conversation.

Handy variants

With the same mechanism you can build an internal heads-up with context: a Notify team by email node that includes {{$contact.phone}}, {{$conversation.channel_name}} and {{$conversation.summary}} so the agent enters the chat already knowing what it's about. Or a wrap-up confirmation via Send message that mentions {{$conversation.assignee}} so the customer knows who helped them.

In Omnifox the variable picker pops up the moment you type {{ inside any text field of the workflow editor, so you never need to memorize names. Start with your welcome message, add one variable, and watch each contact get something different. Once you've got it, chain a node's output with {{steps.last}} and your automations level up. Build your first variable-driven workflow in Omnifox.

Comentarios (0)

Todavía no hay comentarios. Sé el primero en compartir tu opinión.

Dejá un comentario

Tu email nunca se publica. Los comentarios se moderan antes de aparecer.

Soporta markdown. El HTML se elimina.