A Google Workspace add-on for Google Sheets

Mail merge for Google Sheets, sent from your own Gmail

One Gmail draft, one spreadsheet, a personalised message for every row. Mail leaves from your own address, so replies come back to you and copies land in your Sent folder — and results are written back into the sheet as it runs.

Free for 50 emails a day. No card required.

Autumn term letters — Google SheetsSending 128 of 340
A · EmailB · First nameC · Merge statusD · Sent atE · DeliveryF · OpensG · Clicks
amara.osei@northline.sch.ukAmaraSent09:14DeliveredYesYes
j.patel@harbourworks.inJayaSent09:14DeliveredYes
t.okafor@meridian.orgTundeSent09:15Bounced
r.kaur@stellarcast.comRohitSending
m.ferrer@casalibre.esMaríaQueued
d.novak@wireframe.czDanaSkipped · duplicate

Columns C–H are written by the add-on as the campaign runs. The sheet stays usable while it sends.

The middle path

What it is for

The manual way

Copy address, edit name, send

Then do it again, four hundred times. It works, it is nobody’s afternoon well spent, and by row 200 two people are called by the wrong name.

The bulk-platform way

Export the list to a stranger

Upload your contacts to a platform you have no relationship with, then send from a domain that isn’t yours. Fine for newsletters to thousands. Heavy machinery for a note to a class of forty.

Mailer123

Nothing leaves your account

The list stays in the sheet. The template stays in Gmail drafts. The sending is done by your own Google account, at your own address, inside the limits Google already gives you.

Intended use is mail that people asked for: parents on your register, customers who ordered, candidates who applied, guests who replied. Bought and scraped lists are against the terms of service, and the unsubscribe footer on every message is there because you are writing to people who can say no.

Four steps

How it works

  1. 01

    Write a draft in Gmail

    Your normal signature, your normal formatting. Where a name should go, type a merge tag: {{First Name}}. Give it a fallback — {{First Name|there}}— and blank rows read “Hi there”.

  2. 02

    Put your list in a sheet

    One header row, one column of addresses, and any other columns you want to merge from. The add-on guesses which column holds the email addresses and shows you its guess so you can correct it before anything sends.

  3. 03

    Extensions → Mailer123

    Pick the draft, confirm the column, and send — or set a start time and leave it. The form closes, a sidebar takes over with the progress and your remaining quota, and the sheet stays usable while it runs.

  4. 04

    Watch the columns fill

    Status lands row by row as each message goes out, and the tracking columns fill in afterwards as people open the mail and follow links. Nothing to refresh: it is your spreadsheet, updating in front of you.

Written back into your sheet

The six columns it writes back

Opens, Clicks and Bounced are flags, not counts. An open is an image being fetched, so three of them may be one person on three devices — the exact figures and timestamps live in the cell note, where a number that cannot bear that weight is not presented as if it can.

Merge status
Queued, Sending, Sent — or Skipped, with the reason it was skipped.
Sent at
When that row went out, in your timezone.
Delivery
Delivered — or Bounced, once a failure report arrives back in your inbox.
Opens
Whether the message was opened. Blocked images mean the true figure is always higher.
Clicks
Whether a tracked link in the message was followed.
Bounced
The failed address, the status code and the diagnostic text, kept in the cell note.

Ships today

What else it does

Send test email

One message to yourself, through the same draft, merge and MIME path as the real send.

Sends with the sheet closed

An hourly background trigger picks the campaign up and carries on without you.

Resume is free

The sheet is the queue. Close the tab, come back tomorrow, it continues where it stopped.

Bounce detection

Reads the delivery-status reports that land in your inbox and matches them back to rows.

Unsubscribe handling

Footer link and one-click List-Unsubscribe, with an account-wide do-not-send list.

Duplicates and previews

Repeat addresses are skipped, and each campaign shows a merge-tag preview before it sends.

Dashboard

Campaign history that outlives the sheet, CSV export, and billing in one place.

Eight, in full

Every permission we ask for, and why

Eight permissions, requested when you start your first campaign. This is all of them — nothing is requested that isn’t listed here, and each one exists for a feature you can point at. Google sorts them into three tiers; the tier is on every group, along with the real scope string and Google’s own consent-screen wording, so this page and that screen cannot disagree.

Restricted

Reading Gmail — one permission

The only permission here that Google classes as restricted, which is the class that carries an independent annual security assessment. It exists for the two features that cannot work without reading mail: your template is a draft you write in Gmail, and the only evidence that an address bounced is the report that lands in your own inbox.

Read the draft you chose, and find delivery failures

https://www.googleapis.com/auth/gmail.readonly

Google’s wording: “View your email messages and settings

