Some invoices arrive one at a time. Others arrive as a pile: the first of the month lands and every retainer client, every tenant, every wholesale account needs an invoice at once. The layout never changes and the logo never changes; only the client, the numbers, and the line items do.
That pile is what bulk generation is for. With ImaginePDF you design the invoice once in a drag-and-drop editor, mark the handful of fields that vary, and hand it a spreadsheet with one row per client. A few minutes later a zip lands in your downloads with one finished PDF per row. No code, no macros, no copy-paste marathon.
Start from an invoice design
You don't have to start from a blank page. ImaginePDF has free, ready-made invoice designs: browse the invoice maker, or pick a format built for your region, like the GST invoice.
Want it exactly your own? Build it in the visual editor instead. It works the way a canvas design tool does: drag text, tables, and images into place, drop in your logo, set your colors. The difference is what comes out the other end. The editor thinks in print units and renders through a real PDF engine, so the invoice you lay out is the invoice your client receives, not a screenshot of it.
Either way, open the design in the editor. That is where the batch begins.
Mark the fields that change
A hundred invoices from one design works because so little of an invoice actually changes. Your business name, your address, the payment terms, the column headings: identical on every invoice you will ever send. What varies is the client block, the invoice number, the date, and the amounts.
Mark exactly those. Click the client-name field, and in the toolbar that appears, click the lightning-bolt (⚡) button; its tooltip reads Make Dynamic. The field picks up a dashed outline and a small name badge; type a name into it, like client_name. Repeat for client_address, invoice_number, invoice_date, and the totals: subtotal, tax, total. Stick to letters, numbers, and underscores, because each name becomes a spreadsheet column in a moment. (If the gesture is new to you, the variables guide covers it in depth.)
Turn the line items into a table variable
Line items are the part of an invoice that changes shape, not just value. One client owes a single retainer line; another has six deliveries and a surcharge. They live in a table, so select that table, make it dynamic with the same ⚡ button, and name it line_items.
One rule to design by: everything inside a dynamic table is data. When the batch runs, the values you supply fill the table's cells from the first row down. So keep the column headings ("Description", "Qty", "Amount") out of the dynamic table, as a fixed text row or a slim header strip above it. Headings never change, so they should never become columns you have to fill.
Give the table as many rows as your longest invoice needs. A client with fewer items simply leaves the remaining rows blank, the way a printed invoice pad would.
Create a dataset and download the CSV template
Now hand the design its spreadsheet. With the invoice open, open the ⋯ menu in the top bar and choose Create dataset. A dataset is the table of rows you are about to fill: you land on a grid where every field you marked is already a column.
You could type straight into that grid, but for a real billing run it is easier to work where your client data already lives. Click Template to download a CSV with exactly the right headers:
client_name,client_address,invoice_number,invoice_date,line_items,subtotal,tax,totalEach plain field appears under its own name. The line_items table gets a single column, and each of its cells holds a whole item grid in a format you can type by hand: one line per item, columns separated by a pipe.
Fill one row per client
Open the template in Excel or Google Sheets and add one row per client. Most columns read like any spreadsheet: a name, an address, a number, a date, an amount.
The line_items cell is the interesting one. Write each item on its own line inside the cell (Alt+Enter starts a new line within a cell in Excel, Ctrl+Enter in Google Sheets), and separate the columns with a |:
Weekly produce delivery | 4 | 480.00
Cold storage surcharge | 1 | 35.00Spaces around the pipes are optional; they get trimmed. Two items or ten, the cell holds however many lines that client needs, up to the number of rows in your design's table. If a cell carries more lines than the table has rows, the import warns you and keeps the first ones, which is why the table should be sized for your longest invoice.
If you edit the CSV as a raw text file instead of in a spreadsheet, wrap a multi-line cell in quotes:
client_name,invoice_number,invoice_date,line_items,total
Harbor Foods Inc.,INV-2107,1 July 2026,"Weekly produce delivery | 4 | 480.00
Cold storage surcharge | 1 | 35.00",515.00
Northside Cafe,INV-2108,1 July 2026,Espresso beans 5kg | 2 | 190.00,190.00A dataset holds up to 100 rows at a time, so a hundred clients fit in one batch; split a bigger run across a couple of datasets.
Import the CSV and export every invoice at once
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 invoice: that client's name, their items, their totals, rendered just as it will print. Checking one invoice carefully beats trusting a hundred blindly.
When it looks right, click Export. The button counts up as it works (Exporting 12/100…), and a zip downloads with one PDF per client, ready to send. That is the whole run: invoices generated in bulk from one spreadsheet, and next month it gets even shorter, because the design and the dataset are already there. Download the template again, fill in the new numbers, export. (Datasets themselves are covered end to end in the bulk CSV guide.)
If you have tried Bulk Create in Canva
Canva's Bulk Create solves a neighboring problem, and if you already design there it is a natural first stop. It is built for ready-to-share graphics: connect a data source and it swaps the text and images in a design, one copy per row. For social posts, name tags, and event cards, that is exactly right.
Invoices push on its edges. Bulk Create sits on Canva's paid plans, batches cap out at around a hundred designs, and, most relevant here, a data row can only swap flat text: there is no way to hand one invoice three line items and the next one seven. Getting every result out as its own PDF file is a manual affair too.
The flow above is shaped around exactly those needs: the line_items column carries a different item grid for every row, each row previews as its own document, and the export is a zip of separate, finished PDFs.
Mail merge, without Word
If your team predates Canva, you may know this workflow by its older name: mail merge. A Word template with merge fields, an Excel sheet as the data source, the Mailings tab, and an Acrobat plugin or a VBA macro to split the output into separate PDFs. It works, and it has worked since the nineties, but it chains four tools together to do one job, and the result inherits Word's idea of page layout.
A dataset is the same idea with the chain removed. The template is a real design surface instead of a word processor, the merge fields are the variables you marked, and the split-into-separate-PDFs step is simply what Export does.
When invoices should generate themselves, one at a time
Bulk runs fit billing that happens on a schedule. Some invoicing is event-driven instead: an order is paid, a project ships, and that one invoice should exist immediately. For that shape, the same design works as an API endpoint. You send the order's data in a single call and get the finished PDF back, with Zapier, Make, or n8n firing the call for you. The invoice API guide walks through it, line items included.
Either way, the design work happens once. Start from a free design on the invoice maker, shape it in the visual editor, and let the spreadsheet, or the webhook, do the rest.