SheetRender Blog

Email Everyone Their Own PDF From a Spreadsheet

By Josh ·

The merge worked. Two hundred and forty PDFs are sitting in a folder, each named for the person it belongs to, and not one of them has moved an inch toward that person.

Nobody writes tutorials about this half. Turning a roster into documents has four or five decent free answers. To email each person their own PDF, every file then has to leave your account, reach an address somebody typed into a sheet months ago, and do it 240 times without stopping in the middle.

Can Gmail send everyone a different attachment? No. Gmail's built-in mail merge personalizes the words and puts the same file on every copy. A different PDF per recipient needs an add-on that reads a column of files, a script you write, or a tool that builds and sends in one pass.

Making the PDFs is the easy half

This page starts where the documents already exist, or where you are about to pick a tool that makes them. If that part is still open, the routes are compared in the Google Sheets mail merge guide, the Word version lives in splitting a mail merge into separate PDFs, and the commercial variant is on the mail merge to separate PDFs page. If the documents are invoices, batch invoices from a spreadsheet covers the grouping problem that comes with them.

Come back here for the send.

Four ways a delivery run goes wrong

Judge every tool below against these four. They are what the support threads are made of.

Everyone got the same attachment. The most common one, and the most expensive. You personalized the greeting, the tool attached the file you picked in the compose window, and 240 people now hold somebody's salary letter. This is not a bug in anything. It is what Gmail's merge does by design, and you find out from a reply.

The address column lies. Six weeks of typing produces maria@gmial.com, a trailing space, an empty cell in row 88, and one person who left in March. A good delivery tool records those rows as skipped and keeps going. A bad one stops, or worse, counts them as sent.

Someone says it never arrived. Now you need a per-recipient record: whether the message left, when, and what the mail server said. Without one you are searching your sent folder by surname, and the answer to "did Priya get hers" is a shrug.

One person needs it again. They deleted it, or their address was wrong and now it is right. Re-running the whole batch means 239 people get a second copy, so most people end up attaching that one PDF by hand.

Gmail's built-in mail merge: personalized text, one shared file

If you are on an eligible Google Workspace edition, the merge toggle in the compose window is the fastest personalized email you can send. It is also the wrong tool for this job, and Google says so plainly in its own documentation: add an attachment and that attachment goes into every recipient's copy. There is no merge tag that points at a file. The help page even works through the storage arithmetic, since 500 copies of a 10 MB file is 5 GB of your Drive.

Two more constraints before you plan around it. The ceiling is 1,500 recipients a day, measured over a rolling 24 hours, so it does not reset at midnight, and it comes out of the same 2,000 message budget as your normal email, with the last 500 held back so a big merge cannot lock you out of replying to anyone. And the edition list is narrower than "paid": Workspace Individual, Business Standard, Business Plus, the Enterprise Standard and Plus tiers, and Education Standard and Plus. Business Starter is not on Google's list (opens in a new tab), and neither is a free gmail.com account.

Where it breaks: the attachment. Everything else about it is fine.

Autocrat: send a personalized PDF from Google Sheets, free

Autocrat is the add-on most people land on, and for this job it does the whole thing. Its merge step produces one document per row, and its last step mails that row's document to an address from that row's own column. Free, no paid tier, no separate sending tool.

The delivery step has a wrinkle in it that catches people out, so here is what it does. In the Share docs & send emails step you point Autocrat at your email column, write the message, and it sends. What its own guide is careful to say is that emailing a merged document also shares that document with the recipient. One action does both. If the recipients are outside your organization, that is a permissions decision you are making whether or not you meant to, and it is worth a look at your Workspace sharing rules before a 300-person run. There is an option to send from a generic no-reply address instead of your own, which is the setting to find if you would rather not field 300 replies personally. That guide is written against an older version of the add-on, so confirm the behavior on a two-row test before you trust it with 300.

Autocrat also writes a status column back into your sheet, which is more than most free routes give you. Read it for what it is. The column records what the merge did, and whether a mail server at the other end accepted the message is a separate question that the column cannot answer. Against the four failures above, that still puts Autocrat ahead of anything you would write yourself in an afternoon.

Where it breaks:

  • The daily ceiling is your Google account's, not Autocrat's. Google's quota table puts email recipients per day at 100 on a consumer account and 1,500 on Workspace (the live figures (opens in a new tab)). Autocrat's own FAQ reprints that table and names the symptom you will see when you cross it: "Failed to send email".
  • Splitting one 400-row job into four does nothing. The counter belongs to the account, and the reset lands 24 hours after the first request, which makes "try again tomorrow" approximate.
  • Add-ons cannot run more often than hourly, which matters if the send is supposed to follow a form submission closely.
  • Recipients get a shared Drive document, per above.

