Use merge tags for personalization
Merge tags are dynamic placeholders that get replaced with real values at send time. A template with Hi {{contact.name}}, your case {{conversation.human_id}} has been received becomes Hi Erik, your case SUP-251221-0001 has been received when sent.
Before you start
- A Text or Heading block in your template (merge tags only work inside text-bearing blocks)
- A clear sense of which conversation context the email will have when sent — automation-triggered emails have full context; CSAT emails have just the conversation; user-invitation emails have just the user
Insert a merge tag
- Open the template in Settings → Email Studio.
- Click into a Text or Heading block where you want the dynamic value.
- Click the Merge Tags button in the block’s toolbar (or use the inline
{{shortcut, depending on UI version). - Pick the field. The picker is grouped by source: contact fields, conversation fields, custom fields, agent fields, tenant fields.
- The merge tag is inserted as
{{path.to.field}}. Continue typing around it.
You can also type the merge tag directly if you remember the path — {{contact.name}} works without going through the picker.
Common merge tags
{{contact.name}}— The contact’s name{{contact.email}}— The contact’s email address{{contact.first_name}}— First name only (parsed from full name){{contact.custom_fields.<key>}}— A specific contact custom field by key{{conversation.human_id}}— Human-readable conversation ID likeSUP-251221-0001{{conversation.subject}}— The conversation subject{{conversation.url}}— A deep-link URL into the conversation in the app (for agent-facing emails){{conversation.custom_fields.<key>}}— A specific conversation custom field{{agent.name}}— The assigned agent’s name{{agent.email}}— The assigned agent’s email{{tenant.name}}— Your company / workspace name{{tenant.support_email}}— The configured support email for replies
What happens when a merge tag doesn’t resolve
If the field is empty or doesn’t exist on the record being sent:
- Empty value: the merge tag renders as an empty string.
Hi ,(with a missing name) — looks unprofessional but doesn’t break send. - Unknown field path: the merge tag renders as the literal text
{{contact.unknown_field}}. The customer sees the curly-brace template directly. This is louder than empty and helps catch typos.
To avoid empty-name awkwardness, use first-name-or-fallback patterns in plain prose:
Hi {{contact.first_name}},
Then make sure your contact records always have first names populated. Or use a more conversational opener that doesn’t depend on a name:
Hi there,
Custom fields in merge tags
Custom fields (see Custom Fields) are addressable via {{contact.custom_fields.<key>}}, {{conversation.custom_fields.<key>}}, or {{case.custom_fields.<key>}} depending on where the field lives.
The key is the machine identifier (e.g. account_tier), not the display label (Account Tier). Look it up in Settings → Custom Fields → field → Key.
Patterns
- Friendly opener —
Hi {{contact.first_name}}, - Reference the case —
case {{conversation.human_id}} - Link back into the app (agent emails only) —
View at {{conversation.url}} - Personalize by tier —
As a {{contact.custom_fields.account_tier}} customer,(only useful when account tier is reliably populated)
Verify it worked
Wire the template into a test automation, trigger it on a test conversation, and check the delivered email. Every merge tag should have resolved to a real value, OR be visibly empty (which means the source field was empty), OR appear as literal {{...}} (which means the path was wrong — fix it).
Troubleshooting
- Symptom: Merge tag appears as literal
{{contact.name}}in the delivered email. Fix: The path is wrong, OR the template is being sent in a context where the merge tag can’t resolve (e.g. a system email without a contact context). Check the spelling and the calling surface. - Symptom: Customer’s name is missing in the email.
Fix: The contact record doesn’t have a name. Use a fallback opener like
Hi there,for cases where contacts may have email-only profiles.