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
| Route | What recipients get | Daily ceiling I found |
|---|---|---|
| Bcc in a normal Gmail message | One message, addresses hidden | Consumer Gmail: 500 recipients in one email or 500 emails a day (Gmail Help) |
| Gmail mail merge (Google Workspace) | One message each | 1,500 messages per day for mail merge (Workspace Admin Help) |
Apps Script with MailApp | One message each | 100 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
namevariable 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.
| Day | Sent that day | Total sent |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 100 | 200 |
| 3 | 100 | 300 |
| 4 | 100 | 400 |
| 5 | 50 | 450 |
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
- MailApp, Apps Script reference, read 11 October 2026
- Apps Script quotas, read 11 October 2026
- Gmail sending limits in Google Workspace, Admin Help, read 11 October 2026
- Gmail sending limits, Gmail Help, read 11 October 2026