Liquid is an open-source templating language that Optimove uses to personalize cross-channel campaign content. Originally developed by Shopify, it allows you to build one reusable content layout and automatically fill it with the right data for each person based on rules.
Starting in 2026, Liquid replaces the legacy template language within Optimove as the new standard for writing conditional logic and personalization tags.
Liquid Channel Support
The same Liquid works across several channels, but support is not universal. Check this before assuming a template can be built the same way everywhere.
| Channel | Liquid support |
|---|---|
| Supported | |
| SMS | Supported |
| Web Push | Supported |
| Mobile Push | Supported |
| In-app | Use Overlay Messaging |
| Pop-up | Use Overlay Messaging |
| Transactional API messaging | Not yet supported |
Knowing where Liquid works saves you from building a template you cannot ship. Let's look at what actually differs between the supported channels.
Within Optimove Personalize
Liquid personalization is supported for banners. Other components, including DynamicMail, are not yet supported.
What changes between channels
The logic and output tags behave identically wherever Liquid is supported. What differs is the channel around them.
- SMS: counts characters and has no HTML. Whitespace control matters here more than anywhere else — a stray blank line from a logic block wastes characters.
- Web Push and Mobile Push: tight length limits. Keep conditional branches short and always supply a fallback.
- Email: the only channel where the unsubscribe tag applies, and only for marketing email.
Why are we switching to Liquid?
Moving to Liquid provides three major benefits over our legacy system:
- Unified Syntax: It replaces fragmented rules with a single language, meaning every campaign on every channel follows the same logic.
- Industry Standard: Because Liquid is used widely across the CRM ecosystem, it reduces the learning curve for new users and aligns Optimove with the rest of the market.
- Advanced Capabilities: Unlike our legacy syntax, Liquid supports nested conditions, AND/OR logic, and complex data formatting.
Core Concepts
Liquid works by using tags to distinguish dynamic code from static text. There are three main components you will use:
1. Output Tags {{ }}
Output tags display data directly inside your message. They are surrounded by double curly braces.
- Example:
{{ user.first_name }}displays the customer's first name.
2. Logic Tags {% %}
Logic tags control the flow of the message, such as hiding or showing content based on rules. They are surrounded by curly braces and percent signs.
- Example:
{% if user.tier == "GOLD" %}starts a condition.
3. Filters |
Filters transform data, such as capitalizing text or formatting a date. They are used inside an Output tag, separated by a pipe character |.
- Example:
{{ user.first_name | default: 'there' }}uses "there" if the name is missing.
Example: Liquid in Action
(Below is an example of the code shown in the editor)
Hi {{ user.first_name | default: 'there' }}!
We noticed your birthday is coming up on {{ user.DOB | date_format: "MMMM d" }}.
Result: "Hi Alex! We noticed your birthday is coming up on January 15."
Migration: Liquid vs. Legacy Syntax
Liquid offers significantly more power than the legacy system you may be used to.
| Feature | Legacy Syntax | Liquid |
|---|---|---|
| Logic Depth | Single condition only | Nested conditions supported |
| Combinations | No AND/OR support | Full AND/OR support |
| Data Formatting | Limited | Extensive Filters (Date, Case, Math) |
| Comparison | Raw attribute values only | Can compare transformed values |