Liquid Templates

Learn how to use content templates in your /createMessage API requests


Liquid Templates significantly broaden Pushwoosh’s personalization capabilities by implementing sophisticated logic in addition to regular Dynamic Content usage.

Message personalization in Pushwoosh is based on Tags (user data). Pushwoosh offers a variety of default Tags and custom Tags. Using them, you can specify user’s first name, city, purchase history, etc. to send a more personalized message, for example: Hi {First_name}, thanks for ordering {item}.

Liquid templates add more logic to dynamic content. For instance, if a user's subscription tag contains "free," you can send them a message: “Grab your 10% discount.”

Modifying the message content according to users' IDs, behaviors, and preferences is the most efficient way to increase relevance and get more impressive results from your marketing campaigns.


Content templates based on Liquid by Shopify use a combination of tags, objects, and filters to load dynamic content. Content templates allow to access certain variables from within a template and output their data without having to know anything about the data itself.

To learn more about the syntax, please refer to Liquid documentation.


objects define the content that will be displayed to a user. objects should be enclosed in double curly braces: {{ }}

For example, when personalizing a message, send {{Name}} in its body to add the users' names to the message's content. The user's name (Name tag value) will replace the Liquid object in a message the user will see.

Hi {{Name}}! We're glad you're back!


tags create the logic and control flow for templates. The curly brace percentage delimiters {% and %} and the text that they surround do not produce any visible output when the template is rendered. This lets you assign variables and create conditions or loops without showing any of the Liquid logic to a user.

For example, using the if tag, you can vary the message's language based on what language is set on user's device:

{% if Language == 'fr' %}
{% else %}
{% endif %} 

Tags operators




does not equal


greater than


less than


greater than or equal to


less than or equal to


logical or


logical and


checks for the presence of a substring inside a string or array of strings

In tags with more than one and or or operator, operators are checked in order from right to left. You cannot change the order of operations using parentheses — parentheses are invalid characters in Liquid and will prevent your tags from working.


filters modify the output of a Liquid object or variable. They are used within double curly braces {{ }} and variable assignment, and are separated by a pipe character |. Multiple filters can be used on one output, and are applied from left to right.

{{ Name | capitalize | prepend: "Hello " }}


Liquid Templates are available for both messages sent from Control Panel and API requests.

Control Panel

In Pushwoosh, Liquid Templates are applicable to all content fields of any channel message:

  • Push notifications

  • Emails

To add a Liquid Template to your message, insert it into the message's body. You can do it when working with push or email elements, directly from the Customer Journey Builder interface.

Go to Customer Journey Builder > Create Campaign > Drag and drop the following elements to your canvas: Audience-based Entry, Push (or Email), and Exit. Connect the elements. Then click the Push icon, choose Custom content and insert your copy.

To add the Liquid logic, use tag values with the following syntax:

{% if TagName == 'value' %} Content to send in this scenario {% else %} Content to send otherwise {% endif %}

Then click Apply.

Template variables (Pushwoosh Tags) should not contain any spaces and have only alphanumeric values and underscores, e.g., my_tag or myTag instead of My Tag.

Learn more about Liquid Templates in journeys


Use the Liquid syntax in your /createMessage requests to implement Liquid Templates. Templates are available for the "content" parameter of /createMessage request, as well as for any other parameter supporting Dynamic Content, in particular, platform-specific "title", "subtitle", and "image" params.

By using content templates, you can either specify the data in your API requests (passing the "template_bindings" parameter) or get the data from Tag values stored on users' devices (by not using the "template_bindings" parameter). This way, you're able to build user-based push campaigns containing the extremely relevant content.

Please note, that unlike Dynamic Content, the variables in templates should be enclosed into double curly braces as follows: {{myVariable}}.

To define the template logic using the Tags with spaces in their names, use the following technique:

{% capture my_tag %}{{My Tag}}{%endcapture%}
{% if my_tag == 'value' %}
Content to send in this case
Content to send otherwise


Here you'll find several use cases when Liquid Templates come in handy.

Multi-language push

Liquid Templates make it possible to definitely specify in what language should users receive your push messages. Look at the simple example of the API request and the message received depending on template bindings used in the request.

{% if Language == 'es' %}
{% else %}
{% endif %}

Subscription upgrade prompt

Encourage your customers to upgrade their subscription based on their current plan.

{% if Subscription == 'Basic' %}
    Upgrade to Silver for getting more product features and 24/7 support. 
{% elsif Subscription == 'Silver' %}
    Upgrade to Gold for priority support and advanced features.
{% else %}
    Please contact your manager to renew your subscription. 
{% endif %}

List Tags

Content templates are quite helpful to handle Tags of a List type.

Variable size

One of the possible use cases is to deliver different content depending on the number of values the Tag contains. For example, you can provide different discounts to customers with different behaviors. Let's say the customer has some items in their WishList - encourage them to purchase with the most fitting discount based on how many products they're going to buy!

{% if WishList.size >= 3 %}
    Get 20% off your next purchase!
{% elsif WishList.size == 2 %}
    Get a 10% discount on your next purchase!
{% else %}
    Hey, take a look at new outwears!
{% endif %}

Variable contains

One more case you might need to cover is to deal with List Tags values and deliver the most relevant content based on what values the Tag contains.

{% if WishList contains 'Skinny Low Ankle Jeans' %}
    Get 20% off products in your wishlist!
{% else %}
    Hey, take a look at the brand new Skinny Low Ankle Jeans!
{% endif %}


By using the content templates, you're able to adjust messages content according to users' behavior. For example, you can modify the message text to contain plural words in case the List Tag contains more than one value.

    Get 20% off item
{% if WishList.size > 1 %}
    s in your WishList!
{% else %} 
    in your Wishlist!
{% endif %}


Template for timezones converts the date and time according to the timezone specified.

{{ MyDate | timezone: MyTimezone | date: \"%Y-%m-%d %H:%M\" }}

Last updated