Personalizing Emails with Merge Tags
Qomon email templates use Liquid, a template language that lets you insert dynamic content into your emails. Merge tags are placeholders that Qomon replaces with real data when an email is sent - contact names, event details, petition titles, unsubscribe links, and more.
The data available to your template depends on where the email is used:
Email campaigns: Contact data only (
contact.firstname,contact.surname,contact.mail).Action Flow emails: Full contact data, plus action, petition, and online form data.
How Liquid works
Liquid uses two main syntaxes:
Syntax | Purpose | Example |
| Output a value |
|
| Logic (conditions, loops) |
|
You can also apply filters to transform values:
{{ contact.firstname | default: "Friend" }}
Note - Qomon uses open-source Liquid, not Shopify themes. The Shopify Liquid reference covers the same core syntax, but includes Shopify-only objects (product, cart, etc.) that don't exist in Qomon. Use the open-source Liquid docs as your reference.
Finding merge tags in Qomon
To find available merge tags head to the Merge tags panel in the email preview:
Open an email campaign or Action Flow email and click "Open Merge Tags Panel".
In the preview sidebar, add a data source (e.g. a contact or event).
Expand Merge tags to see every available key with a sample value.
Click a key to copy it as a ready-to-use tag, e.g.
{{ contact.firstname }}.
Always copy keys from this panel - names and prefixes match exactly what the renderer expects.
Merge tag namespaces
Tags are grouped by namespace (a prefix before the field name).
contact.* - Contact data
Merge tag | Description |
| First name |
| Last name |
| Email address |
| Mobile phone |
| Membership code |
| Membership end date |
action.* - Events and actions
Available in Action Flow emails where an action is linked to the message.
Merge tag | Description |
| Event name |
| Start date/time (raw) |
| End date/time (raw) |
| Public link |
| Registration link |
| Live stream link |
| Whether broadcast link is hidden ( |
Root-level action keys (no prefix)
These pre-formatted keys are ready for email display. They do not use the action. prefix:
Merge tag | Description |
| Human-readable date range (locale-aware) |
| Human-readable time range (locale-aware) |
| Formatted event description |
| Street and number |
| City and postal code |
| Country |
| Extra info (building, room, etc.) |
Prefer these over raw action.start / action.end / action.pitch - they handle locale and time zone automatically.
site.* - Petitions and online forms
Merge tag | Description |
| Page title |
| Author name |
| Redirect URL after submission |
| End date |
Use {{ site.title }}, not {{ petition.title }} - the petition.* namespace doesn't exist.
Special tags
Merge tag | Description |
| Unsubscribe link - required in all bulk emails |
| "View in browser" link |
<a href="{{ unsubscribe }}">Unsubscribe</a>
<a href="{{ view }}">View this email in your browser</a>
Handling missing data
Contacts often have incomplete profiles. Always plan for empty fields.
Use the default filter for optional text fields:
Hello {{ contact.firstname | default: "there" }},
Use {% if %} to hide an entire block when a field is absent:
{% if contact.mobile %}
Call us: {{ contact.mobile }}
{% endif %}
Use {% unless %} for the reverse:
{% unless action.hide_broadcast_link %}
<a href="{{ action.broadcast_link }}">Watch the live stream</a>
{% endunless %}
Liquid falsy values: Only nil and false are falsy. Empty strings ("") and 0 are truthy - use the default filter rather than {% if %} alone for text fields.
Address keys (lineAddress1, etc.) are omitted entirely when no location is set, so always wrap them in conditionals:
{% if lineAddress1 %}
{{ lineAddress1 }}<br>
{% endif %}
Example: event invitation email
<h2>You're invited: {{ action.name }}</h2>
<p>{{ display_pitch }}</p>
<p>
<strong>When:</strong><br>
{{ display_date_range }}<br>
{{ display_time_range }}
</p>
{% if lineAddress1 %}
<p>
<strong>Where:</strong><br>
{{ lineAddress1 }}<br>
{% if lineAddress2 %}{{ lineAddress2 }}<br>{% endif %}
{% if lineAddress3 %}{{ lineAddress3 }}<br>{% endif %}
</p>
{% endif %}
<p><a href="{{ action.registration_link }}">Register now</a></p>
<a href="{{ unsubscribe }}">Unsubscribe</a>
Common mistakes
❌ Incorrect | ✅ Correct |
|
|
|
|
|
|
Further reading
Open-source Liquid docs - primary reference for Qomon
Liquid
datefilter - for custom date formatting
