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 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 |
| The contact's display name |
| Their Instagram handle (without @) |
| Their saved email address |
| Their saved phone number |
| 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 |
| The DM that fired the trigger |
| The comment that fired the trigger |
| Caption of the post the comment was left on |
| When the trigger fired |
| The |
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 |
| The last message sent or received |
| The last message you received |
| The last message you sent |
| 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 |
| The text of the mention |
| Caption of the post or story |
| URL of the media |
| Permalink to the post |
| The username who mentioned you |
Survey variables
After a survey step, you can reference what the contact answered.
Variable | What it inserts |
| The option they selected |
| Their free-text reply |
| 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.

