Aditya Sharma

Send the Same Email to Multiple Recipients Separately in Gmail

On this page, 11 sections

To send the same email to many people separately in Gmail, you need one message per recipient, not one message with everyone in Bcc. Bcc cannot do that. A mail merge feature can, and so can an Apps Script that loops over a sheet and calls MailApp.sendEmail once per row.

Bcc is the shortcut most people try. Bcc hides the addresses from each other, so nobody sees anyone else, but it is still a single email with many recipients.

The bulk email post on this site walks through the script setup. This one is the decision: which route, how many people per day each allows, and the arithmetic for your list.

Three ways to send it, and what each is

RouteWhat recipients getDaily ceiling I found
Bcc in a normal Gmail messageOne message, addresses hiddenConsumer Gmail: 500 recipients in one email or 500 emails a day (Gmail Help)
Gmail mail merge (Google Workspace)One message each1,500 messages per day for mail merge (Workspace Admin Help)
Apps Script with MailAppOne message each100 recipients per day on a consumer account, 1,500 on Workspace (Apps Script quotas)

I read all three pages on 11 October 2026. The Workspace page says its general limit is 2,000 messages per day and that mail merge, previously called multi-send, has its own 1,500 limit.

Do the arithmetic before you send

The limit that bites is the smallest one on the route you choose. I worked this out in Python for a list of 450 people:

  • Apps Script on a consumer account, 100 recipients a day: 450 / 100 = 4.5, so 5 days.
  • Apps Script on Workspace, 1,500 a day: 450 / 1,500 is under 1, so 1 day.
  • Consumer Gmail at 500 a day: 450 fits in 1 day, but Apps Script’s own 100 limit is the tighter one if you send through a script.

Google’s pages say limits can change without notice and Workspace limits apply over a rolling 24 hours, not a calendar day. Treat any number here as a read-on-11-October-2026 figure and check the page before a big send.

The script: one message per row, safe to rerun

This version reads a sheet with the headers email, name and sent in columns A to C. It checks MailApp.getRemainingDailyQuota() first, sends one message per unsent row, writes a timestamp into column C, and stops when the quota runs out. Run it again tomorrow and it carries on.

function sendSeparately() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const rows = sheet.getDataRange().getValues(); // row 1 = headers: email, name, sent
  const subject = "Quick question";
  let left = MailApp.getRemainingDailyQuota();
  for (let r = 1; r < rows.length; r++) {
    const [email, name, sent] = rows[r];
    if (sent || !email) continue;
    if (left < 1) break;
    MailApp.sendEmail({
      to: email,
      subject: subject,
      body: "Hi " + name + ",\n\nThe same message for everyone goes here.\n\nAditya"
    });
    sheet.getRange(r + 1, 3).setValue(new Date());
    left--;
  }
}

I syntax-checked it with node --check and ran it in Node with stand-ins for MailApp and SpreadsheetApp. With 5 rows, one already marked sent, and a quota of 3, it sent to 3 addresses and marked 3 rows. I have not run it inside Apps Script, and no email was sent. Test on a sheet of your own addresses first.

Details that decide whether it works

  • Quota is counted in recipients. The Apps Script quota row reads “Email recipients per day”. The page does not say how Bcc recipients are counted.
  • Per-message cap. The same page lists 50 recipients per message for Apps Script email, so one-per-row also keeps you under that.
  • The sent column is the safety. Without it, a failed run restarts at row 1 and double-sends.
  • Personal fields. The name variable is the whole point of sending separately. Everything else can be identical.

If you also want to know who opened it, that is a separate problem with its own limits. I cover that in separate posts on email open tracking from Google Sheets and on Gmail’s sending limits.

What a 450-person send looks like on a consumer account

With the 100 recipients a day Apps Script allows on a consumer account, the same list runs like this. The sent column does the bookkeeping, so each day’s run picks up the next unsent rows.

DaySent that dayTotal sent
1100100
2100200
3100300
4100400
550450

The 5 days come from rounding 4.5 up. Day 5 sends the last 50. If that is too slow, the Workspace route removes the wait, because the 1,500 limit covers the whole list in one day.

Why not just use a Google Group?

Gmail’s help page suggests it as a way around the recipient limit: create a Google Group of your recipients and send to the group’s address. It works for that purpose. It is also one message delivered to a group, so nothing in it can be personal. It answers a different question from this one.

What the sent column does and does not tell you

The timestamp records that the script asked Gmail to send. It does not record that the message arrived. Gmail’s help page lists two failure modes a sender can see afterwards: an invalid recipient address, and a bounce from the recipient’s mail server. Check your inbox for bounce notices after a run and clear the sent cell for any address you correct.

Mistakes that cause double sends

  • Running the script before you add the sent column, so every run starts from row 1.
  • Writing the timestamp at the end of the loop instead of after each send. If the script stops halfway, nothing is marked.
  • Re-importing the list over the old one and losing the sent values.

The script above writes the timestamp straight after each send, which is the version that survives a timeout.

Clean the list before you send

A separate email per person means one bad row costs one wasted send, and Gmail’s help page lists an invalid recipient address as one of the failures a sender can see. Remove blank cells and obvious typos first; how to remove cells with specific text in Google Sheets covers the cleanup.

If your recipient list comes from a web page, getting data from a website into Google Sheets shows how to pull it into a sheet, and you can then point the script above at that tab.

Questions people ask

Does Bcc send separate emails?

No. It is one message with hidden recipients. Each person gets a copy of that single message.

How many separate emails can I send a day from Gmail?

It depends on the route. Consumer Gmail’s help page names 500 recipients in one email and 500 emails a day. Apps Script lists 100 recipients a day on consumer accounts and 1,500 on Workspace. Workspace mail merge is listed at 1,500 messages a day.

What happens when I hit the limit?

Google’s Workspace page says users cannot send new messages for up to 24 hours after reaching a limit, while still receiving mail.

Do this today

Count the rows in your list and divide by your daily quota, using the numbers above for your account type. If the answer is more than 1, split the send over that many days and use the sent column so each run resumes where the last one stopped.

Resources

Tell me where I am wrong

Your email is not published and I do not add it to any list. Corrections with a source are the ones I act on fastest.