Liquid Templates
Joryio uses Liquid to personalize messages - insert user data, apply filters, branch on conditions, and pull in entity and product records.
Hi {{ user.firstName | default: "there" }}, your cart total is {{ cart.total | currency }}.
What you can use
- Variables -
{{ user.firstName }},{{ user.email }}, custom attributes via{{ user.custom.plan }}, and (in journeys) event/trigger data like{{ event.name }}or the contact's last reply with{{ reply.text }}(works for both WhatsApp and SMS replies). - Filters - transform values:
{{ user.firstName | upcase }},{{ price | currency }},{{ "now" | date: "%Y" }}. - Conditionals & loops -
{% if %}/{% for %}to branch and iterate. - Fallbacks - always guard with
default:{{ user.firstName | default: "there" }}. - Catalog feeds - pull entity or product records into a message (see Custom Entities).
- Content blocks - drop a reusable snippet with
{{ blocks.slug }}(see Content Blocks). - Subscription links - drop a working opt-out / preference link with
{{ unsubscribe_url }},{{ preferences_url }}, or{{ resubscribe_url }}(see below).
Subscription links
Add a per-recipient opt-out or preference-center link to a message body:
{{ unsubscribe_url }}- one-click unsubscribe (opts the contact out).{{ preferences_url }}- link to the hosted preference center, where the contact manages which categories they receive.{{ resubscribe_url }}- the preference center pre-set to re-subscribe.
These resolve in email, SMS, and WhatsApp (free-form/session replies). Each is a unique, per-recipient link that expires after 90 days. They do not render in push or in-app messages.
A few channel notes:
- SMS - a link works, but the carrier/legal standard for SMS opt-out is the STOP
keyword (reply STOP / הסר / etc.), which always works whether or not you include a link.
A link costs message characters, so many senders rely on STOP and use
{{ preferences_url }}only when they want a managed preference page. - WhatsApp - links resolve in free-form session replies. Template messages use Meta's pre-approved fixed placeholders and can't carry a dynamic link; for templates use STOP-keyword opt-out (or a static "manage preferences" URL button approved with the template).
- Clicking an SMS/WhatsApp unsubscribe link opts the contact out by phone number - it applies to every contact record sharing that number, the same as a texted STOP.
Where it works
The same Liquid - variables, filters, catalog feeds (products/entities), and content blocks - renders identically across every channel: email, SMS, push, WhatsApp, and in-app, in both campaigns and journeys. Write a template once and it behaves the same wherever you use it.
Inserting it without typing
You don't have to memorize the syntax. Each composer has a Personalize button - under
the message body in the SMS, push, and WhatsApp editors, and in the editor toolbar for
email and in-app. Pick a variable (user attribute, custom attribute, catalog feed (product or entity),
content block, or subscription link), set an optional fallback value, and the ready-made
{{ ... }} snippet is inserted for you.