Finance.
Statements without a second copy.

Billing systems produce documents containing account numbers, balances and transaction histories. Most PDF services write those documents to object storage so you can fetch them by URL later. That storage is a liability you did not ask for.

The documents

  • InvoicesLine items, tax, totals and payment terms, generated per account on a billing run.
  • Account statementsOpening and closing balances with a transaction table, usually monthly.
  • Remittance adviceWhat was paid, against which invoices, sent with the payment.
  • Payment receiptsConfirmation issued the moment a charge settles.
  • Financial reportsPeriod summaries, often with charts drawn by JavaScript.

What a stored PDF costs you

Every rendered document kept by a vendor is a copy of your customers' financial data outside your control. It appears in your vendor risk assessment, your data processing agreement, your incident response plan and your breach notification analysis. Removing storage from the architecture removes it from all four, because there is nothing to disclose about a copy that was never made.

GDPR and the rest

Under GDPR, a processor that retains personal data has to justify the retention period, support deletion requests and disclose sub-processors holding it. Rendering in memory and returning the file in the same response means there is no retention period to define and no stored record to delete. We hold account details and credit balances, which is what the service needs to bill you, and nothing from inside your documents.

What a request looks like

statement.json
{
  "template": {
    "type": "invoice",
    "data": {
      "company": { "name": "Northgate Bookkeeping", "email": "[email protected]" },
      "client": { "name": "Parker Family Dental" },
      "invoice": { "number": "INV-1042", "date": "2026-10-01", "dueDate": "2026-10-22" },
      "items": [
        { "description": "Monthly bookkeeping", "quantity": 1, "rate": 850, "amount": 850 },
        { "description": "Payroll run", "quantity": 1, "rate": 270, "amount": 270 }
      ],
      "subtotal": 1120, "tax": 224, "total": 1344
    },
    "theme": { "primaryColor": "#1c1c1c" }
  },
  "responseFormat": "binary"
}

Finance: common questions

Can I use this for documents containing account numbers?

Yes, and that is the case it was designed for. The document exists in memory for the length of the request and is released when the response is sent. It is never written to disk or placed in storage.

Do you keep a copy for support or debugging?

No. Logs record that a request happened, the credit it consumed and how long it took. They do not record the markup or the output.

How do I archive the documents then?

You store them, where you already store your customers' data and where your retention policy already applies. Most billing systems are writing the PDF to their own bucket anyway, which makes a vendor's copy pure duplication.

Can it handle a monthly billing run?

Yes. Each document is an independent request, so a run is a loop or a queue. Credits are deducted per document and never expire, so a quiet month costs nothing.

Will numbers format correctly?

You control the markup, so formatting is whatever your templates produce. The renderer is Chrome, which means Intl.NumberFormat in a script works if you prefer to format at render time.

Other teams using it