How to Generate Payslips in Bulk for Your Employees

Design one payslip, mark the few fields that change as variables, fill a spreadsheet with one row per employee, and download every payslip as a PDF, no code.

Jagadeesh
Jagadeesh
June 27, 20267 min read

Payday comes around every month, and with it the same chore: a payslip for every person on the team. Each one looks identical (your company name, the same row labels, the same layout) and each carries a different set of numbers. Building them one at a time, by hand, is the slow way to spend an afternoon.

There's a faster path. Design the payslip once, mark the handful of things that change, and hand ImaginePDF a spreadsheet with one row per employee. You get back a folder of finished payslips: one PDF per person, no code, no copy-paste.

This guide walks the whole loop, start to finish.

A spreadsheet of employees becomes a zip of payslips
One row per employee in, one payslip per row out: a whole pay run from a single design.

Start with a payslip you can reuse

You don't have to start from a blank page. ImaginePDF has free, ready-made payslip designs. Browse them on the payslip maker, or pick a layout built for your region, like the UK payslip or the India salary slip. Choose the one closest to what you need.

Want something exactly your own? Build it in the visual editor instead: drop in your logo, set your colors, and lay out earnings and deductions the way your company does.

Either way the goal is the same: one payslip design, open in the editor, that you'll reuse every pay period. The bulk run lives in your workspace, so this is where it begins.

Mark only what changes

Look at a finished payslip and notice how little of it actually varies. The company name, the address, the row labels ("Basic Pay", "Tax", "Net Pay"), the headings, the footer: all of that is the same on every payslip you'll ever issue. Only a few things differ from one employee to the next.

So those are the only things you mark. Click the employee-name field, and in the small toolbar that appears, click the lightning-bolt (⚡) button; its tooltip reads Make Dynamic. The field picks up a dashed outline and a little name badge; type a name into it, like employee_name. Do the same for the pay period: pay_period.

That's the whole gesture: select, click the bolt, name it. (If it's new to you, the variables guide covers it in more depth.) Use plain names with letters, numbers, and underscores, no spaces, because each one becomes a column you'll fill later.

The braces trick for the earnings table

The numbers (basic pay, allowances, deductions, net pay) usually live in a table. Here's the trap to avoid: don't make the whole table dynamic and try to fill it row by row for every person. That would mean re-entering the labels and the structure for all hundred employees, which is exactly the tedium we're trying to escape.

Instead, leave the table's labels as ordinary fixed text. "Basic Pay", "HRA", "Tax", "Net Pay" stay exactly as you typed them, because they're identical on every payslip. Then, in each cell where an amount goes, type a brace token: {{basic}}, {{hra}}, {{tax}}, {{net}}.

A brace token is just a slot: a {{name}} that says "put the spreadsheet's value here." Make the table dynamic with the same ⚡ button and give the table itself a name, say earnings. ImaginePDF reads the braces inside it and turns each one into its own fillable field. The labels, being plain text, are never asked for.

The rule of thumb: braces go on the values that change, never on the labels that don't.

Fixed labels stay as text; brace tokens in the amount cells become CSV columns
Labels are fixed text and stay put. Only the brace tokens in the amount cells turn into spreadsheet columns.

Create a dataset and download the CSV

Now hand the design a spreadsheet. With the payslip open, open the menu in the top bar and choose Create dataset. A dataset is just the table of rows you want to fill. You land on a grid where every field you marked is already a column.

Rather than typing into the grid, click Template to download a CSV with exactly the right headers:

employee_name,pay_period,earnings::basic,earnings::hra,earnings::tax,earnings::net
Asha Rao,June 2026,50000,20000,8000,62000
Vikram Singh,June 2026,60000,24000,10500,73500

Two kinds of header show up here. A field you marked on its own, like employee_name or pay_period, appears under its plain name. A brace token from inside a table appears as table::token, so {{basic}} in the earnings table becomes earnings::basic. The :: just tells you which table the value belongs to. And notice what's not there: no column for "Basic Pay" or any other label, because fixed text never becomes a column.

Fill one row per employee

Open the template in Google Sheets, Excel, or any editor, and add one row per employee: their name, the pay period, and each amount under its column. One row in, one payslip out. A dataset holds up to 100 rows at a time, so you can run a team of a hundred in a single batch (split a larger payroll across a couple of datasets). Save it back as CSV when you're done.

Import and export the batch

Back in the dataset, click Import CSV and pick your file. The rows drop into the grid, matched up by column name, and save on their own. Click any row to preview that exact payslip, with that employee's name, period, and numbers, rendered just as it'll print, so you can sanity-check one before committing to all of them.

When it looks right, click Export. The button counts up as it works (Exporting 12/100…), and a zip lands in your downloads with one PDF per employee. (The mechanics of datasets are covered end-to-end in the bulk-from-CSV guide if you want to go deeper.)

Run it again next month

That's the payoff of doing it this way: the work is front-loaded into the design, and every pay period after is just a fresh spreadsheet. Next month, download the template again, drop in the new numbers, and run it: same polished payslips, new figures, no redrawing.

Start from a free design on the payslip maker, shape it in the visual editor, or look back at how variables and bulk CSV runs work under the hood.

Related guides