Documents · 3 min read
By Murtaza Aziz
How to Send Monthly Customer Statements as PDFs in One Batch
A statement lists open invoices for one customer over a period. Build one template, export a spreadsheet of balances, generate up to 100 PDFs per CSV batch on Starter.
A customer statement is not an invoice. It is a list of invoices (and credits and payments) that are still open, or a period summary, for one account. Sending it should not mean opening 60 Word files on the last Friday of the month.
The pattern is one statement template plus one row per customer in a spreadsheet. Docuplate's CSV batch (Starter and above, 100 rows per run) turns that into a zip of PDFs. The customer statement template page is the layout side of this.
What the statement PDF should show
Your name. Customer name and account code. Statement date and period ("1 to 31 August 2026"). A table of document numbers, dates, amounts, and running or closing balance. An amount due. A payment reference so they can pay the balance without guessing which invoice it covers.
Do not hide the underlying invoice numbers. The statement is an index. The invoices remain the tax documents. Credits appear as negative lines, not as deleted invoices.
Build the spreadsheet from your ledger, not by typing
Export open items from Xero, QuickBooks, or whatever holds the debtors list. You want at least customer_name, account_code, opening_balance, amount_due, period_end. Line-level detail (each invoice on the statement) needs either a nested items JSON per row (hard in a flat CSV) or a template that shows totals only.
A practical compromise: the PDF shows customer, period, amount due, and a notes field "See attached invoice list" for accounts that want the full run. Or map a small items array if your export can dump invoice_number_1, amount_1, … into columns and the batch mapper folds them into rows.
Run the batch
Open the statement template. Upload the CSV. Map columns to paths. Preflight will catch blank customer names and missing amounts before you email anyone. Download the zip. 100 rows per batch; 180 customers is two uploads. Batch PDF generation is the same UI used for invoices and certificates.
Email is on you: attach each PDF, or drop the zip on whoever sends debtor mail. Docuplate produces the files. It does not log into your mailbox.
Send statements on a fixed day (the first business day of the month is common) so customers stop asking "is this current?". Put the period end date in the filename and in the header block. If a customer paid overnight, regenerate that one PDF from the builder rather than rerunning all 180 rows.
When batch is the wrong tool
If statements generate every night from a billing service, POST each account to the generate API on Pro and skip CSV. If you have 12 customers, download 12 PDFs by hand from Example data; a spreadsheet is overhead.
Free includes the Client Account Statement starter but not CSV batch. Starter is $19/mo. Pricing lists the PDF caps (500/month on Starter, 2,000 on Pro) so a 180-statement run fits as long as you are not also generating thousands of invoices the same month.
Aging (30 / 60 / 90 days) belongs on the statement if you chase debt that way. Add those as extra fields on the payload (current, days30, days60, days90) and show them in an info grid under the table. Do not invent aging inside the PDF template; it will drift from the ledger. The spreadsheet or the API payload is the source. The PDF only prints it.