TPTruPDF

Pricing

Simple, manual pricing

No billing module. No Stripe. Subscriptions are issued by hand so we stay close to every customer.

01 / PlansFlat annual

T.01Trial

Free· 15 days

Full viewer + basic annotations. Watermarked. Premium engines refuse to construct.

  • Viewer + basic annotation tools
  • "TruPDF Trial — Not for Production" watermark
  • Burned into every save / export
  • Hard cliff at 15 days (non-dismissible overlay)
Start free trial
Recommended

T.02Pro

Contact us· flat annual

Every engine: redaction, sign, convert, compare, collab, OCR, AI. No watermark.

  • All trial features, no watermark
  • Redaction · sign · convert · compare · collab
  • OCR · AI copilot (summarise / extract / parse)
  • Daily reminder for 30 days before exp
  • License covers *.<your-domain> + subdomains
  • GitHub Packages registry access (PAT)
Email sales

T.03Enterprise

Contact us· flat annual

Pro plus offline mode, SSO hooks, audit-log export, and encrypted source maps.

  • All Pro features
  • Offline tokens — no outbound traffic
  • SSO hooks for licensing telemetry
  • Audit-log export pipeline
  • Encrypted source maps for production debugging
Email sales
02 / QuestionsLicensing & renewal

Q.01Is there a free tier beyond the trial?

No. The 15-day trial is the only free path. After expiry, the SDK rejects every call until a paid license is bound.

Q.02Do you offer per-seat or usage-based pricing?

No. Pricing is flat annual per customer so the heartbeat stays liveness + revocation only — never usage-metered.

Q.03How is the license delivered?

Two artefacts: (1) a signed Ed25519 token string the SDK accepts in LicenseManager.init(...), and (2) a read-only GitHub Packages PAT for @trupdf/viewer installation. Both go out by email same-day.

Q.04Can a license cover multiple domains?

One license covers all subdomains of your primary domain (*.acme.com). For multiple unrelated domains, email sales — we re-issue with both globs in the token's domains[] array.

Q.05What happens at renewal?

We email at exp - 30 days. Drop the new token in place of the old one — LicenseManager.init() accepts it with no state migration. The old license stays valid until its own exp, so no cutover window.