Français How it works Features Mail merge On-premises Pricing Validator Sign in Get early access
Mail merge · Variable data PDF · PDF/UA-1

Mail merge to PDF.
Accessible by default.

Design your letter, statement, or invoice once. Merge each record into its own tagged, PDF/UA-1 compliant document — through the REST API, a batch call, or straight from a Google Sheet. No Word. No Acrobat. No remediation pass.

Early access · or see how a merge works

The classic mail merge
wasn't built for accessibility.

Word template, merge, export to PDF: the default workflow for twenty years. The letters look right. Whether a screen reader can use them is another matter — and checking every one isn't realistic.

The desktop way — Word mail merge

Merge, split, export, fix

Word merges every record into one long document; one PDF per recipient takes macros or add-ins. Exported tags depend on how the template was authored, so merged output often needs fixing in Acrobat before it meets PDF/UA. And it runs on a desktop — Microsoft doesn't support unattended, server-side Office automation.

merge → split → export → fix tags → re-check
(per batch, per template change)
The PDFUA.io way — generation

One record in, one accessible PDF out

The template defines the structure once — headings, tables, lists, reading order, language, alt text. Every merged document is generated with that structure already in place, on a server, from your data. The 50,000th letter is as accessible as the first.

/Document · Lang fr-CA
  ├ /H1 "Avis de renouvellement"
  ├ /P "Madame Tremblay, …"
  └ /Table — TH scope, one row per line item

Your template is
the merge definition.

No field codes, no bookmarks, no hidden formatting. If you can make an HTTP request — or open a spreadsheet — you can run the merge.

01

Design once

Build the document in the visual designer and bind fields with {{customer.name}}-style bindings. Repeating sections expand for line items; visibility rules show or hide paragraphs per recipient.

02

Merge one record

POST the template ID and one record — JSON or XML — and the response body is the PDF. Strict mode rejects a record with missing fields instead of printing a blank; a dry run checks the data without rendering.

03

Merge a whole list

Send up to 500 records per batch call, one document each, with file names built from your data. Documents render in the background; poll the jobs and download. Or skip code entirely with the Google Sheets menu.

api.pdfua.io
# One record → one PDF (the response body is the file)
curl https://api.pdfua.io/api/v1/documents/generate \
  -H "X-API-Key: $PDFUA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "486bc24d-…",
    "data": {
      "customer": { "name": "Marie Tremblay" },
      "policy":   { "number": "AC-2026-00443",
                    "renewal_date": "2026-11-01" }
    }
  }' -o renewal.pdf

# A list → one PDF per record (asynchronous)
curl https://api.pdfua.io/api/v1/documents/generate-batch \
  -H "X-API-Key: $PDFUA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "486bc24d-…",
    "data": [ { … }, { … }, { … } ],
    "filename_template": "{{policy.number}}_{{index}}"
  }'
# ← 201 { "documents": [ { "document_id", "job_id", … } ] }

Merge from where
your records already live.

No proprietary connectors to buy. The API takes plain JSON or XML; everything else is a thin layer on top of it.

REST API — JSON or XML

Any system that can make an HTTP request: your CRM, core system, data warehouse job, or a script. Systems that only speak XML post it as-is, under documented conversion rules.

JSON · XML · X-API-Key

Google Sheets

A PDFUA menu in your spreadsheet generates one accessible PDF per row and saves them to Google Drive, optionally as one zip. The closest thing to a classic mail merge — without Word.

One PDF per row · Drive

Design with real samples

Build the template's data model from a JSON, CSV, or XML sample so every binding is checked while you design — then send the real records at run time.

JSON · CSV · XML samples

E-commerce: working examples show Shopify and WooCommerce orders turned into accessible invoices through the same API.

If it was a mail merge,
it can be born accessible.

Letters & notices

Benefit decisions, renewal notices, compliance letters, welcome packages — each addressed, dated, and tagged, in English or French.

Government · Insurance · Healthcare

Statements

Account, benefit, and loyalty statements with tables that grow with each recipient's rows and split cleanly across pages.

Banking · Insurance · Utilities

Invoices & receipts

One per order or per customer, with line-item tables and totals — from your order system or a nightly export.

Retail · Utilities · Services

Certificates

Completion certificates and credentials that every recipient can read — including screen reader users.

Education · Training · HR

Pre-filled forms

AcroForm fields — text, checkboxes, dropdowns, radio groups, signatures — pre-filled from the record, with labels and tab order tagged like the rest of the document.

Government · Healthcare · Finance

Archival copies

Turn on PDF/A-2a and the same merge produces documents that are both accessible and fit for long-term records retention.

PDF/A-2a · Records retention

Word mail merge vs.
PDFUA.io

Producing personalized PDFs
Word mail merge → PDF PDFUA.io
One PDF per recipient Needs macros or add-ins Built in — one document per record
PDF/UA-1 tagging Depends on authoring; often fixed by hand in Acrobat Generated with every document
Runs unattended on a server Not supported by Microsoft REST API, batch, async jobs
Missing data Prints a blank Strict mode rejects the record
Data sources Excel, Access, Outlook contacts JSON, XML, Google Sheets
Archival (PDF/A) Separate export option PDF/A-2a opt-in, same call

Mail merge questions,
answered.

Can I reuse my existing Word templates?

Not directly. The designer uses its own template format — that is what lets every element map to a known PDF structure. Recreating a typical letter or invoice in the designer is usually quick, and templates are plain JSON you can export and keep in source control.

What format does my data need to be in?

A JSON object per document — nested objects and arrays of line items are fine — or the equivalent XML document. Bindings like {{customer.name}} point into it. You don't reshape your data for us.

What happens when a record is missing a field?

By default generation is strict: a record with unresolved bindings is rejected with the list of missing fields, instead of producing a letter with a blank where the name should be. Mark a field optional with a default when a blank is fine, or use a dry run to check a whole file of records before sending anything.

How many documents can I generate at once?

A batch call takes up to 500 records and returns one job per document; send several batches for larger runs. Plans are sized by pages generated per month, from 1,500 to 1,000,000 — see pricing.

We send documents in English and French. Is that supported?

Yes. The document language is set on the template and can be overridden on any span, so screen readers switch pronunciation correctly — a bilingual notice is one template. The designer itself is available in English and French.

Is my recipients' data stored?

The data you send is used for that document only. Single documents are generated in memory and returned in the response. Batch and async jobs encrypt their input (AES-256-GCM) and delete it once the PDF is generated, and the generated PDFs expire after a short, configurable time — 30 minutes by default. For data that must never leave your network, run it on your own servers.

Retire the mail merge.
Keep the letters.

Join the early access list. We're onboarding a small number of organizations before general availability — priority goes to teams with active compliance deadlines.

No spam. No sales calls unless you ask for one.

You're on the list. Three quick questions help us prioritise your access:

1 of 3

What's your industry?

2 of 3

How many pages do you generate per month?

3 of 3

What's your compliance timeline?

✓

You're on the list.

We'll be in touch shortly.