Skip to main content

Variables & Personalisation Guide

Personalise Inrō messages with variables, spintax, and Liquid, using contact, trigger, conversation, mention, survey, webhook, and widget data.

Variables let you drop dynamic content into any message or action. Instead of sending everyone the same text, a variable pulls in real data: the contact's name, the comment they left, a property you collected earlier.

Variables use double curly braces, like {{contact.name}}. They work in any field that shows the Insert variable button: message text, conversion link fields, and HTTP request URLs and parameters.

How to insert a variable

Any field that supports variables shows a small Insert variable button. Click it to open the picker and choose from the options available at that step.

The variable picker open over a message field, grouped by namespace.

The variable drops in as a placeholder like {{contact.name}}. When the scenario runs, Inrō swaps it for the real value for that contact.

Contact variables

Contact variables pull from the contact's record in your CRM.

Variable

What it inserts

{{contact.name}}

The contact's display name

{{contact.username}}

Their Instagram handle (without @)

{{contact.email}}

Their saved email address

{{contact.phone}}

Their saved phone number

{{contact.follower_count}}

Their Instagram follower count

For any custom property you've created, the variable follows the same pattern using the property's name, for example {{contact.Budget}}.

⚠️ Reach for {{contact.username}} over {{contact.name}} in most messages. Instagram display names are rarely real names, and using one can make a message feel more automated, not less.

Trigger variables

Trigger variables pull from the event that started the scenario.

Variable

What it inserts

{{trigger.message}}

The DM that fired the trigger

{{trigger.comment}}

The comment that fired the trigger

{{trigger.media_caption}}

Caption of the post the comment was left on

{{trigger.date}}

When the trigger fired

{{trigger.ref}}

The ref code from a referral link

Referencing the contact's own words back to them is one of the strongest forms of personalisation.

Conversation variables

Conversation variables pull from the message history of the current conversation.

Variable

What it inserts

{{conversation.last_message}}

The last message sent or received

{{conversation.last_message_received}}

The last message you received

{{conversation.last_message_sent}}

The last message you sent

{{conversation.last_message_date}}

When the last message happened

These are useful in mid-flow steps when you want to reference the latest message without relying on a trigger variable.

Mention variables

When a scenario is triggered by a mention (someone tagging you in a comment, post, or story), the mention's details are available too.

Variable

What it inserts

{{mention.text}}

The text of the mention

{{mention.media_caption}}

Caption of the post or story

{{mention.media_url}}

URL of the media

{{mention.media_permalink}}

Permalink to the post

{{mention.media_username}}

The username who mentioned you

Survey variables

After a survey step, you can reference what the contact answered.

Variable

What it inserts

{{survey.option.title}}

The option they selected

{{survey.option.replies}}

Their free-text reply

{{survey.date}}

When they answered

Use these in a message right after a survey to acknowledge the answer directly.

Webhook variables

If a scenario was started by a webhook (a way for an external app to send data into Inrō automatically), every parameter in the request is available as a variable. The variable name matches the parameter you posted.

Hey {{webhook.first_name}}, your meeting is confirmed for {{webhook.meeting_date}}!

See Triggers: The Complete Reference for how webhook triggers work.

HTML Widget variables

If a scenario was started by an Inrō widget on your website, any data the widget carried is available as a variable.

Hey {{widget.first_name}}, your plan is {{widget.plan}}.

These can also be saved to contact properties or passed through an HTTP request.

Execution variables (HTTP responses)

After a Send HTTP request action runs, you can reference data from its response in any later step. The path mirrors the JSON the server returned.

Hey! {{http_request.response.body.message}}

You can view the full response in your scenario history to find the right path.

Spintax: add natural variety

Spintax is a quick way to vary your wording so messages feel less automated. You list a few options and Inrō picks one at random each time.

{Hey|Hi|Hello}! How {are you|are you doing}?

⚠️ Spintax uses single braces { }, not the double braces used by variables. Don't mix them up.

What happens if a variable is empty

If a contact has no value for a variable, it renders as blank, so "Hey {{contact.name}}!" becomes "Hey !" when the name is missing. Reserve personalised variables for messages where you're confident the data exists, or place them where a blank reads fine. Always send yourself a test after adding variables to catch this before real contacts do.

Liquid syntax: beyond basic variables

Liquid is a templating language that builds on top of variables. You can use it inside any field that supports variables, with no coding needed.

Default values

Use | default: to set a fallback when a variable is empty:

Hey {{contact.name | default: "there"}}!

Math

Use filters to calculate on number variables, handy when you've saved something like an age or a price and want to show a modified version:

You are {{contact.age | plus: 1}} next year!

Available math filters: plus, minus, times, divided_by, modulo.

Date formatting

{{trigger.date}} outputs a raw timestamp by default. Use | date: to format it into something readable:

Your request came in on {{trigger.date | date: "%B %d, %Y"}}

That outputs something like "March 3, 2026." Common codes: %B for the full month name, %d for the day, %Y for the four-digit year, and %H:%M for the time.

Conditions

Use {% if %} to show different content based on a contact's data:

{% if contact.username == "pierredemilly" %}Hey Pierre, we've been expecting you.{% else %}Hey {{contact.username}}, great to hear from you.{% endif %}

Always close with {% endif %}. You can compare with ==, !=, >, <, >=, and <=.

String formatting

A few useful filters for text variables:

{{contact.name | upcase}}      makes it PIERRE{{contact.name | downcase}}    makes it pierre{{contact.name | capitalize}}  makes it Pierre

For the full list of filters, see Liquid's documentation.

⚠️ Liquid doesn't check itself before sending. Always run a test after adding any Liquid logic to catch errors before they reach real contacts.

🐾 Netsuke's Tips

  • {{contact.name}} (or better, {{contact.username}}) at the start of your first message is the highest-impact personalisation you can add in two seconds.

  • {{trigger.comment}} is gold for comment-to-DM flows. Quoting the exact thing someone said makes them feel a real person read their comment.

  • Custom property variables are where the real power lives. Collect a goal or a budget once, save it to a property, and reference it in every message after, including future scenarios and campaigns.

  • Always run a test after adding variables. It's the fastest way to catch an empty value or a typo in a property name before it reaches real contacts.

What's next?

Now that your messages are personalised, get comfortable with the canvas itself. Read The Flow Builder: Visual Editor Tips & Tricks.

Did this answer your question?