For a class of 30 or a team of 60, none of that bites, and I would not reach past Autocrat. It is the free answer to this exact question.

YAMM, for a folder of PDFs that exists

YAMM is the incumbent for personalized attachments, and it earns that. It does not make your PDFs, so it fits the case where the folder of documents is already sitting in Drive.

The mechanism is a column. Add a column named exactly Attachment (their matching is case sensitive), put each recipient's Drive share link in their row, comma separate them if somebody gets two files, then tick Attach files in column to emails sent under + Alias, filters, personalized attachments. There is a second method that skips the link-pasting: drop every file in one folder, name them after a unique ID column, and YAMM matches them up itself. On a 200-file run that second method is the one to use.

YAMM is also the best answer on this page to "did Priya get hers", and it costs nothing extra to have. It writes a Merge status column into your sheet, one cell per row, moving from EMAIL_SENT through EMAIL_OPENED and EMAIL_CLICKED, or landing on BOUNCED with the reason left in a cell note. Rows that already carry a status are skipped by the next merge, so re-sending to exactly one person is a matter of deleting that one person's status cell. Point a fresh merge at a sheet holding old bounces and it counts them and offers to leave those addresses alone. Three of the four failures at the top of this page, answered by a free add-on and a column.

The price of the trick is worth knowing: clearing a cell to re-send also removes that row from the tracking report, so the record you were relying on is what you spend to fix the row. Their follow-up feature renames the old column and starts a new one instead, which is the non-destructive version.

Where it breaks: the attachment quota is not the headline quota. YAMM's free plan is 20 recipients a day and its Pro tier goes to 400 on a gmail.com account or 1,500 on a confirmed Workspace domain. Turn on personalized attachments and a free plan, a Pro gmail.com account, or a Workspace domain still in its trial or warm-up period is capped at 100 recipients per 24 hours regardless of which of those three you are. It is the same 100 as the Apps Script consumer ceiling, which is unlikely to be a coincidence. Their docs are unusually straight about it, and say outright that the quota is shared with other add-ons and scripts, so a second merge tool installed on the same Google account eats the same budget.

Pricing is per user and their pricing page renders it by billing country, so read it there instead of trusting any figure quoted secondhand, including mine.

On a confirmed Workspace domain that ceiling is 1,500 and none of this bites. Everywhere else, an 800-person roster at 100 a day is eight days of babysitting, and that arithmetic is what eventually pushes people off Google's rails entirely. It is the case the last section on this page is for.

Apps Script, if you want to own the send loop

The send itself is one call. What keeps a homemade delivery run from becoming a mystery is the column you write back to, so that a run that stops at row 149 picks up at 149 instead of at 1:

function sendPending() {
  // Columns: A Name, B Email, C Drive file ID of that person's PDF, D Sent at
  const sheet = SpreadsheetApp.getActiveSheet();
  const rows = sheet.getDataRange().getValues();
  for (let i = 1; i < rows.length; i++) {
    const [name, email, fileId, sentAt] = rows[i];
    if (sentAt || !email) continue;
    if (MailApp.getRemainingDailyQuota() < 1) break;
    MailApp.sendEmail({
      to: email,
      subject: "Your August statement",
      body: "Hi " + name + ",\n\nYour statement is attached.\n\nThanks!",
      attachments: [DriveApp.getFileById(fileId).getBlob()]
    });
    sheet.getRange(i + 1, 4).setValue(new Date());
    SpreadsheetApp.flush();
  }
}

Two things there are the whole point. getRemainingDailyQuota stops the loop cleanly at the ceiling instead of throwing partway through, and the timestamp write followed by flush gets the record into the sheet before the next iteration has a chance to fail. Come back once the quota has refilled and it resumes where it stopped.

It is not airtight. If the send succeeds and the timestamp write is what fails, that row goes out twice on the next run. A row with an empty email cell is skipped in silence, with nothing written down to say so. And it tells you nothing about a bounce, because sendEmail returns when Google accepts the message, which is a weaker promise than a human receiving it, so the address that hard-bounces sits in your sheet with a confident timestamp beside it. Catching that means parsing the delivery reports that come back to your inbox, which is a second script rather than a few more lines of this one.

The ceilings are the same 100 or 1,500 recipients a day, plus a rule people trip over on the attachment side: 25 MB of total attachments per message and 250 attachments, with any one execution killed at six minutes.

Write the bounce parser on top of all that and you will have rebuilt most of the section at the end of this page, which is more or less how we came to build it.

