SheetRender Blog

Create Offer Letters in Bulk from a Hiring Spreadsheet

By Josh ·

The graduate intake closed on Friday and the tracker has thirty rows in it. Every letter is the same letter, apart from the name, the title, the salary, the start date, and the manager.

Merging those five fields is the easy part. The part that costs you a Tuesday is that one of the thirty will go out carrying somebody else's salary, and the person who discovers it is the candidate.

Can you create offer letters in bulk from a spreadsheet? Yes. One row per candidate plus one approved letter is all any merge tool needs, and four different routes will turn that into thirty personalized PDFs, each carrying its own name, title, salary, and start date.

Settle one question before you pick, though. None of the merge routes collects a signature. If what you need back is a countersigned copy, skip to the e-signature section, because that changes the answer.

The candidate sheet does most of the work

Every route below reads the same thing, and it is dull by design: one row per candidate, one column per field that changes.

  • candidate_name, candidate_email, and the postal address if the letter is posted
  • position_title, department, reports_to
  • annual_salary, start_date, location, employment_type
  • letter_date, and an offer_expires date if you give candidates a deadline
  • signatory_name and signatory_title, because the VP of Engineering signs the engineering offers and the head of ops signs the rest

Two things about that sheet decide whether the batch goes smoothly.

Store the salary the way it should print. Word's merge pulls the underlying cell value, so a cell displaying $118,000 through Excel's currency formatting arrives in the letter as 118000. You can fix that in the Word field code with a numeric picture switch, and you will get it wrong at least once. A plain text column that reads $118,000 sidesteps the problem, and since every route on this page reads the same sheet, it is the version I would keep. I have only had to prove the point against Word.

Freeze the sheet before you merge. Not literally, just socially. Recruiting coordinators edit the tracker while you are running the batch, and a row that changes between your preview and your send is the one that goes out wrong. Copy the intake into its own tab, merge from the copy, and the tracker can keep moving.

The letter itself should be the version employment counsel signed off on. Whatever route you pick, the wording is the thing that must survive the trip intact, and every route below has a different way of failing at that. There is a job offer letter template here with the matching candidate spreadsheet if you are starting from nothing, but if your company already has a letter, use that one.

Four ways to create offer letters in bulk

Word mail merge from the hiring spreadsheet

The classic. If your offer letter is a .docx that HR has been hand-editing since 2019, Word is sitting right there and needs nothing installed.

  1. Open the letter in Word and go to Mailings > Start Mail Merge > Letters.
  2. Select Recipients > Use an Existing List, then browse to the .xlsx and pick the sheet holding the intake.
  3. Put the cursor where the name goes and use Insert Merge Field for each column. Salary and start date get the same treatment.
  4. Preview Results and arrow through three or four records. Check the longest candidate name and the highest salary, since those are the two that break a layout first.
  5. Finish & Merge > Edit Individual Documents to produce the merged output.

Where it breaks: at step five. Microsoft's own instructions describe the result plainly: Word "opens a single new document that contains all the individual letters" (Microsoft Support (opens in a new tab)). Thirty offers, one thirty-page file. You can export page 17 on its own through the print dialog, so a single letter is retrievable; what Word will not do is cut the file into thirty PDFs and name each one after the candidate on it. That job is a macro, and the one that does it is written out step by step elsewhere on this blog.

The second cost is your attention. Word merges when you press the button and never when you are away from it, so the sending afterwards is thirty attachments picked by hand out of a folder of near-identical PDFs. That is how the wrong salary reaches the right inbox. I would not run a thirty-letter round this way twice, and the last route on this page exists because I stopped being willing to.

Google Docs and Autocrat

If the intake tracker is already a Google Sheet, this fits the job almost exactly. An offer round is the friendliest possible shape for a document merge: one candidate is one row is one letter, no grouping, no line items, no rows that have to be summed. Autocrat does that shape and nothing fancier, it costs nothing, and I would put an intake of thirty through it without looking further.

  1. In the sheet, open Extensions > Autocrat. The submenu item reads Open in Autocrat's own guide and Launch in some third-party write-ups, so take whichever your sheet offers. (That guide still calls the menu Add-ons, from before Google renamed it.)
  2. New Job, name it something you will recognize in six months, like Offers - Sept grads.
  3. Choose your template. Autocrat merges into Google Docs and Google Slides, and a letter belongs in Docs. Fields are written as <<Candidate Name>> and <<Annual Salary>>, matching your column headers exactly. The tags are case sensitive.
  4. Map the tags to columns. If the headers match the tags, Autocrat does this for you.
  5. Set file type to PDF and choose multiple output mode, the setting that produces a separate file per candidate instead of one long document.
  6. Pick a Drive destination folder, then turn on the share and email step if you want each candidate to receive their own letter.
  7. Save, then run the job.

