Generate invoices in bulk
If you bill multiple clients each month, generating invoices manually is a chore. Here's how to ship 100 invoices in 5 minutes.
The setup (one-time, 10 minutes)
1. Build your invoice template
Use the built-in Invoice (EU) template (free) or Smart invoice (Starter+, auto-hides VAT when 0).
Customize it with your company info, logo, bank details, footer text.
2. Create your billing sheet
One row per invoice. Suggested columns:
Client | ClientAddress | Email | InvoiceNumber | Date | DueDate | Description | Amount | VAT | Total
3. Test with one row
Open the sidebar, pick the template, generate just one PDF. Verify the layout, VAT calc, dates. Adjust the template if anything's off.
The monthly workflow (5 minutes)
- Update the sheet — add this month's rows (or duplicate last month's and modify amounts)
- Open the sidebar — Sheet to PDF detects the new rows automatically
- Click Generate — wait ~10 seconds per invoice
- (Pro) Email automatically — enable "Email each PDF" with the
Emailcolumn. Subject:Invoice {{InvoiceNumber}}. Body: a short note. Each client gets their invoice delivered, no manual sending.
Common variations
Multi-line invoices (different items per client)
Use the Multi-item quote template style (Pro+) with a JSON column for line items. One row can contain multiple items.
Invoice numbering
Use a formula in your sheet to auto-increment: =COUNTA(A$2:A2) + 1000 in the InvoiceNumber column gives you sequential 1001, 1002, 1003…
VAT for some clients, not others
Use the Smart invoice template. Put VAT=0 for clients in non-VAT regions — the line auto-hides.
Multi-currency
Add a Currency column to your sheet (EUR, USD, GBP). Use the currency filter in your template: {{ Amount | currency:Currency }}.
Integrations
Accounting software (Xero, QuickBooks, etc.)
After generation, the sheet has a "PDF link" column with each invoice's Drive URL. You can import these into your accounting software via their CSV import, or use a tool like Zapier to push the URLs.
Auto-reminders for unpaid invoices
Add a PaidDate column. When you run the next batch, use a smart template's {% if PaidDate == "" %} block to add a "URGENT - PAY NOW" badge on unpaid ones.