How big can the attachment be

A personal Gmail account tops out at 25 MB per message. Workspace is administrator set and defaults to the same 25 MB, with Enterprise Plus able to go to 50 MB on the web version of Gmail only. That figure is measured before encoding, so the folklore about losing a third of it to base64 is wrong. Compose a message in the Gmail window that goes over, and Gmail does not fail: it strips the attachment and drops in a Drive link, which is a fine outcome for a colleague and a confusing one for a customer who now needs Google permissions to read their own invoice. That rescue belongs to the compose window. Send through a script and Apps Script's own table caps total attachments at 25 MB per message, with nothing swapping in a link on your behalf.

A text-heavy PDF from a merge is well under a megabyte. A certificate with a full-bleed background photo is not, and 40 of those in one message is how people discover the rule.

Zapier and Make, if you pay for glue anyway

If a Zap already runs your intake, bolting a generate step and a send step onto the end of it is a reasonable afternoon. Price the counter before you build, though, because these platforms bill per step rather than per row. Zapier counts one task for every unit of work it finishes for you, so a two-step workflow over 600 rows spends 1,200 of them against a plan whose free tier holds 100 a month. Make uses credits, one per module action, with 1,000 free and 10,000 on its $12 Core plan. Both pages move, so trust them over this sentence. The arithmetic deserves more room than a paragraph, and it gets a post of its own on turning new sheet rows into PDFs without burning Zapier tasks.

SheetRender

SheetRender is our product, so read this section knowing that.

It belongs on this page because generating and sending happen in a single run. Data comes in as an uploaded CSV, an uploaded XLSX, or a Google Sheet you connect. The design comes in as a single example of the finished document, which a model reads and rebuilds into a template pointed at your columns. Once the batch has rendered, you name the column holding email addresses and send.

Three things vary per document, which is per row unless you have grouped several rows into one file, and the difference between them is where people get vague:

  • The attachment itself. Each recipient gets their own document, which is the entire point.
  • The file name. A template field takes your column names, so {{ client }} - Invoice {{ number }} arrives as Birch Dental - Invoice 1041.pdf instead of document_14.pdf. Leave it blank and you get row numbers, or the group name on a grouped batch. Two rows that generate the same name only collide where the files sit together, so the batch download and the Drive folder add a (2) to the second one; an emailed attachment keeps the raw name, which costs nothing when it is the only file in the message.
  • The subject and the message. Both take the same {{ column }} placeholders, so the subject line can carry the invoice number and the body can open with a first name. Leave the message blank and everyone gets the same fixed line, "Your document is attached."

In practice that is a spreadsheet, one PDF you already send, and a column pick. The template step is where the minutes go, because you are checking a rebuilt design rather than typing tags into one. Sending 240 documents afterwards is a column name and a button.

Afterwards there is a Deliveries screen with a row per recipient: sent, failed, or skipped, with the reason attached. Rows with a missing or malformed address are recorded as skipped rather than attempted, a temporary provider failure is retried twice on its own, and a bounce or a spam complaint puts that address on a suppression list, soft bounces included, so the next month's run does not keep mailing it. A row whose PDF failed to render is never mailed at all, which sounds obvious and was a bug once.

Where it breaks:

  • The free tier holds one run of this job. 50 documents a month and 50 emails a month are separate allowances that a single 50-row generate-and-send batch drains together, so the free tier will show you whether this works and will not carry the job. The footer says "Made with SheetRender" and it is on the first document, not just the fiftieth. Rendered files are deleted after 30 days on the free tier.
  • The email does not come from your address. Free and Starter send from a SheetRender address, with Starter able to set a Reply-To so answers reach you. Sending from your own verified domain means DNS records and a Pro plan. Where the requirement is that this lands looking like you sent it personally, YAMM and Autocrat go out through your Gmail account itself and we do not.
  • There is no resend-one-person button. Resend is a whole-run action, and from the Deliveries screen it picks up the rows recorded as failed or skipped. A run that fell over before recording any of them re-sends the entire batch. Fixing one typo and mailing exactly one document is not something the screen does today.
  • You find the monthly ceiling by hitting it. The dashboard shows emails delivered this month, but nothing shows how many are left, so you do the subtraction. Exceeding the plan's allowance refuses the run with an upgrade prompt.
  • A typo in a placeholder ships as text. Write {{ frist_name }} and the subject goes out with the braces still in it, and nothing fails loudly. Send yourself one before you send 240.
  • Attachments cap at 10 MB, which is less than half of Gmail's 25. Past that we do the thing I just criticized Gmail for and swap the file for a download link. Ours expires as well, after three days.
  • The first template is not always right. A model reads your example and rebuilds it, and on a dense or multi-column layout it takes a round or two of correcting before it matches. That cost lands on the first document and never again.
  • Grouped documents read the address off the top row of the group. If one invoice spans four rows and somebody edited the email cell on row three, row three is ignored.
  • The roster travels. Rendering runs on our infrastructure. The template-building step goes further: it shows a model at Anthropic what your columns are called and a few real rows underneath them. On a staff list that means headers like Salary and Home address. Autocrat keeps every bit of it inside your own Drive. Where a written policy covers this, the policy has already chosen for you.

