Check your mail merge before you send
A step-by-step run through the add-on, from install to a Ready to send tab. Checking is free and unlimited. The Ready tab, batches, full preview, report, saved campaigns and mail-server lookup are paid, and each is marked Pro where it appears.
What the problem is
A mail merge is the one spreadsheet job where a mistake is sent to hundreds of people and
can't be recalled: Hi ,, {{First Name}} sent literally, dates
arriving as 45923, the same person emailed three times, one person's details
sent to another person's address, and the run stopping at today's quota.
This add-on reads your recipient list and your email template, finds what would go wrong, and shows you exactly what each recipient will receive — then (Pro) writes a clean Ready to send tab for whichever merge tool you already use. It never sends email and never touches your source tab.
Before you start
- Google Sheets™ in a desktop browser. The add-on does not run in the Google Sheets™ mobile apps.
- The add-on installed from the Google Workspace™ Marketplace. See the support page.
- A spreadsheet with a recipient list in it, and your email draft to paste from.
- Nothing leaves Google. The checks run in the sidebar, in your browser. The add-on's only network traffic is to the licence server, and only ever a licence key and an anonymous install id — plus domain names, only if you switch the mail-server check on. The privacy notice says so in full.
Step 1 — Install
Extensions › Add-ons › Get add-ons, then search for “Mail Merge Pre-flight Check”.
Step 2 — The list
In the spreadsheet, open Extensions › Mail Merge Pre-flight Check › Open pre-flight check. Pick the list tab (the header row and email column are detected and editable), pick a suppression list if you keep one, and say which tool will send it — the profile is auto-suggested and you confirm.
Step 3 — The email
Paste the subject and body from your draft. Tags highlight as you type: green matched, red no column, amber blanks in some rows. You can skip the template for a list-only check.
Step 4 — Check
Press Check. The readiness badge says how many will send cleanly; the cards group blockers, warnings and advisories with click-to-cell; the preview shows exactly what each recipient gets — the first 5 plus the 3 worst, free.
Step 5 — The Ready tab Pro
Make “Ready to send” tab writes a clean list with emails trimmed and lowercased, invisible characters removed, accepted typo fixes, duplicates and suppressed rows moved to an Excluded tab with reasons, and headers spelled exactly as the template's tags — so your merge tool maps them with no fiddling. Then open YAMM, Mailmeteor, GMass or Gmail™ mail merge on that tab. Split into batches divides it by quota, in order.
Step 6 — Saved campaigns Pro
Save this campaign files the list, the template and your answers, in this spreadsheet or your own. Next month: Extensions › Mail Merge Pre-flight Check › Re-check last list — one click. Running a campaign someone else saved is free.
Step 7 — Entering a licence key
Expand Enter a licence key at the bottom of the sidebar, paste the key from the end of checkout, and press Activate. It covers 3 Google accounts, and takes effect immediately.
The checks, one by one
Each check below says what it is, why it breaks a merge, and how to fix it by hand — so the guide stays useful even before you install anything, and free users can fix everything themselves. Every finding in the sidebar links to its section here.
MM-01 — The email column: missing or ambiguous
What it is. No column looks like addresses, or two do. The check reads header names (Email, e-mail, localised spellings) plus the share of values shaped like addresses.
Why it matters. Without an email column there is nothing to send to; against the wrong column, every other check reads the wrong recipients.
By hand. Name the address column “Email”, or pick the right column in step 1 of the sidebar.
MM-02 — Invalid address syntax
What it is. Missing @, double @, spaces inside, trailing dots, doubled dots, no domain ending. A pragmatic pattern, not full RFC 5322 — tested against +tags, apostrophes, subdomains and IDN.
Why it matters. Merge tools skip or bounce these rows, and some stop the run to complain.
By hand. Fix them in the source tab, or let the Ready tab drop them — they land on Excluded with reasons.
MM-03 — Invisible characters
What it is. Leading or trailing spaces, non-breaking spaces, zero-width
characters, line breaks, mailto: prefixes.
Why it matters. Most tools trim spaces, but invisible characters and
mailto: survive into the send and bounce.
By hand. =TRIM(CLEAN(SUBSTITUTE(A2,CHAR(160)," "))) catches
most of it; the Ready tab does all of it.
MM-04 — Duplicate recipients
What it is. The same address twice or more, compared case-insensitively after cleaning.
Why it matters. Duplicates get the email twice, which reads as spam and doubles unsubscribes.
By hand. Sort a copy by email and delete the thinner row of each pair — or let the Ready tab keep the fullest row and list the rest on Excluded.
MM-05 — Domain typos
What it is. gmial.com, hotmial.co.uk,
outlok.com, .con, .co for .co.uk —
a bundled typo map plus edit distance against the top mail domains, UK-biased.
Why it matters. A typo'd domain either bounces or, worse, delivers to a stranger.
By hand. Check each flagged domain yourself. In the sidebar, suggestions are accepted per domain and never applied silently.
MM-06 — Several addresses in one cell
What it is. Two or more addresses separated by semicolons, commas, slashes or “and”. Whether the tool accepts it is per profile.
Why it matters. Most tools expect one address per cell; the rest fail the row or mail the wrong person.
By hand. Give each address its own row, or keep one and move the rest to a CC column.
MM-07 — Role addresses
What it is. info@, noreply@, admin@
and forty-odd more local parts that go to a role or a nobody.
Why it matters. Role addresses bounce more, complain more and never open — all of which hurts deliverability.
By hand. Swap them for a named contact where you have one.
MM-08 — Disposable domains
What it is. Throwaway-mail domains from a bundled, dated list.
Why it matters. Throwaway addresses never belong to an engaged reader. The list only catches the famous ones — it says so plainly.
By hand. Ask those recipients for a real address, or drop the rows.
MM-09 — Test and placeholder addresses
What it is. test@, example.com, asdf@
and friends.
Why it matters. Test rows mailed to real inboxes bounce or confuse; mailed to nobody, they waste quota.
By hand. Delete the rows, or let the Ready tab drop them.
MM-10 — Suppression-list overlaps
What it is. Addresses also on the Unsubscribed / Do-not-contact tab or column you pick.
Why it matters. Mailing someone who unsubscribed breaches trust — and, in the UK, PECR. This is compliance hygiene, not legal advice.
By hand. Filter them out before the run. The Ready tab excludes them automatically.
MM-20 — Placeholders with no column
What it is. {{Frist Name}}: a tag nothing matches, with the
nearest header suggested.
Why it matters. The tag sends literally — the “Dear {{First Name}}” email.
By hand. Fix the tag spelling, or add the column.
MM-21 — Near-miss headers
What it is. The tag and the header differ only by case, spaces or
punctuation (First Name vs First name). Whether it still merges
depends on the tool's matching rule, which the card states.
Why it matters. With a strict tool the field arrives empty; with a forgiving one it works until the list moves.
By hand. Spell the header exactly as the tag, so any tool matches it.
MM-22 — Blanks in fields the template uses
What it is. Per used placeholder, the rows with nothing to merge.
Why it matters. A blank merged field is the “Hi ,” email — or a gap mid-sentence.
By hand. Fill the blanks, drop the rows, or add a fallback where the tool
supports one ({{First Name|there}} style) — the card shows the syntax.
MM-23 — Template syntax errors
What it is. Unbalanced braces, smart quotes inside tags (rich-text paste), a fallback in a tool that has none, tags in a subject the tool doesn't merge.
Why it matters. A malformed tag never merges — it sends as typed, braces and all.
By hand. Retype the tag by hand (never paste from Word with smart quotes on) and check the tool's fallback and subject rules below.
MM-24 — Columns the template ignores
What it is. Headers that look mergeable but no tag uses.
Why it matters. Usually harmless — but sometimes it is the field you meant to merge and mistyped in the tag.
By hand. Add the tag if it was meant to be merged; otherwise ignore this.
MM-25 — Header problems
What it is. Blank or duplicate headers, headers below row 1, merged header cells, characters the tool cannot address.
Why it matters. Every one of these breaks the tag-to-column mapping for at least one tool.
By hand. One plain header per column, in row 1, unmerged.
MM-30 — Display surprises
What it is. Dates, currency, percentages and formatted numbers where the raw value differs from what you see — shown side by side with what the tool reads.
Why it matters. Dates arrive as 45923, £1,234.00 as
1234 and 20% as 0.2 when the tool reads raw values.
By hand. Format a copy of the column as plain text holding exactly what should send, and merge that.
MM-31 — Lost leading zeroes, long numbers
What it is. Phone numbers and IDs stored as numbers: leading zeroes the raw value has lost, scientific notation, 16-digit IDs Sheets cannot hold exactly.
Why it matters. The tool reads the number, not the display — and the number is already wrong.
By hand. Store phones and IDs as text (leading apostrophe): retype them
or use =TEXT(A2,"0") and paste as values.
MM-32 — Formula errors that would send
What it is. #N/A, #REF! and friends in merged
cells.
Why it matters. “Your balance is #N/A” is never the email anyone meant to write.
By hand. Fix the formulas, or fill the cells by hand.
MM-40 — Misaligned rows (the sorted column)
What it is. The email doesn't match the name on its row across a run of consecutive rows — what a single sorted column looks like. It fires only on a run (5+ mismatches after 10+ matches) with cross-evidence, never on single rows, and shows its evidence on the card.
Why it matters. This sends one person's details to another person — the worst email a merge can send.
By hand. Undo the sort, or re-sort every column together by a stable key — then re-check before anything sends.
MM-41 — Filtered and hidden rows
What it is. A filter is on (or rows are hidden); whether the tool skips or sends them is per profile.
Why it matters. Half the list silently missing is a support ticket; half silently mailed is worse.
By hand. Clear the filter and delete (or move) the rows that should not send, then re-check.
MM-42 — Already sent
What it is. The tool's status column says rows were sent
(EMAIL_SENT).
Why it matters. A re-run either skips these recipients or mails them twice.
By hand. Filter to the unsent rows for this run — or clear the status column to re-send to everyone, deliberately.
MM-43 — Blank rows and rows with no address
What it is. Blank rows inside the list, and rows with data but no email.
Why it matters. Some tools stop at the first blank row; a row with no address cannot be mailed at all.
By hand. Delete the blanks; fill the addresses or drop the rows.
MM-44 — The list on the wrong tab (Gmail™)
What it is. Gmail™ mail merge reads the first tab; the list is elsewhere.
Why it matters. Gmail™ merges whatever sits on the first tab — the wrong tab means the wrong recipients.
By hand. Drag the list tab first — or make the Ready tab and let it move there.
MM-45 — Quota vs recipients
What it is. Recipients (including CC/BCC columns) against the tool's and account's daily limit, with the verified date stated.
Why it matters. The run stops at the limit and the tail of the list never mails — or the tool refuses to start.
By hand. Split the run across days in order, or confirm a higher limit. Quotas change: the sidebar always names the limit it used.
One section per merge tool
Syntax, fallbacks, matching, quota and quirks per tool — each field verified by a real send (spike S1), with its verified date. Where a field says “unknown”, the finding says “check with your tool” instead of guessing.
- Check your list before a YAMM merge
- Check your list before a Mailmeteor merge
- Check your list before a GMass merge
- Check your list before a Gmail™ mail merge
Generic << >> merge
Tag syntax: <<First Name>>. The rest of this section is published once every field has been checked by a real send. Until then the add-on says “check with your tool” where it is unsure.
Generic {{ }} merge
Tag syntax: {{First Name}}. The rest of this section is published once every field has been checked by a real send. Until then the add-on says “check with your tool” where it is unsure.
Gmail mail merge
Tag syntax: @First Name. The rest of this section is published once every field has been checked by a real send. Until then the add-on says “check with your tool” where it is unsure.
GMass
Tag syntax: {FirstName}. The rest of this section is published once every field has been checked by a real send. Until then the add-on says “check with your tool” where it is unsure.
Mailmeteor
Tag syntax: {{First Name}}. The rest of this section is published once every field has been checked by a real send. Until then the add-on says “check with your tool” where it is unsure.
Yet Another Mail Merge
Tag syntax: {{First Name}}. The rest of this section is published once every field has been checked by a real send. Until then the add-on says “check with your tool” where it is unsure.
Not affiliated with Google or any merge tool. Tool names appear nominatively only.
The pre-send checklist
Some checks can't be automated without Gmail™ or Drive scopes — which this add-on deliberately never asks for. The Report tab carries this list:
- Send yourself one test through your merge tool and read it on a phone.
- Check the unsubscribe line (or list footer) is in the template.
- Open every attachment and Drive link in a private window — “anyone with the link”.
- Confirm the suppression list you checked against is today's, not last month's.
- Check today's sending quota covers this run — or send it as batches.
- If this is a re-run, decide what the already-sent rows should do.
Limits
- Desktop browser only. The add-on does not run in the Google Sheets™ mobile apps.
- 50,000 recipients × 50 columns. Past that the list is refused by name — it is a job for an email service provider, not a Sheets merge.
- It can't tell if an address exists — only that it's well-formed and its domain looks right. The mail-server check (Pro, opt-in) adds MX records. Your merge tool's bounce report is the final word.
- Quotas change. The sidebar always names the limit it used and its verified date.
FAQ
Does my data leave Google? No. The checks run in the sidebar, in your browser. The only network call this add-on makes is to the licence server, for a licence key and an anonymous install id — plus domain names, only if you switch the mail-server check on.
Will it change my sheet? Never. It only reads the list tab; every output goes to new tabs.
Does it send email? No. Your merge tool sends; this checks first.
Can my colleague run my campaign? Yes — a saved campaign travels with the spreadsheet (or export the settings). The licence belongs to the Google account, not the sheet.
Does it work with Excel? No — Google Sheets™ only. There is no Excel version of this add-on.
If something looks wrong
Email support@appgarden.co.uk, and say which rule looked wrong. A copy of the list that produced a wrong finding — or missed a real one — is the most useful thing you can send. Only send one you are content to share, and read the privacy notice first.