The new personalization engine (introduced in v5.0.0 RC2)

This feature is available starting from Oempro v5.0.0 RC2.

Starting from Oempro v5.0.0 RC2 release, we have introduced a brand new personalization engine and email content tags. We will remain our legacy personalization engine until Oempro v6 version release.

This new personalization engine introduces new syntax. From now on, instead of %...% syntax, the brand new {{ ... }} syntax will be used.

Here’s an example:

{{ Subscriber:EmailAddress }} will be replaced with the email address of the recipient.

In addition to standard personalization, our new personalization engine includes powerful conditional personalization.


Whitespace before or after the delimeters is allowed, however, in certain cases, whitespace within the tag is prohibited (explained in the following sections).

Some valid examples:

{{ name }}
{{name }}
{{ name}}
{{  name  }}

Some invalid examples:

{{ na me }}
{ {name} }


You can add comments to your templates by wrapping the text in {{# #}}.


{{# This will not be parsed or shown in the resulting HTML #}}

    They can be multi-line too.

Prevent Parsing

You can prevent the parser from parsing blocks of code by wrapping it in {{ noparse }}{{ /noparse }} tags.


{{ noparse }}
    Hello, {{ name }}!
{{ /noparse }}

Basic Example:

{{# Parsed: Hello, World! #}}
Hello, {{ name }}!

{{# Parsed: <h1>Oempro is Awesome!</h1> #}}
<h1>{{ title }}</h1>

{{# Parsed: My real name is Oempro User!</h1> #}}
My real name is {{ Subscriber:FirstName }} {{ Subscriber:LastName }}


Conditionals in Oempro are simple and easy to use. It allows for the standard if, elseif, and else but it also adds unless and elseunless.

The unless and elseunless are the EXACT same as using {{ if ! (expression) }} and {{ elseif ! (expression) }} respectively. They are added as a nicer, more understandable syntax.

All if blocks must be closed with the {{ endif }} tag.

Variables inside of if Conditionals, do not, and should not, use the Tag delimeters (it will cause wierd issues with your output).

A Conditional can contain any Comparison Operators (==, !=, ===, !==, >, <, <=, >=). You can also use any of the Logical Operators (!, not, ||, &&, and, or).


{{ if Subscriber:FirstName }}
    <p>My name is {{ Subscriber:FirstName }} {{ Subscriber:LastName }}</p>
{{ else }}
    <p>I don't know what my name is</p>
{{ endif }}

{{ if Subscriber:CustomField18 == 'customer' }}
    <p>You are a Customer!</p>
{{ elseif Subscriber:CustomField18 == 'trial' }}
    <p>You are a trial User.</p>
{{ else }}
    <p>I don't know what you are.</p>
{{ endif }}

{{ unless age > 21 }}
    <p>You are too young.</p>
{{ elseunless age < 80 }}
    <p>You are to'll kill ya!</p>
{{ else }}
    <p>Go ahead and drink!</p>
{{ endif }}

The not Operator

The not operator is equivilent to using the ! operator. They are completely interchangable (in-fact not is translated to ! prior to compilation).

Undefined Variables in Conditionals

Undefined variables in conditionals are evaluated to null. This means you can do things like {{ if foo }} and not have to worry if the variable is defined or not.

Checking if a Variable Exists

To check if a variable exists in a conditional, you use the exists keyword.


{{ if exists Subscriber:CustomField100 }}
    Foo Exists
{{ elseif not exists Subscriber:CustomField100 }}
    Foo Does Not Exist
{{ endif }}

You can also combine it with other conditions:

{{ if exists Subscriber:CustomField100 and Subscriber:CustomField100 !== 'test' }}
    Something here
{{ endif }}

The expression exists foo evaluates to either true or false. Therefore something like this works as well:

{{ if exists Subscriber:CustomField100 == false }}
{{ endif }}

JSON Custom Fields

If the subscriber custom field value is a JSON data, the personalization engine can detect this and you can personalize your email content with any values inside the custom field.

For example, if the custom field value is:


You can personalize your email content with any of these values:

{{ Subscriber:CustomFieldXXX:key2 }}

XXX represents the target custom field ID.