Starter is $19 a month and carries 1,500 documents with 1,500 emails; Pro is $49 for 10,000 of each. Check the pricing page before you budget from that.

The comparison

ToolDifferent attachment per recipient?Sending ceilingCost
Gmail built-in mail mergeNo. One file, copied to everyone.1,500 recipients/day, shared with regular mailIncluded on Workspace Individual, Business Standard and up, and Education Standard and Plus; absent on Business Starter and free Gmail
AutocratYes, that row's merged document100 recipients/day consumer, 1,500 on Workspace$0
YAMMYes, from Drive links in an Attachment column100/24h with attachments on free, gmail.com Pro, or a Workspace domain still in warm-up; 1,500 once that domain is confirmedFree to 20 recipients/day; paid per user, priced by country on their page
Apps Script you writeYes, any blob you can build100 recipients/day consumer, 1,500 on Workspace$0, plus the hours
Zapier or MakeYes, if the step you glue in produces oneYour mail provider's, so about 500/day on consumer Gmail and about 2,000/day on WorkspaceZapier $39/mo annually for 1,500 tasks; Make $12/mo for 10,000 credits
SheetRenderYes, generated and named from your columnsMonthly, not daily: 50 emails/month free, 1,500 Starter, 10,000 Pro. Google's 1,500/day is roughly 45,000/month.Free tier watermarked; $19/mo; $49/mo

One column in that table is not measuring the same thing across rows. Every Google route is rationed by the day, and ours by the month, which flatters us at small volumes and does the opposite at large ones. Google's figures come from its own quota pages as of mid-2026 and it revises them quietly, so confirm any row you are about to build a Tuesday around.

Quick answers

How do I email each person their own PDF from Google Sheets? Use a tool that reads a per-row file or generates one. Autocrat merges the document and emails it to an address column in the same job. YAMM attaches a file per row from Drive links in a column named Attachment. Gmail's own mail merge cannot do it, because its attachment is the same file for every recipient.

What is a PDF mail merge? One document per spreadsheet row, personalized from that row's values, delivered as a PDF. The phrase covers two jobs that different tools solve: producing the files, and getting each one to its own recipient.

How many personalized PDFs can I email in a day? On a free Google account, 100 recipients a day through any script or add-on, including Autocrat. On Google Workspace it is 1,500. YAMM applies its own 100 a day to attachment sends on free and gmail.com Pro accounts. Sending outside Google, through a hosted tool, replaces those daily figures with whatever that tool's plan allows.

Why did everyone receive the same attachment? Because the file was attached to the message rather than pulled from a column. Gmail's mail merge and every plain compose window behave this way. Fixing it means a column of files and a tool that reads it.

Which one should you pick?

  • Words personalized, nothing attached: Gmail's built-in merge, if your edition has it.
  • The documents do not exist yet, the roster is modest, everything is Google: Autocrat. It costs nothing, it writes a status column, and for a class of 30 there is no argument for anything else.
  • The documents are sitting in Drive and you want them mailed: YAMM, watching the 100 a day attachment cap.
  • The send loop should be yours and you are the one who will keep it running: Apps Script, with a written-back timestamp column from day one.
  • Automation you already pay for, and a per-row task cost you have priced: Zapier or Make.
  • The documents do not exist yet, the roster is hundreds long, and this happens again next month: SheetRender. Generating and sending are the same run, the delivery record survives the run, and no part of it is charged against your Google account.

One idea is worth carrying away from all of this. That 100 or 1,500 a day is charged to you, the Google user, and every free route on this page is drinking out of the same cup. Install a second add-on and you have split the day's budget between two tools, which is the opposite of what the person installing it expects. Past the point where the ceiling starts to matter, the interesting question is no longer which tool merges most tidily. It is what you can prove afterwards about all 240 messages. That capability looks like overhead right up to the morning somebody writes to say theirs never came, and from then on it is the only part anyone remembers.

Ready to turn every row into its own polished PDF?

Free plan · No credit card required