Use Case

Contract PDFs from onboarding flows

Auto-fill vendor agreements, NDAs, MSAs, W-9s, and contractor contracts from the data you already collect in your onboarding form. Skip the "download blank PDF, fill it, scan it, send it back" step entirely.

Who this fits

The pattern, end-to-end

The shape is a webhook handler that listens to the onboarding form's "submitted" event, fills the relevant contract template, stashes the result, and emails the contractor or vendor a signing link:

  1. Onboarding form → your webhook handler (Tally, Typeform, Formspark, Clerk, your own HTML form posting to a route). Verify signature.
  2. Handler → object storage: fetch the contract template (NDA / MSA / W-9 / etc., chosen based on the onboarding answers).
  3. Handler → PDFops: POST /api/fill-form with the template + the onboarding answers as field values.
  4. Handler → object storage: stash the filled contract with a non-guessable key (it contains PII — see auth-boundary note in the blog walkthrough).
  5. Optional: Handler → e-signature provider: upload the filled PDF to DocuSign / Dropbox Sign / HelloSign and trigger the signing flow. Or email a download link if the contractor signs offline.

Concrete walkthrough with code: Auto-filling a W-9 from a contractor-onboarding webhook on Vercel Edge — ~60 lines of TypeScript, includes the auth-boundary footgun (TIN in URL) and how to harden it.

Try it

Use the sample template (it has customer_name + total but the call shape is identical for any AcroForm template):

curl -X POST https://pdfops.dev/api/fill-form \
  -F "pdf=@nda-template.pdf" \
  -F 'fields={"party_name":"Acme Co","effective_date":"2026-05-19","term_years":"2","jurisdiction":"Delaware"}' \
  -o filled-nda.pdf

Author your NDA / MSA / W-9 template in any PDF editor (Acrobat, Mac Preview, LibreOffice Draw, pdftk). Rename the AcroForm fields to short predictable names (party_name, effective_date, tin, scope_of_work) so your calling code is stable across template revisions. Full reference at the fill-form docs.

Variations

FAQ

Why generate contract PDFs from form data?

Data quality (form-validated input beats hand-typed PDF entries) and friction (asking someone to fill the same data twice is the most common onboarding-abandon point). The underlying contract is templated; the variables come from data you already have.

Does PDFops handle e-signature?

No — that's a separate problem. DocuSign / Dropbox Sign / HelloSign do it well. PDFops sits upstream: fill the contract, hand the filled PDF to your e-sign provider. The integration is typically "PDFops returns bytes → your code uploads to e-sign envelope API."

Which contract types fit?

Anything with fixed legal language + a small set of variable fields. NDAs, MSAs, vendor onboarding packets, independent-contractor agreements, service agreements, W-9 / W-8BEN. Legal owns the fixed copy; ops populates the blanks per-contract.

How do I keep templates current when legal updates them?

Templates are regular PDFs with AcroForm fields. Legal edits the text in their PDF editor; the field names stay the same so calling code doesn't change. Version the template files; tag each generated PDF with a footer like "NDA v2.3.1 / generated 2026-05-19" to anchor to a specific template revision.

What about computed line items (SOW milestones)?

Fixed-line-count templates (≤8 milestones) work for most cases. For more, combine fixed sections with /api/merge — generate the milestones page separately and merge into the master contract.

Get higher-tier access

Anonymous tier (100/IP/month) is fine for evaluation. For production volume across a vendor / contractor portfolio, join the waitlist — keys with 1,000-10,000/month quotas are coming, free during beta with locked-in pricing post-beta. The form's message field is where you describe your onboarding flow + monthly volume.