HR batch processing

Batch-fill offer letters from a spreadsheet

Sending offer letters one at a time, opening the template, typing the name, salary, start date, saving, repeating, is a slow process that introduces typos. Here's how to do a whole batch from your HR spreadsheet in under five minutes, with no data leaving your computer.

The problem with the current approach

Most HR teams still fill offer letters manually. Open the template, type the candidate's name, check the title, copy-paste the salary, set the start date, save as a new file, repeat. With five hires it's a nuisance. With 20 it's an afternoon. With 50 it's a real risk of error: a salary figure transposed, a name misspelled, a start date from last month still in the file.

And if your template is a Word document, the layout can shift when someone opens it on a different machine with a different version of Office. A PDF template solves that. A PDF looks identical on every device, every time.

What you need to set this up

Two things. A fillable PDF offer letter template, meaning a PDF with actual form fields for the variable parts: candidate name, job title, department, start date, salary, manager name, and whatever else changes per hire. And your HR spreadsheet with one column per variable and one row per candidate.

If you only have a Word version of your offer letter, you'll need to convert it to a fillable PDF first. The guide on what a fillable PDF is explains how to add form fields using LibreOffice (free), Adobe Acrobat, or online tools. It takes about 20 minutes to set up your template the first time. After that, every future batch takes two minutes.

Setting up your HR spreadsheet

Your spreadsheet column headers should match your PDF field names as closely as possible. If your PDF has a field called "CandidateName", name the spreadsheet column "CandidateName". Exact matches map automatically in the tool. Mismatches need a manual selection, which is fine for a handful, but tedious if every column needs remapping every time you run a batch.

A practical set of columns for offer letters: CandidateName, JobTitle, Department, StartDate, BaseSalary, BonusTarget, ManagerName, OfferExpiryDate, OfficeLocation. Add or remove based on your actual template. Keep the spreadsheet clean: one header row in row 1, one hire per row, no summary rows at the bottom.

Format dates as text strings before exporting to CSV. "July 14, 2026" or "2026-07-14" both work. If Excel stores them as dates, save the column as Text or use the TEXT formula (=TEXT(A2,"MMMM D, YYYY")) so the CSV contains the formatted string, not a serial number like "45678".

The privacy argument for client-side processing

Offer letters contain some of the most sensitive data your company holds. Candidate names, salaries, bonus structures, start dates. Uploading that spreadsheet to a cloud tool to fill PDFs means it leaves your network and sits on someone else's server, even if only briefly. Most online PDF tools work this way.

FillPDFfromCSV processes everything inside your browser. The spreadsheet and PDF never travel anywhere. If you have a data handling policy, a GDPR obligation, or just a reasonable preference for keeping employee data in-house, this approach fits. You can disconnect from the internet after the page loads and the tool still runs.

Running the batch

Save your Excel spreadsheet as CSV UTF-8 (File, Save As, "CSV UTF-8" in the format list). Go to fillpdffromcsv.com. Drop your fillable PDF offer letter into the first zone and the CSV into the second. Check the mapping table: each PDF field should have a matching CSV column assigned. Fix any that don't. Hit Generate.

You get a ZIP file with one offer letter PDF per candidate, named by the first column (so "Alice_Smith.pdf"). You also get a single merged PDF with all letters in sequence, useful for a final review before sending. Both download immediately.

Sending and storing the letters

The tool generates the filled PDFs. What you do next is up to you: email each file individually, use your ATS attachment tool, or run them through an e-signature platform. FillPDFfromCSV doesn't store the output. Once the files are downloaded, they're yours.

A note on accuracy

The tool fills exactly what's in your spreadsheet. If a salary figure is wrong in the CSV, it'll be wrong in every PDF that uses it. Run a quick spot-check on one or two output files before sending the whole batch. Compare the PDF to the source row. Two minutes of checking is better than re-sending 30 corrected letters.

Related guides

If you're new to the tool, start with how to fill a PDF from Excel for a full walkthrough of the CSV export and mapping steps. If you want to understand how field names work in fillable PDFs, read what a fillable PDF is. The broader concept of one-PDF-per-row is covered in PDF mail merge. All guides are on the guides hub.

Frequently asked questions

Our offer letters have a signature line. Can I pre-fill a signature?

If the signature is a typed name in a text field, yes, the tool fills it like any other field. If you need a handwritten-style signature image, that's not supported. Most teams using this workflow send the filled PDF through an e-signature tool (DocuSign, HelloSign) for actual signing.

Can I include conditional text, like different bonus language for different roles?

The tool fills fixed form fields. It doesn't support conditional logic within the PDF itself. For conditional text, the usual approach is to have a separate template per role, or to write the full bonus text into the CSV cell and map it to a large text field in the PDF.

How do I name the output files by candidate name instead of a number?

The tool uses the value in your first CSV column to name each file. Put CandidateName (or whatever you want in the filename) as the first column in your spreadsheet, and the files will be named accordingly.

Is there a way to process only some rows, not all of them?

The simplest approach is to export only the rows you need to CSV. Filter your spreadsheet to the relevant rows, copy them to a new sheet, and export that. The tool processes every row in the CSV it receives.

What if the PDF has checkboxes, like a benefits-election form?

Yes, checkboxes work. In your CSV, use "Yes" or "true" (or the export value your PDF expects) in the column mapped to each checkbox field. The guide on <a href="/fillable-pdf-form-explained/">what a fillable PDF is</a> covers checkbox field values in more detail.