Liquid
Inline Liquid in the token picker is in beta. It may not be turned on for your account yet. To request access, contact Paminga Support.
Personalized fields drop a value into your content. Liquid lets you decide what to do with it.
Liquid is a widely used templating language. In Paminga it reads your contact, account, event, and token values, then lets you apply conditions, format dates, do arithmetic, and loop over multi-select values. "Gold members see this paragraph." "Your trial ends in 6 days." "You're registered for Tuesday, April 14 at 11:00 AM." All of it is rendered per recipient.
If you're coming from Marketo, Paminga can convert your Velocity scripts to Liquid for you. See Converting From Velocity.
The Liquid Template element is available in every account. Liquid tokens, which put Liquid inline in your text through the token picker, are the beta part.
Where You Can Use Liquid
Liquid Template and Code Elements
The Email, Form, Landing Page, and CTA builders all include a Liquid Template element, which starts with a small working example, and a Code element. Both accept HTML and Liquid together. See Asset Builder Elements for the full list.
Select the element and edit its content in the right-hand panel. Expand to the full-screen HTML / Liquid Editor when you need room.
Liquid Tokens
Liquid tokens put Liquid inline, inside a sentence, a heading, or a button label, wherever you'd insert any other token.
- Open the token picker in a text editor
- Choose Liquid as the token source
- Write your template in the Liquid Template editor
- Optionally, give it a Chip Label, the name shown on the token chip in your content. Without one, the chip shows the first 10 characters of your template
- Click Apply
Liquid tokens are not offered in Text Messages, where the token picker sticks to plain values.
Elsewhere
Paminga also renders Liquid typed directly into:
- The HTML of custom HTML emails
- Text Message content
- Values written by the Set Field Values action
The Editor
The Liquid editor is built to keep you out of trouble:
- Readable field names. Fields are stored by ID, but the editor shows you their names
- Liquid Docs. Hover the info icon beside the editor. Available Fields lists every field and token you can use, grouped as Contact, Account, Global, Folder, and Event. Click one to add it. Examples holds ready-made snippets for every pattern on this page, also one click to add
- Format Code tidies your indentation
- Error checking. Common mistakes are flagged as you type, and the editor won't save a template that uses an unknown filter, puts a value after a pipe with no filter name, or leaves out the colon before a filter's argument
Previews in the builder fill your template with sample values. To see real values, send a test to a contact whose data you know.
What You Can Reference
Insert fields from Liquid Docs rather than typing them. The editor writes the reference for you.
| Group | What it holds |
|---|---|
| Contact | The recipient's standard and custom contact fields |
| Account | Standard and custom fields of the recipient's account |
| Global | Your account's details: company name, display name, address, city, state, zip, country, business phone, and website URL |
| Folder | Folder Tokens from the asset's folder and the folders above it |
| Event | Details of your Events: name, description, start and end times, registration deadline, time zone, capacity, registration link, and more |
A few values deserve a note:
- Drop-down fields output their label.
.labeland.idgive you each one explicitly - Multi-select fields are lists of options, each with a
.labeland.id. Loop over them, count them withsize, or join them withmap: "label" | join: ", " - Number, decimal, and true/false fields arrive as numbers and booleans, so math and comparisons work as you'd expect
- An event's join link is personal: for a registered contact it's the link from their own registration
Tags
Paminga supports the standard Liquid tags, including:
| Tag | Use |
|---|---|
{% if %} {% elsif %} {% else %} | Show content when a condition is true. Combine conditions with and / or; test text with contains; test for empty with == blank |
{% unless %} | Show content when a condition is false |
{% case %} {% when %} | Choose between several values |
{% for %} | Loop over a list. limit: caps the loop; forloop.index numbers the items |
{% assign %} | Store a value in a variable |
{% capture %} | Store a block of rendered text in a variable |
{% comment %} | Notes to yourself that never render |
Add a hyphen, as in {%- or -%}, to trim the whitespace around a tag. That keeps logic-heavy templates from leaving blank lines in your email.
Filters
Filters transform a value: {{ value | filter: argument }}. Chain as many as you like.
| Category | Filters |
|---|---|
| Text | append, prepend, capitalize, upcase, downcase, replace, replace_first, remove, remove_first, strip, lstrip, rstrip, strip_html, strip_newlines, newline_to_br, truncate, truncatewords, slice, split, escape, escape_once, url_encode, url_decode |
| Numbers | plus, minus, times, divided_by, modulo, round, floor, ceil, abs, at_least, at_most |
| Lists | size, first, last, join, map, where, sort, sort_natural, reverse, uniq, compact, concat |
| Dates | date |
| Fallbacks | default |
These are the filters the editor accepts. A filter that isn't on this list fails at render time, which is why the editor won't let you save one.
Paminga's math filters are forgiving: a blank value counts as 0, and dividing by zero returns 0 rather than an error. A contact with an empty date field won't break a "days since" calculation, though the result will be meaningless, so guard it with {% if %} when it matters.
Examples
In these examples, field names stand in for the references Liquid Docs inserts for you.
A Friendly Fallback
Hi {{ contact.First_Name | default: "there" }},
Content by Membership Level
{% case contact.Membership_Level %}
{% when "Gold" %}
Your Gold benefits renew next month.
{% when "Silver" %}
You're 2 events away from Gold.
{% else %}
Join the loyalty program and start earning.
{% endcase %}
Days Until a Date
{%- assign now_ts = "now" | date: "%s" -%}
{%- assign end_ts = contact.Trial_End_Date | date: "%s" -%}
{%- assign days_left = end_ts | minus: now_ts | divided_by: 86400 -%}
{% if days_left > 0 %}Your trial ends in {{ days_left }} days.{% else %}Your trial has ended.{% endif %}
date: "%s" converts a date to seconds, so subtracting two of them and dividing by 86,400 gives days.
Formatting a Date
{{ event.Spring_Summit.Start_Time | date: "%A, %B %d at %I:%M %p" }}
renders as something like Tuesday, April 14 at 11:00 AM.
Listing Multi-Select Choices
{% if contact.Interests.size > 0 %}
You told us you're interested in {{ contact.Interests | map: "label" | join: ", " }}.
{% endif %}
Converting From Velocity
Moving from Marketo? Click Convert from Velocity in the Liquid token editor, or the Convert from Velocity Script button on a Liquid Template or Code element.
The converter works in three steps:
- Paste Script. Paste your Velocity Script
- Map Fields. Each Velocity variable is matched to a Paminga field, with a confidence score. Confirm or change each match under Map To, then click Convert
- Preview & Insert. Review the converted Liquid, then click Insert into Editor
Review the result before you use it. Anything that couldn't be translated is flagged in the preview.
Limits
Each render has a ceiling on how much work it can do. A runaway loop is stopped before it can stall a send. Real templates, even long and logic-heavy ones, come nowhere near it.


