Use Case
Report PDFs at scale
Monthly statements, inspection reports, audit reports, exam reports — anywhere a fixed-layout document gets populated with per-customer or per-event data on a schedule or webhook. Edge-deployed PDF API, sub-300ms per document, no headless Chrome or long-running backend.
Who this fits
- Financial / billing platforms. Monthly customer statements bundling transactions, balances, and tax breakdowns. Cron-driven on the 1st of each month.
- Inspection and field-services apps. Per-job inspection reports (HVAC, real estate, building safety, vehicle pre-purchase). Webhook-driven on inspection completion.
- Education / assessment platforms. Exam reports, course completion certificates, transcripts. Webhook-driven on event.
- Audit and compliance. Internal audit summaries, regulatory filings, attestation reports. Cron-driven on the audit cycle.
- Analytics / KPI tooling. Per-customer KPI summary PDFs delivered weekly or monthly. Cron-driven.
The patterns, end-to-end
Pattern 1: cron-driven monthly bulk
For per-customer monthly statements / KPI summaries — one report per customer, fires on a schedule:
- Cron trigger → worker (Cloudflare Cron, Vercel Cron, GitHub Actions schedule).
- Worker → your DB: list customers due for a report this period.
- Worker → object storage: fetch the report template (statement / KPI summary / etc.).
- Worker → PDFops:
/api/fill-formper customer with that customer's data as field values. - Worker → PDFops (optional):
/api/mergeto combine the statement with appendices or supplemental pages. - Worker → object storage: stash each per-customer PDF, keyed by customer ID + period.
- Worker → email service: send one short-presigned-URL email per customer.
Concrete walkthrough with code: Monthly PDF bundles on a Cloudflare Cron Trigger — ~60 lines of TypeScript, includes the fill + merge + R2-stash + email flow.
Pattern 2: webhook-driven per-event
For inspection / exam / per-job reports — one report per event, fires when the event completes:
- Event source → your webhook handler (inspection-completed, exam-graded, course-finished).
- Handler → object storage: fetch the relevant report template.
- Handler → PDFops:
/api/fill-formwith the event payload as field values. - Handler → object storage: stash the report keyed by event ID.
- Handler → email service: deliver to the customer or recipient.
Try it
Author your report template in any PDF editor with AcroForm fields (customer_name, period_label, total_amount, line_item_1_desc, line_item_1_amount, etc.):
curl -X POST https://pdfops.dev/api/fill-form \
-F "pdf=@statement-template.pdf" \
-F 'fields={
"customer_name": "Acme Co",
"period_label": "April 2026",
"total_amount": "$2,450.00",
"invoice_id": "STMT-2026-04-001"
}' \
-o statement.pdf
Full reference at the fill-form docs; the merge endpoint for multi-page composition is at /docs/merge.
Variations
- Monthly statements. One template per currency / region; pre-render charts as PNG embedded in the template at fixed positions; ≤20 line items per page; multi-month statements via
/api/merge. - Inspection reports. Per-job report with a checklist section (AcroForm checkboxes) + free-text notes (text fields) + before/after photo embeds (fixed image positions). Most field-service apps already capture this data structured.
- Exam reports / certificates. Per-test report with scores per section + overall result + signature line. Typically merged with a generic "About this exam" appendix.
- Audit reports. Quarterly or annual; multi-page composition with cover + findings + recommendations + appendix. Per-finding pages are generated via
/api/fill-formagainst a finding-template, then merged into the master via/api/merge. - KPI summaries. Per-customer weekly or monthly digest with key metrics. Often 1-2 pages, fixed-layout, chart-as-image. Cron-driven.
FAQ
Why PDF reports instead of HTML dashboards?
Three reasons: customers archive / forward / reference reports (PDFs survive inbox cleanup and link rot); compliance and audit trails require immutable documents; recipients often need to print or annotate. Dashboards work for in-product; PDFs are the durable artifact.
How does this work for variable-length reports?
Fixed-layout templates with a known maximum (leave extra rows blank), or multi-page composition via /api/merge — fill a cover + fixed middle + variable section assembled from N per-customer page templates, then merge. The monthly-bundles walkthrough shows this pattern.
Can I run this on a schedule?
Yes — Cloudflare Cron Trigger / Vercel Cron / GitHub Actions schedule. Sub-300ms per customer means a 10,000-customer monthly job completes in under an hour even sequentially.
What about charts and graphs?
PDFops doesn't render charts. Pre-render charts as PNG/SVG in your calling code (Chart.js + a render service) and embed at fixed positions in the template. For dashboards-as-PDF where charts ARE the report, a headless-Chromium service still fits better — see PDFops vs PDFShift for the honest framing.
How do I deliver large batches without overloading email?
Stash PDFs in object storage first, send a short-lived presigned URL per customer — not the PDF as an attachment. Avoids 50MB statements bouncing off corporate spam filters. Set a retention policy on the bucket for compliance archives.
Get higher-tier access
For monthly batches above 100 customers, join the waitlist — keys with 1,000-10,000/month quotas are coming, free during beta with locked-in pricing. The form's message field is where you describe your customer count + reporting cadence.
← PDFops home · Docs · Blog