Two things need it. Your template is an ordinary Gmail draft, so this reads the one draft you pick from the dropdown, along with any file attached to it. And Gmail publishes no bounce webhook — the only evidence that an address failed is the delivery report arriving in your own inbox, which has to be read to be understood. Nothing else is read, and no message is stored.
Sensitive

Sending, and running the add-on — four permissions

The add-on sends from your own mailbox rather than a relay of ours. Messages carry your address, your signature and your sending reputation; replies come back to you; copies land in your Sent folder. The other three let it draw an interface, run on a schedule, and reach its own dashboard; none of those read message or file content.

Send the merged messages

https://www.googleapis.com/auth/gmail.send

Google’s wording: “Send email on your behalf

Sends the personalised copies from your own mailbox, so they carry your address, your signature and your sending reputation, replies come back to you, and copies land in your Sent folder. It is the narrowest Gmail scope there is: it can send, and it can do nothing else — it cannot read a message, change one, or delete one.

Keep sending after you close the sheet

https://www.googleapis.com/auth/script.scriptapp

Google’s wording: “Allow this application to run when you are not present

Creates the hourly trigger behind scheduled campaigns and “keep sending with the sheet closed”. Without it, closing the tab ends a campaign mid-list.

Show the dialogs and the sidebar

https://www.googleapis.com/auth/script.container.ui

Google’s wording: “Display and run third-party web content in prompts and sidebars inside Google applications

Draws the campaign form, the quota read-out and the progress sidebar inside the sheet.

Reach this dashboard

https://www.googleapis.com/auth/script.external_request

Google’s wording: “Connect to an external service

Calls this site to check your plan, record campaign totals, and register a sheet for open and click tracking. It is also how tracking is turned off: with no dashboard connected, the add-on disables the tracking options and says so.
Standard

Identity and housekeeping — three permissions

No access to message content, and no access to your Google Drive at all.

The one sheet you have open

https://www.googleapis.com/auth/spreadsheets.currentonly

Google’s wording: “View and manage spreadsheets that this application has been installed in

Reads the rows to personalise each message and writes the six status columns back. Scoped to the single spreadsheet the add-on is open in — deliberately not the scope that would grant access to all of your spreadsheets.

Show which address mail is sent from

https://www.googleapis.com/auth/userinfo.email

Google’s wording: “See your primary Google Account email address

Displayed before the first send, because sending 400 messages from the wrong account should not be a mistake anyone can make quietly.

Prove which account is calling

openid

Google’s wording: “Associate you with your personal info on Google

Identifies your account to this dashboard so your plan and your totals are yours. It grants access to nothing; the alternative would be a shared key shipped inside the add-on, which identifies nobody.

Access can be withdrawn at any time at myaccount.google.com/permissions; revoking stops every send immediately. Retention and deletion are set out in the privacy policy.

Data

What leaves your Google account

Tracking is keyed to a row number, not a person. We can say that row 42 was opened twice, and we can never say who row 42 is — which is also why we cannot answer “who did I send this to” on your behalf. That answer lives in your sheet.

What we receive

  • Campaign totals: sent, opened, clicked, bounced
  • Engagement events keyed to a random spreadsheet token, the campaign, and a row number
  • The account’s email address and its plan

What we never receive

  • Your recipients’ email addresses
  • Message or draft contents
  • Spreadsheet rows
  • Recipients’ IP addresses or user agents

Limited Use disclosure

This app’s use and transfer of information received from Google APIs to any other app will adhere to Google API Services User Data Policy, including the Limited Use requirements.
  • Google user data is never used to develop, improve or train generalised AI or ML models
  • It is not sold, and never used for advertising
  • It is not transferred to third parties except as necessary to provide the service, for security, or to comply with law
  • No human reads it except with your explicit consent, for security, to comply with law, or when it is aggregated and anonymised

Plans

Pricing

One price a month, cancel any time. Every plan sends from your own Gmail account — there is no separate sending domain to warm up and no per-message fee.

Free

$0

50 emails a day

  • Gmail draft templates with merge tags
  • Open and click tracking
  • Unsubscribe handling
Get started free

Personal

Most popular

$3.00 /month

450 emails a day

  • Scheduled campaigns
  • Bounce detection
  • Per-recipient results written back to your sheet
Choose Personal

Professional

$5.00 /month

2,000 emails a day, on Google Workspace accounts

  • Everything in Personal
  • Priority support
Choose Professional

Google — not us — caps a personal Gmail address at 500 messages a day, and a Google Workspace account at 2,000.

No plan raises those limits. Whichever is lower — your plan or Google’s cap — is what applies. Each account type is offered one paid tier: a personal Gmail address upgrades to Personal, a Google Workspace account upgrades to Professional.

Compare plans

Help

Questions

Send your next list from your own Gmail

Free for 50 emails a day, no card required. Install it and send in the next five minutes.