Mail-merge preview

Paste your copy and a list of recipients, then read each personalized message as it will arrive. It catches {first_name} before it sends.

Mail-merge preview, the tool

Your copy

Body

Hi {{first_name}},

I was reading {{one_specific_thing}} and had one idea I think is worth ten minutes of your time.

Worth a short call next week?

Best,
Sam

Paste from Google Docs, Word or Notion. Bold, links and lists are kept. Write a merge tag as {{first_name}}.

Your list

Drop a .csv here, or paste rows. The list starts with sample data, made up.

Every message

company
4 of 5. Uses the fallback in row 3
first_name
All 5 rows have a value
one_specific_thing
4 of 5. Sends blank in row 4

5 messages2 blocked3 clean

What it checks in each message

Address
A missing or malformed address blocks that message.
Subject
An empty subject blocks it.
Empty merge fields
A field with no value and no fallback blocks the message, because it would send with a visible gap. Write {{company|your team}} and the fallback is used and the row is only counted.
Unresolved tags
A merge tag that did not resolve is flagged for a look.
Placeholder links
A link to example.com or to # is flagged.
Size
A message over 102 KB is flagged, because Gmail is reported to clip near that size. See the email size checker.

First-name fallbacks in 23 email tools

A fallback is what goes out when a row has no first name. Without one, most tools send a blank, and a few hold the email back. Each tool links to its own documentation, read in October 2026.

The first-name merge tag in each tool, how to give it a fallback, and what is sent when it is empty.
ToolFirst-name tagWith a fallbackIf it is empty
Email platforms
Mailchimp*|FNAME|**|IF:FNAME|**|FNAME|**|ELSE:|*there*|END:IF|*A conditional merge tag. Or set a default merge tag value on the field, in Audience fields and merge tags.Our Mailchimp guideA blank space
HubSpot{{contact.firstname}}Set a fallback value when inserting the token, or a default for the property under Settings, Marketing, Email, Personalization.Our HubSpot guideBlank, if no default is set
Klaviyo{{ first_name }}{{ first_name|default:'there' }}Our Klaviyo guideBlank, so "Hey ,"
ActiveCampaign%FIRSTNAME%No fallback inside the tag. A default value is set on the contact field, under Contacts, Fields; check the First Name field accepts one.Our ActiveCampaign guideA blank space
Brevo{{ contact.FIRSTNAME }}{{ contact.FIRSTNAME|default:"there" }}Not documented
Kit{{ subscriber.first_name }}{{ subscriber.first_name | strip | default: "there" }}Not in subject lines, where Kit does not run filters.Nothing: the greeting reads Hello ,
Customer.io{{customer.first_name}}{{customer.first_name | default:"there"}}On the latest Liquid version.The message is not sent, and is logged as Failed
Salesforce Marketing Cloud%%First_Name%%%%[Set @firstName = Trim(AttributeValue("First_Name")) Set @greeting = Iif(Empty(@firstName), "Hi there,", Concat("Hi ", @firstName, ","))]%%%%=v(@greeting)=%%AMPscript, or a default value on the profile attribute. AttributeValue returns null when the field is missing, where reading the field directly can fail the send.Our Marketing Cloud guideBlank
MailerLite{$name}{$name|default('there')}A blank space
Constant Contact[[FIRSTNAME]][[FIRSTNAME OR "there"]]In custom-code emails; the editor has a Fallback field when you insert a contact detail.Blank
Campaign Monitor[firstname,fallback=][firstname,fallback=there]A space: Hey , check out
Braze{{${first_name}}}{{${first_name} | default: 'there'}}A value of only spaces does not count as empty.Our Braze guideBlank
Iterable{{firstName}}{{defaultIfEmpty firstName "there"}}Not documented
Marketo Engage{{lead.First Name}}{{lead.First Name:default=there}}Adobe documents a newer format for the Email Designer, {%=lead.city ?: "fallback" %}. Copy what the token picker inserts.Our Marketo Engage guideNot documented
Salesforce Account Engagement (Pardot){{Recipient.FirstName}}{{#if Recipient.FirstName}}Hi {{Recipient.FirstName}},{{else}}Hi there,{{/if}}Or set a Default Mail Merge Value on the field, under Account Engagement Settings, Configure Fields, Prospect Fields. A field default overrides the conditional.Our Pardot guideNothing is displayed
Oracle Eloqua<span class="eloquaemail">FirstName</span>No fallback inside the tag. Each field merge is a component (Assets, Components, Field Merge) with a default value, shown when the contact field is empty. The span holds the field merge's name.Our Eloqua guideNot documented
Cold email tools
lemlist{{firstName}}{{firstName|there}}Nothing: Hello ,
Instantly{{firstName}}{{firstName | there}}Not documented
Smartlead{{first_name}}{{#if first_name}} Hey {{first_name}}, {{else}} Hey there, {{/if}}Blank
Apollo{{contact.first_name}}{{#if contact.first_name}}{{contact.first_name}}{{#else}}there{{#endif}}The email is held back and moved to Not sent
Outreach{{first_name}}{{#if first_name}}{{first_name}} {{else}}there{{/if}}The step fails with Missing template variable
Mail merge from a spreadsheet
Gmail mail merge@firstnameNo fallback inside the tag. Gmail flags the missing value before sending and asks for a default.An error before anything is sent
Mailmeteor{{ firstname }}{{ firstname | there }}A blank space

A tag goes out as typed, braces and all, only when the tool does not recognize it: mistyped, or written in another tool’s format. Mailchimp and lemlist both say so. That is the email that arrives saying Hi {first_name}.

Who do you want to hear back from?

Tell us who you sell to and what you have tried. We'll get back to you ASAP, and if it looks like a fit, we build it into your systems within days.

Or write to hello@draftship.io