Skip to main content

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).

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.