Custom context expressions

Custom contexts allow you to apply transformations to your contact data and content. For example, custom contexts can be used to format dates, capitalize names, or assemble custom image urls for downstream use in an email or text message.

The simplest dynamic element is an expression. An expression is surrounded by double curly braces, like so: {{ expression }}. When an expression is reached in the template, the custom context engine will try to match the expression given with the contact properties, and replace that expression with the property value.

For example if you have a contact who's first name is John, "{{ contact.first_name }}" will be rendered as "John".


If the match is not successful, then the expression will not be replaced. Be very careful when designing custom contexts so they degrade gracefully when a field is missing or empty.


You can also combine expressions with filters, conditions and loops to apply powerful transformations to you data.

Sample contact

Contacts in Simon are highly customized representations of a marketing contact. The fields available will depend upon your account's configuration and integrated data sources.

contact.sign_up_date2016-04-01 18:11:30


You can easily display multiple values or contact properties by defining multiple expressions, e.g.: {{ exp1 }} {{ exp2 }}.

{{ contact.first_name }} {{ contact.last_name }}John Doe

Applying filters

Variables can be modified by filters. Filters are separated from the variable by a pipe symbol (|) and may have optional arguments in parentheses. Multiple filters can be chained. The output of one filter is applied to the next.

{{ contact.first_name | upper }}JOHN
{{ contact.first_name | lower }}john
{{ contact.empty_value | default(“default value”) }}default value
{{ "a long text" | truncate(9, true) }}a long...
{{ “hello” | capitalize }}Hello
{{ “10" | int + “10" | int }}20
{{ [3, 2, 5, 1, 4] | sort }}[1, 2, 3, 4, 5]
{{ contact.sign_up_date | add_years(1) }}Apr. 1, 2017


You can easily display multiple values or contact properties by defining multiple expressions, e.g.: {{ exp1 }} {{ exp2 }}.

{{ contact.orders_amount | format_currency(“USD”) }}$9,999.99
{{ contact.orders_amount | format_currency(“EUR”, locale=“fr_FR”) }}9 999,99 €
{{ contact.sign_up_date | format_date }}Apr 1, 2016
{{ contact.sign_up_date | format_date(format='full', locale=‘fr_FR') }}vendredi 1 avril 2016
{{ 0123456789 | format_number }}123,456,789
{{ 0123456789 | format_number(locale="fr_FR") }}123456789

Conditional statements

{% if contact.gender == “male” %}
{% elif contact.gender == “female” %}
{% else %}
{% endif %}

{{ contact.last_name }}
Dear Mr. Seguin


Loops are useful if you want to iterate over a sequence or run the same code over and over again, each time with a different value.

{% for product in contact.last_order_products %}
<li>{{ product }}</li>
{% endfor %}
<li>Product 1</li>
<li>Product 2</li>
<li>Product 3</li>

Advanced string manipulation

Tokens of character-delimited strings can be mapped over without entering a loop.

{# contact.products = "prod1,prod2,prod3" #}

{{contact.products|split(',')|map('title')|join(', ') }}
Prod1, Prod2, Prod3