| Audience | Marketers, lifecycle and CRM teams |
| Prerequisites | An email message with content |
Personalization inserts each recipient's own data into the email. Write variables directly into your content, or use logic to build conditional statements and calculations. Hightouch fills them from your warehouse at send time.
Insert a variable
Where the control lives depends on the editor.
| Editor | How to insert |
|---|---|
| Email, HTML | Select Add variable |
| Email, drag-and-drop | Use the merge tag control on the text block you're editing |
| SMS | Select Insert variable in the Message or Link field |
- Search for the attribute you want and select it.
- Select Insert variable.
The variable is written as Liquid, using the attribute name: {{ first_name }}. Variables appear in your content as pills you can click to edit, swap, or remove.
Attributes are grouped by where they come from:
| Group | What it holds |
|---|---|
| Properties | Columns on the profile, such as first name or loyalty tier |
| Entry event | Properties of the event that triggered a journey |
| Relations | Data from related models, such as recent orders |
| Traits | Computed traits, such as lifetime order count |
| Message context | Details of the send itself, such as the subscription topic name |
| Dates | Date values you can format or offset |
Set a fallback value
An attribute with no value renders as nothing, which leaves a gap in your content. Give every variable a fallback so the sentence still reads.
- Select the attribute, then select Add transformation.
- Choose Default and enter the value to use when the attribute is empty.
- Select Insert variable.
The result is {{ first_name | default: "there" }}, which renders "Hello there" for a recipient with no first name.
In the SMS editor you can also select a variable in the preview and set its Fallback value there. A fallback changes the character count. A short name in the preview and a long fallback in real sends can push a message into a second part.
Use the same fallback everywhere a given attribute appears. Two different fallbacks for one attribute is an error that blocks the send.
Transform a value
Transformations reshape a value before it renders: format a date, round a number, change case, or truncate text. Select Add transformation after choosing an attribute, then check the result in the transformation preview before inserting.
Transformations are grouped as Text, Numbers, Arrays, and Dates.
Write Liquid directly
Native Delivery renders content with Liquid. Write it by hand in the HTML editor for logic the picker doesn't cover, including conditionals and loops:
{% if loyalty_tier == "gold" %}
<p>You have {{ points }} points to spend.</p>
{% else %}
<p>Join our loyalty program.</p>
{% endif %}
Conditionals and loops must be hand-written today. The picker covers attribute insertion, fallbacks, and transformations.
What happens when data is missing
Two cases behave differently:
| Case | Result |
|---|---|
| The attribute exists but is empty for this recipient | The message sends. The variable renders as nothing. |
| The attribute name doesn't match a column | The send fails for the whole batch of recipients. |
A name that matches no column fails the send for a whole batch of recipients, not just the one it affects. An empty value is fine and renders blank. A misspelling counts as a misconfiguration, not missing data. Check the composer for variable errors before you activate a campaign.
The composer flags unmatched attribute names while you edit. An empty value for the profile you happen to be previewing is not flagged, because a blank cell on one profile is normal.
At send time, an unrecognized filter or variable renders as nothing, so a recipient never sees a raw {{ placeholder }}. The composer is where to catch these.