Where it breaks: the template has to be rebuilt inside Google, so somebody retypes the approved letter into Docs and gets the letterhead close enough. That is the real price of this route, and it is charged once. Do the rebuild with the approved version open beside it and read the two against each other before a candidate sees either, because a clause dropped during retyping is invisible afterwards. The other ceiling is Google's. Autocrat executes as Apps Script under your own account and spends that account's daily budget, so a heavy round can halt mid-batch with some offers delivered and some not. Those budgets, and the other add-ons in the same category, are covered in our guide to mail merge from Google Sheets.

A couple of rounds a year at that size will never come near those ceilings. Do the rebuild, save the job, and this route is finished for good. If rebuilding the letterhead in Docs is the part your team will quietly never get around to, read the SheetRender section before you commit to this one.

DocuSign or Dropbox Sign, if you need it back signed

None of the merge routes collects a signature. An offer letter usually needs to come back signed, and a PDF in a Drive folder is not signed. If your process is "send the letter, get it countersigned, file it," then the merge is a step you are building yourself in the middle of a tool that already does the whole thing.

Both major e-signature products do bulk sends from a CSV, and both merge per-row values into the document, so the salary and the start date arrive on the page and not only in the address line.

DocuSign Bulk Send. You tag a template, rename each field's Data Label to match a CSV column header, download the generated sample CSV, fill it with your candidates, and upload it. Each row becomes its own envelope with that row's salary and start date already filled in. One quirk a DocuSign moderator flags in their community: the prefilled values do not appear in your own preview, only on the recipient's copy, which is unnerving the first time. Bulk Send is included in eSignature Business Pro . Batches cap at 1,000 records, and DocuSign's own developer team recommends staying under 500 per batch (their write-up on bulk sending at scale). Plans also carry an annual envelope allowance, so read yours against the number of offers you expect to send in a year before you commit to a seat.

