Batch Invoices From a Spreadsheet Without Accounting Software
By Josh ·
Twelve clients, forty-one rows of billable work, and an afternoon that disappears into duplicating a tab and retyping a company name into it. Making batch invoices from a spreadsheet is a solved problem, but only by tools that know one invoice is usually several rows.
Can you generate invoices from Google Sheets in bulk? Yes. Point a merge tool at the sheet and it writes one PDF per record. Whether it works for you comes down to one question. Does your invoice have more than one line on it?
Which of these are you?
Three different jobs land on this page. Two of them have better answers elsewhere.
You need accounting, not documents. If the missing piece is knowing who has paid, use real invoicing software. Wave (opens in a new tab) is free for unlimited invoices and charges $19 a month for the Pro tier. Zoho Invoice (opens in a new tab) is free up to 500 invoices a year, with a "Powered by Zoho Invoice" line on the document. QuickBooks (opens in a new tab) has a free tier capped at 2 invoices a month, and Simple Start lists at $38. Xero (opens in a new tab) starts at $25 for the Early plan, which allows 20 invoices and quotes a month. Those were the list prices the last time I looked, and Xero's page carries a price-rise notice, so check it before you budget.
All four keep a record of which invoices are settled and which are not, which is the one thing a folder of PDFs cannot do for you. Nothing in the rest of this post tracks a payment. If that is the missing piece, one of those four is your answer.
You are pulling numbers out of invoices somebody sent you. That is data extraction, and it is the opposite direction from everything below. Search for invoice OCR instead.
You already have the billing data and you want the PDFs. Stay. You bill on your own template, the numbers live in a sheet, and the output you need is a folder of files with a client name on each. That is the rest of this post.
The part most tools get wrong: line items
The sheet in front of that third group usually looks like this.
| Invoice | Client | Description | Qty | Rate | Amount | |
|---|---|---|---|---|---|---|
| 1041 | Birch Dental | ap@birchdental.com | Retainer, August | 1 | 2400 | 2400 |
| 1041 | Birch Dental | ap@birchdental.com | Extra landing page | 2 | 650 | 1300 |
| 1041 | Birch Dental | ap@birchdental.com | Stock photography | 1 | 90 | 90 |
| 1042 | Corvid Labs | finance@corvidlabs.io | Retainer, August | 1 | 1800 | 1800 |
| 1042 | Corvid Labs | finance@corvidlabs.io | Analytics setup | 3 | 220 | 660 |
That is an excerpt; the full tab runs to twelve clients and forty-one rows, with invoice numbers repeating down the first column. Amount is =E2*F2 filled down, which matters later. Now run a mail merge over it.
You get forty-one PDFs. Birch Dental gets three separate invoices, each one line long, each numbered 1041, and none of them totalling $3,790. Nothing errored, and from the tool's point of view nothing went wrong.
That is the failure mode, and it is the reason this job feels harder than it looks. A merge tool reads a row as a record. An invoice is a group of rows that share a number. Until the tool knows the difference, you are either pre-aggregating your data by hand or sending one-line invoices.
Two workarounds exist, and both cost something:
- Flatten to one row per invoice. Add columns for the line items, or squash them into one cell with
TEXTJOIN. You keep one PDF per client, and you lose the aligned table with quantities down one edge and money down the other. A pasted blob of text where the line-item table should be looks like what it is. - Pre-aggregate into a summary row. A pivot table gives you a total per client. Fine for a bill that says "August services, $3,790", and useless the moment a client asks what the $90 was.
The rest of this page says, for each route, whether it needs one of those workarounds. If line items are the whole reason you are here, there is a deeper comparison in Google Sheets invoice line items.
Route 1: an invoice template in Sheets or Excel
The starting point for most people, and it does work. Build the invoice once as a tab, then feed it.
- Make a tab called
Templateand lay out the invoice on it: your logo in the top rows, the client block, a line-item table, a total cell. - Put the billing data on a second tab called
Data, one row per line item, exactly like the table above. Put=E2*F2in theAmountcolumn and fill it down. - Pick one cell on the template, say
B4, to hold the invoice number you are printing. Everything else keys off it. - Look the invoice-level fields up from that cell rather than typing them:
=XLOOKUP($B$4, Data!A2:A500, Data!B2:B500)for the client name, and the same formula against column C for the email address. - Fill the line-item table with
=FILTER(Data!D2:G500, Data!A2:A500=$B$4), which spills the description, quantity, rate, and amount for whichever invoice number sits in B4. Excel 365 hasFILTERandXLOOKUPwith the same arguments. Older Excel needs a helper column and an index-match array. - Total the invoice with
=SUM(FILTER(Data!G2:G500, Data!A2:A500=$B$4)). - Type the next invoice number into B4. The whole page repopulates.
- In Sheets: File > Print, then set Print to Current sheet and save as PDF. In Excel the equivalent is File > Print with the
Templatesheet active, or a print area set on it, then Save as PDF.
Type the next number in, print again. Line items work properly here, which is more than several of the automated routes below can say.
Where it breaks:
- Step 7 and step 8 happen once per invoice, by hand, every month. At twelve clients that is a long coffee. At sixty it is your Monday.
- Nothing names the file for you. You will be typing
birch-dental-1041.pdfinto a save dialog sixty times, and the one you mistype is the one that goes to the wrong client. - No email. The PDFs sit in a folder until you attach them yourself.
- One sheet holds one invoice at a time. There is no record of what invoice 1041 looked like when you sent it, only what the formulas produce today. Change a rate in the data tab and last month's invoice quietly changes with it.
Under ten invoices a month this is fine, and I would not talk anyone out of it. The trouble starts when the same person also wants the files emailed.
Route 2: Google Docs plus Autocrat
Autocrat (opens in a new tab) is the add-on most Sheets merges end up using. It comes from New Visions Cloudlab, it has been around for years, and it is free with no paid tier behind it.
The click path, start to finish:
- Build the invoice as a Google Docs document. Where a value goes, type a tag matching your column header exactly:
<<Client>>,<<Invoice>>,<<Description>>. The tags are case sensitive. - In your spreadsheet, Extensions > Autocrat > Open, then New Job.
- Name the job, then Choose template and pick the Doc from Drive.
- On the mapping step, confirm every tag found a column. A tag with no matching header is where a job silently ships blanks.
- On File Settings, set the file name to something unique per invoice, like
invoice-<<Invoice>>-<<Client>>. Set File Type to PDF. - Still on File Settings, the Output as setting decides the shape of the run. Pick Multiple Output, which Autocrat's own user guide (opens in a new tab) defines as "one document per row of data that satisfies your merge".
- Pick a destination folder in Drive.
- On the sharing step, add the email column if you want each client sent their own file. Autocrat only emails a document it also shares.
- Save, then hover the job and hit the play icon.
Now the catch, and it is the one from the section above. Multiple Output means one PDF per row, so a sheet with three rows for Birch Dental produces three invoices. Autocrat has no grouping key.
The other setting looks like it should help and does not. Single Output merges every matched row into one document, but it does that by appending a fresh copy of the whole template per row, so you get your invoice page repeated forty-one times in one file instead of twelve invoices with their own line items. It also cannot email, since sharing belongs to the other mode. Asked on the Autocrat forum how to collapse several rows per person into one document, New Visions' maintainer answered that Autocrat does not do it (opens in a new tab) and pointed at a different tool of theirs, FormMule.
So Autocrat is a one-row-per-invoice tool. Flatten your data first and it is a good one. If flattening the line items by hand is the monthly chore you were hoping to delete, skip to the grouped route at the end of this page.
Where it breaks:
- No line-item grouping, per above.
- Autocrat is Apps Script, so your Google account's ceilings are Autocrat's ceilings. Six minutes per execution. Triggered scripts split 90 minutes a day between them on a consumer account, 6 hours on Workspace (Google's quota table (opens in a new tab)). Sixty invoices is nowhere near that. Six hundred is a conversation.
- Triggers fire hourly at the fastest, and there is no "first of the month" option. Monthly billing means running the job by hand or scripting around it.
- Your invoice has to be rebuilt as a Google Docs document. If the design came from a designer as a PDF, that is a retyping project before you merge anything.
There is a fuller Autocrat walkthrough in the Google Sheets mail merge guide, and the Word equivalent of the same job is in splitting a Word mail merge into separate PDFs.
Route 3: group the rows yourself in code
Every no-code route above treats a row as a document. Code does not have to. The whole trick is one Map, keyed on the invoice number, built before you generate anything:
// Columns: Invoice, Client, Email, Description, Qty, Rate, Amount
const invoices = new Map();
rows.forEach(([number, client, email, description, qty, rate, amount]) => {
if (!invoices.has(number)) invoices.set(number, { client, email, items: [] });
invoices.get(number).items.push([description, qty, rate, amount]);
});Three rows for Birch Dental become one entry with three items. From there you copy a Docs template per entry, replace the invoice-level tags, append a table row per item, and export the copy as PDF.
You cannot paste that and run it; it is the grouping step alone. The rest of the script, plus what breaks in it, is in the line-items walkthrough. The short version: nothing records which invoices already went out, and every invoice you generate spends file-copy and export quota against that six-minute ceiling.
Route 4: tools built for document generation
A category of hosted tools does merge-with-line-items properly, aimed more at developers and operations teams than at the person with the sheet. Prices were current when I last checked.
Documint (opens in a new tab) handles repeating rows with a Handlebars {{#each}} block wrapped around a table row, plus a $calc helper for sums and tax, so a grouped invoice comes out correctly laid out. There is no free plan. Silver is $39 a month billed annually, which buys 2,400 documents a year, after a 14-day trial.
Portant (opens in a new tab) connects Sheets to Google Docs and Slides templates, free for 30 documents a month and $42 a month billed annually for 2,000. It does group rows: its docs call the feature data grouping (opens in a new tab), you pick the column to group by, and each document gets a table of every matching row. Automation is a new-row trigger called auto-create rather than a clock, available on paid plans, so a row added at the bottom of the sheet gets processed and a monthly billing run is still something you start. Portant's marketing leads with HubSpot, and its Google Workspace Marketplace listing describes an older shape of the product than its pricing page does.
Formstack Documents (opens in a new tab), which used to be WebMerge and is still what many older forum threads mean by that name, no longer lists a standalone documents plan publicly; that pricing goes through sales. Document generation sits inside the Suite tier at $250 a month paid annually, including 250 document deliveries a month. Anyone quoting you WebMerge's old entry price is working from a stale page.
The common shape here: you build the template inside the tool, then call it from a webhook or from whatever automation you already run. Portant is the exception on the first half, since it merges tagged Google Docs and Slides files you already have. For the others the template is where it hurts, because your invoice is a PDF somebody laid out once and redrawing it inside a document generator is a project of its own. Ours starts from the invoice you already send instead of asking you to redraw it.
Route 5: SheetRender, when the design exists and the grouping does not
SheetRender is our product, so read this section knowing that.
You upload the invoice you already send. A PDF is ideal; a photo of a printed one works. A model rebuilds it as a template and we map the fields to your columns, so there is no tagging step and no rebuilding the design in somebody else's editor. The data comes from a CSV or XLSX upload, or from a connected Google Sheet.
Grouping is the part that matters for this job. Name the column that identifies one invoice, usually the invoice number, and every row sharing that value renders into a single PDF with its rows as a line-item table. Totals sum a column across the group rather than reading a pre-totalled invoice row, so the sheet needs an amount per line. With that Amount column present, Birch Dental comes out as one file with three lines and $3,790 at the bottom, and a grouped document flows onto as many pages as its line items need.
For the sheet at the top of this page: upload it, name Invoice as the grouping key, and you get twelve PDFs where a merge gave you forty-one. Output is a batch download, or one email per document with the recipient pulled from a column you choose. Under grouping that address comes from the group's first row, which is right when the email column repeats down the group and wrong if you varied it row by row.
Where it breaks:
- It is not accounting software. No payment tracking, no reminders for overdue invoices, no tax filing, no ledger. It writes the PDF and stops. If you need to know who has paid, you need one of the four products at the top of this page.
- It leaves the arithmetic to you. The total is a sum over a column that already exists in the sheet. If yours stops at quantity and rate, add the
=E2*F2column before you upload, or the invoice totals nothing. - The free tier watermarks. 50 documents a month, 2 active templates, 50 emails, and a "Made with SheetRender" line at the foot of every page. Invoice number one has it. Generated files are kept 30 days. A 40-invoice batch fits in the free tier and every page of it carries the footer.
- Scheduled runs need a paid plan. The free tier has none, so monthly billing there means you click generate. Starter is $19 a month for 1,500 documents and one active recurring schedule; Pro is $49 for 10,000 and no schedule cap.
- The rebuilt template needs a look. A dense line-item table is where the reconstruction is least reliable. Open the first invoice before you send forty.
- Your billing data leaves your machine. It goes to our servers, and building the template puts your column headers and a sample of rows in front of a model at Anthropic. Client names and rates are in those columns. If your finance team has a rule about that, this is the conversation. Autocrat never leaves Drive.
The invoices page covers the flow in more detail.
The comparison
| Route | Cost | Several line items per invoice? | Emails each invoice? | Runs unattended? |
|---|---|---|---|---|
| Sheets or Excel template, by hand | $0 if you have either app | Yes, via FILTER on the data tab | No. You attach them yourself. | No |
| Autocrat | $0 | No. One PDF per row, so flatten first. | Yes, to a column of addresses | Hourly triggers at the fastest, so no monthly option |
| Your own script | $0 | Yes, if you group the rows in code | Yes, if you add the send call: 100 recipients/day free, 1,500 on Workspace | Yes, via time triggers |
| Documint | $39/month billed annually for 2,400 documents a year. No free tier. | Yes, {{#each}} over a table row | Via its API | Via its API |
| Portant | Free for 30 documents/month; $42/month billed annually for 2,000 | Yes, data grouping on a column | Yes, an email block sends from your Gmail | Auto-create fires when a row is added, on paid plans; its docs describe no clock schedule |
| SheetRender | Free for 50 watermarked documents/month; $19/month for 1,500; $49 for 10,000 | Yes, by grouping on a key column | Yes, 50/month free, 1,500 on Starter | Paid plans only |
Accounting products are deliberately not in this table. Wave, Zoho Invoice, QuickBooks, and Xero all produce invoice PDFs perfectly well. They answer a different question, which is who owes you money. Getting 60 documents out of a sheet on the last Tuesday of the month is the job this table is about.
Quick answers
How do I create invoices from an Excel spreadsheet in batch? Two routes. Keep it in Excel with an invoice sheet that pulls each client's rows with FILTER, then print each one to PDF by hand. Or upload the .xlsx to a merge tool that reads it directly, which skips the import into Google Sheets that Autocrat requires. The row-becomes-a-file question is covered in CSV to PDF, one file per record.
Is there a free batch invoice generator? For simple invoices, yes. Autocrat costs nothing and will turn a sheet into one PDF per row, and a script you write yourself costs nothing either. Both assume one row is one invoice unless you write the grouping. Free tiers on the hosted tools are small: 30 documents a month on Portant, where free signed PDFs carry its watermark, and 50 watermarked ones on SheetRender.
How do I put multiple line items on one invoice from a spreadsheet? You need a tool that groups rows by a shared value such as the invoice number instead of treating each row as a document. That rules out Autocrat and most Gmail merge add-ons. Group the rows in code, or use a tool with a grouping key. Flattening the line items into one row is the third option and the one you will regret.
Should I just use QuickBooks or Xero? If you need to know who has paid, yes, and the batch tools on this page will not substitute. If you are already tracking payment somewhere and the missing piece is a stack of branded PDFs on your own layout, an accounting subscription is an expensive way to buy a template.
Which one should you pick?
- Ten invoices a month, one line each or several: the Sheets or Excel template. Print each one and move on.
- Sixty invoices a month, one line each, emailed out: Autocrat. Free, and this is the job it was built for.
- Line items and you write code: your own script, with the six-minute execution ceiling in mind.
- Line items, no code, and a template you are willing to build inside the tool: Documint or Portant.
- Line items, no code, and an invoice design you would rather not rebuild: SheetRender. If your sheet looks like the one at the top of this page, it is a column pick and a batch download.
- Payment tracking of any kind: Wave, Zoho Invoice, or an accounting subscription. None of the routes above will cover it.
What separates these tools has very little to do with price. It is whether the tool believes an invoice is a row or a group of rows. You can settle it about any tool here in a minute by asking what happens to a client with three lines. The ones that get it wrong get it wrong silently, which is why people find out at the point where someone has already received three invoices numbered 1041.