A mail merge sends the same email to a list of people, each copy personalized with their own name, company or any other column from your sheet. Google Sheets and Gmail can do this on their own with one short Apps Script file. You don’t need an add-on or a subscription.
This guide uses Sheets Mail Merge, a free, MIT-licensed script. Setup takes about 5 minutes.
Put headers in row 1. One column must be named exactly Email. Add any other columns you want to use in the message, for example:
| First Name | Company | |
|---|---|---|
| Ana | ana@example.com | Northwind |
| Ben | ben@example.com | Contoso |
The script adds an Email Status column the first time it runs, and records each send there.
Code.gs and click Save.The first time you use the menu, Google asks for permission. Because it’s your own unpublished script, Google shows “Google hasn’t verified this app”. Click Advanced → Go to (your project name) → Allow. The script only reads your sheet and sends from your Gmail. Nothing goes to any outside server.
In Gmail, compose a new message and leave it in Drafts. Use {{Column Name}} wherever you want a value from the sheet:
Subject:
{{First Name}}, quick question about {{Company}}Hi {{First Name}},
…
Formatting, links, inline images and attachments in the draft all carry over to every email. Placeholders must match the column headers exactly, though spaces inside the braces are ignored.
In the sheet, choose 📧 Mail Merge → Send Test to Myself and type the draft’s subject line when asked. The script fills in the first unsent row and sends that version to your own inbox only. Check the names, the formatting and the images.
Choose 📧 Mail Merge → Send Emails and pick the same draft. Each row gets its own personalized email, and the Email Status column records the time it was sent.
ERROR: ... (for example, a mistyped address) is retried on the next run, so fix the address and run it again.Is it really free? Yes. The script is MIT licensed and runs on your own Google account. The only limit is Gmail’s daily quota.
How is it different from YAMM? Same Gmail-draft workflow, without YAMM’s 20-a-day free limit. See the comparison.
Do I need to install an add-on? No. It’s one script file inside your own sheet, so no third-party add-on gets access to your data.
Can I mail merge with attachments? Yes. Attach files to the Gmail draft, and every email includes them. To send a different file to each person, add an Attachments column with Google Drive links: see mail merge with personalized attachments.
Do images in the email work? Yes. Images pasted into the draft body are re-attached inline so they display instead of showing as broken.
Can I send each person their own pre-filled Google Form? Yes. Build a link per row with Form Prefill Links, then put {{Prefilled Link}} in the draft.
Can I personalize the subject line? Yes. Placeholders work in both the subject and the body.
What happens if a cell is empty? The placeholder is replaced with nothing. Rows with an empty Email cell are skipped.
Does it work with Google Workspace accounts? Yes, and the daily limit is higher there.
Get the script on GitHub · If it saves you time, you can pay what you want on Gumroad. · Also free: automatic deadline reminders from Google Sheets