Personalizing emails with tokens
Fill in names, order details, and company information from the recipient's contact record and primary company.
Overview
Section titled “Overview”Tokens are placeholders in a template’s subject or body that Transactional Email replaces with real values at send time. Two kinds are supported:
{{ contact.<property> }}— a property of the recipient’s contact: the HubSpot contact whose email (primary or additional) matches Recipient email in the workflow action. If several contacts share the address, the most recently updated one is used.{{ company.<property> }}— a property of that contact’s primary company.
Tokens inserted with HubSpot’s Personalize button in the email editor work
too: they look like {{ personalization_token('contact.firstname', 'there') }},
and the second value is the default.
Use each property’s internal name, such as firstname, lastname, or a
custom property like order_number. You’ll find it on the property’s details
in HubSpot’s property settings.
Examples
Section titled “Examples”| You type | The recipient sees |
|---|---|
Hi {{ contact.firstname }}, |
Hi Dana, |
Hi {{ contact.firstname | default('there') }}, |
Hi there, (when the contact has no first name) |
Order {{ contact.order_number }} is confirmed |
Order 10482 is confirmed |
Thanks for choosing {{ company.name }} |
Thanks for choosing Acme Inc. |
Your {{ contact.plan_tier }} plan renews on {{ contact.renewal_date }} |
Your Gold plan renews on November 1, 2026 |
How values are filled in
Section titled “How values are filled in”- Empty properties become empty text. If the contact has no value, the
token disappears — unless you give it a default with
| default('…'), as in{{ contact.firstname | default('there') }}. - No primary company? Company tokens are empty, or use their default.
- Unknown properties don’t block the send. If a token names a property that doesn’t exist — usually a typo — it becomes empty, the email still sends, and the send’s entry in the Send log lists the tokens it left empty under Unknown tokens left empty.
- Dates read naturally. Date properties show as a date such as
October 3, 2026, and date-and-time properties add the time in UTC, such asOctober 3, 2026 14:05 UTC. - Dropdown, radio, checkbox, and yes/no properties show their labels —
the text you see in HubSpot, such as
Gold plan— not the option’s internal value. Several selected options show as a comma-separated list. A label you change in HubSpot can take up to an hour to show in sent emails. - Special characters are escaped, so a property value can’t change the email’s layout.
What isn’t supported
Section titled “What isn’t supported”- Other HubL —
{% if %}blocks, loops, and filters other thandefault. - Tokens for deals, tickets, or other objects, even when the workflow is enrolled on one. Copy the value onto the contact first if you need it.
- Unsubscribe, subscription-preference, and office-address tokens
(
{{ unsubscribe_* }},{{ site_settings.* }}). They’re removed, because transactional email has no unsubscribe footer.
- Type tokens exactly as shown above, with the
contact.orcompany.prefix, so they’re recognized. - Add a default to every token in a greeting or subject line, so a missing value never leaves a gap.
- After changing tokens, send a test to yourself and check its entry in the Send log for unknown tokens. App Home’s error report doesn’t count them, so the send log is the place to look.
Related articles
Section titled “Related articles”Ask the help center
Answers come from these guides, with links to the articles used.
Ask anything about Transactional Email or VLOOKUP for Workflow.

