Bulk Invoice Generator from Excel / CSV

Upload a spreadsheet with your invoice data → get a ZIP of individual PDF invoices in seconds. 100% local — your data never leaves your browser.

1. Upload your file

📊
Drop CSV or Excel file here
Supported: .csv · .xlsx · .xls — processed entirely in your browser
No file? Load sample data to try it out.

How it works

Upload spreadsheet. Drop a CSV or Excel (.xlsx/.xls) file onto the upload zone. SheetJS converts Excel to rows; PapaParse handles CSV. Your data is read directly in the browser — nothing is uploaded to any server.
Map your columns. Tell the tool which column is the recipient name, which is the item description, which is the amount, and so on. Unmapped columns are simply ignored.
Set invoice details. Add your company name, currency, invoice number prefix, date, and optional payment notes. The tool auto-increments the invoice number for each row.
Generate PDFs. pdf-lib builds a clean, professional A4 invoice PDF for every row in your spreadsheet. Each PDF is named after the recipient.
Download ZIP. JSZip bundles all PDFs into a single .zip file that downloads instantly — open it to find one PDF per invoice.

Frequently asked questions

Is my data private? Does it get uploaded anywhere?
Your data never leaves your device. All processing — CSV parsing, Excel parsing, PDF generation, ZIP creation — runs entirely in your browser using client-side JavaScript. There is no server involved, no account required, and no data is stored or transmitted. The libraries (PapaParse, SheetJS, pdf-lib, JSZip) are loaded from a CDN once, and everything else happens locally.
What columns does my spreadsheet need?
The only required column is the recipient / client name — that is used to name each PDF file and address the invoice. If you also map an amount column, the invoice will display a total. All other columns (email, address, item description, quantity, unit price, invoice number, notes) are optional. Extra unmapped columns are ignored. The first row should be a header row with column names.
Can I handle multiple line items per invoice?
Yes. If multiple rows share the same recipient name (and you have mapped the "Group by" field to recipient), they will be merged into a single invoice with multiple line items. Alternatively, if each row is a separate invoice (one client per row), leave grouping off and each row becomes its own PDF. The tool auto-detects which mode fits your data based on how you map columns.
What file formats are supported?
CSV (.csv) and Excel (.xlsx and .xls) files are fully supported. ODS files from LibreOffice are also accepted by SheetJS. The first row must be a header row. Make sure amounts are stored as numbers (not formatted currency text like "$1,200.00" — strip symbols and commas first, or map to the amount column and the tool will strip common formatting for you).
How many invoices can I generate at once?
There is no hard limit enforced by this tool. In practice, generating a few hundred PDFs takes a few seconds; a few thousand may take a minute or more depending on your device. All processing happens on your CPU — a faster machine will finish more quickly. If your browser tab runs out of memory on extremely large files, try splitting the spreadsheet into smaller batches.
Can I customise the PDF template or add a logo?
This tool uses a clean, professional built-in template that includes your company name, invoice number, date, recipient, line items, subtotal, and notes. Logo and advanced branding customisation are beyond the scope of this free in-browser tool — for those needs, consider a dedicated invoicing app. The PDF output is suitable for most freelance and small-business invoicing needs.