Dropbox Sign bulk send. Same shape, different numbers. You start from a template, download the CSV, and fill in a name column, an email_address column, and one column per merge field, suffixed with _field. A merge field called salary needs a column headed salary_field. Up to 250 people per bulk send, and the feature sits on the Standard and Premium plans (Dropbox's help page).

Both vendors adjust pricing often enough that I would read their pricing pages rather than trust a number in a blog post; when I last checked, DocuSign Business Pro was $45 per user per month on annual billing and Dropbox Sign Standard was $25.

Where it breaks: the document is a form with fields on it, so your design freedom ends where the tagging begins, and rich letterhead comes across as a flat background you place boxes onto. Neither product lists a Google Sheets integration on its own integrations page, so the CSV is a manual export every round, and that CSV is the whole compensation list going up to the vendor alongside the template. And the seat pricing is aimed at a company that signs things constantly. If you send forty offers a year and nothing else, an e-signature seat is an expensive way to merge a letter, and the cheaper answer is to produce the PDFs some other way and send the ones needing a signature through the signature tool you have.

On the legal side, the ESIGN Act's general rule is that a record "may not be denied legal effect, validity, or enforceability solely because it is in electronic form" (15 U.S.C. 7001 (opens in a new tab)). Read the word "solely". That provision stops a signature being rejected for being electronic; it settles nothing else about whether a particular offer binds anyone, and none of that is mine to answer. Employment counsel where you hire is who answers it. Whether your company wants offers going out this way at all is a policy question for someone above both of us.

SheetRender, when the design is the constraint

SheetRender is our product.

The premise is that you do not rebuild the letter. You upload the offer letter you send today and a model reconstructs it as a template, working out which text on the page came from which column. The wizard runs seven steps, and for an offer round it goes like this:

  1. Data. Upload the intake as CSV or XLSX, or connect the Google Sheet.
  2. Example. Upload your approved letter as PDF, image or HTML only, so a .docx letter gets exported before you upload it.
  3. Design. The model rebuilds the letter and maps its fields to your columns.
  4. Review. The preview puts one real candidate's letter, with their real salary, on the page. This is where you read the wording against the approved version, and where you set the filename pattern to something like {{ candidate_name }} offer letter so the files arrive named after people instead of numbered.
  5. Fine-tune. Corrections go in as instructions, and each one is applied as a targeted edit rather than a rewrite of the whole letter.
  6. Create. Generate the batch. Thirty letters is one run.
  7. Download. Take the zip, or set up delivery: you pick the email column, and each candidate gets their own PDF. The subject line and the message body both take column placeholders, so Your offer from Larkfield, {{ candidate_name }} resolves per row. Leave the message empty and it sends "Your document is attached."

Where it breaks: start with the reconstruction, because it is the risk that matters most for HR. A model rebuilds your letter from the file you upload, and nothing in the system compares the output against the input word by word to prove the wording came through unchanged. I have not had a clause come back altered, and I also have no way to prove one didn't, so read the first generated letter against the approved one line by line before any of it goes out, and again if you ever regenerate the template. Legal-approved wording is exactly the kind of thing that can drift by a word without anyone noticing until it matters.

The rest of the list is shorter. There is no e-signature step at all: you get PDFs, and countersigning happens wherever it happens today. Nothing is written back to your sheet. And a candidate list is not a neutral spreadsheet, so what happens to it is set out in full in the next section, including the part where five real salaries reach a third-party model provider. Read that before you decide, because for some HR teams it decides everything.

The free plan holds 50 documents a month, 2 templates, and 30 days of file history, and stamps a "Made with SheetRender" footer on every page starting with document one. Spend that allowance on testing whether the rebuild of your letter is faithful. Do not spend it on candidates: a footer advertising the software that produced somebody's compensation package is not the impression an offer should make. That watermark setting is decided when a batch begins and stays fixed for it, so paying partway through a round does not clean up the letters you have already made. You regenerate them. Paid plans open at $19 a month for 1,500 documents and $49 for 10,000, when I last checked. The offer letters and HR documents page has the fuller version of the workflow.

Where the salary column goes

Most document merges are a formatting problem. This one is a formatting problem with a compensation database attached, and the same question goes to every route on the page: who else can open the sheet, and where do its contents travel?

The failure I hear about is duller than any of it. Somebody attaches the wrong PDF to the right email. Per-row delivery, where the tool reads the address from the same row as the letter, is the one version of this job where that particular mistake is structurally impossible, and it is the strongest argument for automating the send rather than the generation.

  • Word merge. The data stays on your machine and wherever the .xlsx lives. If that is a shared drive folder the whole department can open, the salary column is already readable inside your company, and no merge tool caused it.
  • Autocrat. The merge itself happens inside your Google account: template, sheet, and rendering all sit there. Delivery is the exception, because the share and email step sends the letter out like any other email. Fix the destination folder's permissions before the run and not after it. A folder inheriting sharing from a parent is how thirty salaries become readable by thirty-one people.
  • DocuSign and Dropbox Sign. You upload the template and the filled CSV, so the whole compensation list sits with the vendor along with the signed letters. That is the deal you are making for an audit trail.
  • SheetRender. Ours, in more detail than the other three, because it is the one I can describe from the inside. Four separate things happen to that spreadsheet.

What we store. The whole file. You upload a CSV or XLSX and it goes into object storage as it is, not a sample of it, and every PDF the batch renders is stored alongside it. A connected Google Sheet is snapshotted the same way.

What reaches Anthropic. When the template is built, and again each time you send a correction in Fine-tune: your column headers, each with a type we infer from the data, and the first five non-empty rows in full, every field of them. If salary is a column, that is five real salaries against five real names. The letter you uploaded goes too, as the file itself. Generating the batch itself sends nothing; the model calls are the design and the corrections. This is the paragraph I would put in front of whoever owns data policy at your company before anything gets uploaded.

What the email provider sees. If you use per-row delivery, the message and the attached letter go out through our email provider, currently Resend, so each candidate's address and their PDF pass through a third party on the way. Downloading the zip and sending the letters yourself keeps that step out of the picture entirely.

What deletion does, and does not, guarantee. Deleting a project removes its records and asks storage to drop the files behind them. A file that fails to delete is logged as a warning and the request still reports success, and our privacy policy allows limited copies to survive in backups for a short period. Generated files also expire on their own, after 30 days on the free plan and longer on paid. Treat deletion as a request made in good faith rather than a proof of erasure, and make it anyway once the round is signed.

Rescinded offers and changed start dates

Offer rounds do not hold still for a week. A start date slips, a candidate negotiates the number and wins, or a req gets pulled after the letter went out. The first two are a document problem and the third is not: a withdrawn offer is a conversation someone has to have, and whether you can withdraw at all is a question for employment counsel in the country you are hiring in, especially once the candidate has resigned somewhere else. What the tooling owes you is the smaller half, so here is what one changed row costs on each route.

Word is the worst of the four here, because the merged document is one file and the letter you need is buried in the middle of it. Most people fix that letter by hand, which is fine once and corrosive as a habit: the moment a letter is edited outside the merge, the sheet and the document disagree, and next quarter nobody knows which was right. Autocrat handles it by rerunning the job with a merge condition set so only the changed row qualifies. Before the candidate signs, the e-signature tools let you void or cancel the request and send a fresh one. After they have signed, neither will unwind it: the completed record is final, and the move is a new request that says on its face it replaces the earlier one. SheetRender has a per-row regenerate that reruns that single document, with a caveat worth knowing: it renders against the template's current design, so if you have edited the template since the batch ran, the replacement can look slightly different from its thirty siblings.

Whichever route you take, fix the cell first and regenerate second. Doing it the other way round is how the sheet and the letter start disagreeing.

The comparison

RouteTemplate lives inOutputPer-candidate emailSignatureCost
Word mail mergeWord .docx on your machineOne combined document, split by macroManual, or merge to email without PDFsNoneIncluded with Office
Google Docs + AutocratA Google Doc you rebuild with <<tags>>One PDF per row in a Drive folderYes, from a columnNoneFree, limited by Apps Script quotas
DocuSign Bulk SendA tagged DocuSign templateOne envelope per row, 1,000 per batchYes, that is the deliveryYes, with audit trailIncluded in eSignature Business Pro
Dropbox Sign bulk sendA tagged Dropbox Sign templateOne request per row, up to 250Yes, that is the deliveryYes, with audit trailStandard plan and above
SheetRenderYour existing letter, uploaded as PDF, image, or HTMLOne PDF per row, named from a columnYes, from a column, subject and body templatedNone50 documents a month free, watermarked

Quick answers

Can I mail merge offer letters with different salaries? Yes, and every route on this page does it. The salary is a column like any other. The thing that trips people up is formatting: keep the column as text that reads $118,000, because a merge pulls the raw cell value and a currency format applied in the spreadsheet does not travel with it.

How do I email each candidate their own offer letter? Keep an email column in the intake sheet and use a tool that reads the address from the same row as the letter. Autocrat, both e-signature products, and SheetRender all do this. Word does not, unless you merge to email and give up the PDF attachment.

Can bulk offer letters be signed electronically? Yes, but not by a merge tool. Document merges produce PDFs; signature collection is a separate product. Either run the whole round through DocuSign or Dropbox Sign, which merge and collect in one pass, or generate the PDFs however you like and upload the ones that need countersigning.

What if an offer is rescinded or the terms change? Changed terms are the easy case: edit the row and regenerate that one letter. Sending the replacement with a line saying it supersedes the earlier one is ordinary practice rather than a legal rule. If the candidate has already signed, you are past what a merge fixes, and the e-signature products will not unwind a completed signature; you send a replacement that supersedes it. Rescinding an offer outright is a different question, and it is one for employment counsel where you hire rather than for anything on this page.

Which one should you pick?

  • Offer letter is a .docx, batch is small, nobody needs separate files: Word mail merge. Print or merge to email and move on.
  • Tracker is in Google Sheets and you can rebuild the letterhead in Docs once: Autocrat. Free, right-shaped for an offer round, and the rebuilt template serves every intake after this one.
  • The signed copy is what you need back, and your company already pays for signatures: DocuSign or Dropbox Sign. Do not build a merge next to a tool that merges.
  • The letter is a designed PDF nobody will rebuild, and you would rather not be the person watching the batch finish: SheetRender. Read its disclosure section above first; the data question there decides it for some HR teams.

Thirty letters, one coordinator, and a candidate with a competing offer deciding on Thursday. That is the shape of the problem, and no merge tool changes it. What a tool decides is the smaller thing: whether the spreadsheet stays the record, and nothing ever gets corrected in the PDF. Keep that and the next intake of thirty is an afternoon. Break it once and you will be sitting there six months from now holding two versions of the same offer, working out which one the person signed.

Ready to turn every row into its own polished PDF?

Free plan · No credit card required