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

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:

  1. Cron trigger → worker (Cloudflare Cron, Vercel Cron, GitHub Actions schedule).
  2. Worker → your DB: list customers due for a report this period.
  3. Worker → object storage: fetch the report template (statement / KPI summary / etc.).
  4. Worker → PDFops: /api/fill-form per customer with that customer's data as field values.
  5. Worker → PDFops (optional): /api/merge to combine the statement with appendices or supplemental pages.
  6. Worker → object storage: stash each per-customer PDF, keyed by customer ID + period.
  7. 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:

  1. Event source → your webhook handler (inspection-completed, exam-graded, course-finished).
  2. Handler → object storage: fetch the relevant report template.
  3. Handler → PDFops: /api/fill-form with the event payload as field values.
  4. Handler → object storage: stash the report keyed by event ID.
  5. 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

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.