Use conditionals in messages

Learn how conditional tags give you powerful controls for personalization in your messaging.

There are two types of conditionals that are particularly useful in Klaviyo: 

  • If/else conditionals
    These show an element (e.g., a word, phrase, or block) if a recipient meets certain criteria you set. You can optionally include a series of conditions with different content for each one. 
  • For conditionals
    These iterate through data formatted as a list and show an element repeatedly for each list entry.

If-else conditionals 

If statements allow you to control the content someone receives based on profile or event data. 

In the example below, a person will be shown the first line of text if they have more than 150 loyalty points. If they have less than 150, but more than 0, they will see the second line. And if they have no loyalty points, they will see the third message. 

{% if person|lookup:'Loyalty Points' > 150 %}
Hey VIP! You’ve always got free shipping & free returns

{% elif person|lookup:'Loyalty Points' > 0 %}
You have {{ person|lookup:'Loyalty Points' }} points, and you just need 150 to become a VIP!

{% else %}
Have you heard about our VIP program? Join today on our website to start earning rewards.
{% endif %}

Within an if statement, an initial {% if … %} condition is required, as well as the closing {% endif %} tag. You can use the other elements (i.e., {% elif %} and {% else %} tags) to create more complex if statements, if your use case requires it. You can use an unlimited number of {% elif %} tags, followed by a maximum of one {% else %} tag. Each email recipient will only see the content from the first condition they qualify for, so consider the order of your if and elif conditions. 

Condition structures 

Within your if statement, there are different ways to set up your condition based on how your data is stored (i.e., as text, numbers, lists, or booleans) and what criteria you’d like to use. 

All available condition structures are outlined below, including the data types they are compatible with. These conditions can be used within if or elif tags (i.e. {% if CONDITION %} or {% elif CONDITION %}). 

Note that these conditions are case-sensitive.

Sample conditionShow the block if...Acceptable data types
person|lookup:'Favorite Color'The Favorite Color property is set (has any value)Any
not person|lookup:'Favorite Color'The Favorite Color property is not set (does not exist on the profile, or is empty)Any
person|lookup:'Favorite Color' == 'green'The Favorite Color property has the value greenText, Number
person|lookup:'Favorite Color' != 'green'The Favorite Color property does not have the value greenText, Number
person|lookup:'Age' > 20The Age property contains a number greater than 20Number
person|lookup:'Age' >= 20The Age property contains a number greater than or equal to 20Number
person|lookup:'Age' < 20The Age property contains a number less than 20Number
person|lookup:'Age' <= 20The Age property contains a number less than or equal to 20Number
'green' in person|lookup:'Favorite Colors'The property Favorite Colors contains a list, and green is one of the list items, OR
The property Favorite Colors contains text, and ‘green’ exists anywhere in the text
not 'green' in person|lookup:'Favorite Colors'The property Favorite Colors contains a list, and green is not one of the list items, OR
The property Favorite Colors contains text, and green does not exist anywhere in the text
List, Text

Conditions for booleans

If you are referencing data stored as a boolean, you’ll need to use 1 and 0 rather than “true” and “false” in your condition definition. Do not surround the 1 or 0 in quotes. Use the sample conditions below as a template.

Sample conditionShow the block if...
person|lookup:'VIP' == 1The VIP property is set to the boolean value true
person|lookup:'VIP' == 0The VIP property is set to the boolean value false

Conditions for booleans stored as text

If your true/false data is stored as text, not as a boolean, use the sample conditions for text properties above. If you aren’t sure, or if you are referencing a property that contains both booleans and text, you can use these structures to cover all scenarios. Include all spellings and capitalizations that are present in your data.

Sample conditionShow the block if...
person|lookup:'VIP' == 1 or person|lookup:'VIP' == 'true' or person|lookup:'VIP' == 'True'The VIP property is set to the boolean value true or the strings true or True
`person|lookup:'VIP' == 0 or person|lookup:'VIP' == 'false' or person|lookup:'VIP' == 'False'The VIP property is set to the boolean value false or the strings false or False

For conditionals

For tags allow you to iterate over each item in a variable that stores a list and render them individually. Below is an example statement:

Sample codeResult
{% for item in event.shopping_cart_items %}{{ item.name }} × {{ item.quantity }}
{% endfor %}
Oversized Beach Blanket × 1
Beach Chairs × 430
SPF Sunscreen × 220
Plastic Cooler × 1

Each for statement must contain the following: 

  • An opening {% for … %} tag, containing a row alias (item in the example above) and row collection (event.shopping_cart_items in the example above)
  • A closing {% endfor %} tag

Between the two required tags, you can include any text you’d like. To include variables nested within the row collection, replace the beginning of the variable name (the row collection plus the number following the row collection) with your row alias. For example, the variable {{ event.shopping_cart_items.0.name }} would become {{ item.name }}, and {{ event.shopping_cart_items.0.quantity }} would become {{ item.quantity }}

If you’d prefer to show only a set number of items from a list, apply the slice filter to the row collection. Using the example above, {% for item in event.shopping_cart_items|slice:':3' %} would result in only the first three items on the list displaying (regardless of how many items were on the list). If the list contains three or fewer items, all items in the list will appear once. 

For loops 

To customize how your for conditional treats the first or last item in your list, use the forloop.first or forloop.last variable. 

For example, forloop.last can be used to create a comma-separated list where the word “and” is added between the final two items like this:

Sample codeResult
You need to buy {% for item in event.grocery_list.items %}{% if not forloop.last %}{{ item.name }}, {% else %}and {{ item.name }}{% endfor %}{% endif %}.You need to buy milk, bread, cheese, and eggs.