DocGen is a Dataverse-driven PDF engine. One custom API — sss_GenerateDocument — callable from your model-driven app, Power Automate, Code Apps, and Power Pages. Templates are Handlebars + FetchXML seeded into Dataverse, so a layout edit ships without a compiled-code release. It runs scale-to-zero in your Azure subscription, on your tenant.
Your app calls a single unbound custom API with a template code and a record id. A thin plugin proxies it (Entra client-credentials) to the rendering container, which runs the pipeline and returns the finished PDF. Nothing is stored unless you ask for it — pass Attach to have the document written back to the record as a note.
// MDA / Power Automate / Code App → sss_GenerateDocument { "Code": "account-statement-openchecks", "EntityId": "a1f8c2e6-4b90-4d1e-9a77-3f0e5c8b2d14", "Attach": true // optional, default false — store a note on the record } // engine pipeline (in your Azure subscription) ▸ TemplateStore read sss_documenttemplate by sss_code ▸ DatasetRunner 4 FetchXML datasets in parallel // @entityId@ bound ▸ TreeBuilder nest child rows via sss_parentkeyfield ▸ Enricher totals, amountDue, aging buckets, credit-balance flag ▸ Handlebars template.html + data tree → HTML ▸ PdfRenderer HTML → PDF // Playwright Chromium ▸ DeliveryService annotation on the record // only when Attach=true // return { "fileName": "Statement_ACME-Corp_2026-07.pdf", "annotationId": "7c3d…e21a", "fileBase64": "JVBERi0xLjc…", // full PDF, ready to attach or download "warnings": null // non-fatal problems, e.g. a truncated dataset }
Pixel-faithful is a claim until you see a page. Both pages below are rendered by the engine's own template pipeline from the migrated production statement template — the normal and credit-balance variants — using synthetic sample data, with the firm's branding and remittance details anonymised.
A template is data, not code: manifest.json, FetchXML datasets, and a Handlebars template.html, seeded into Dataverse by idempotent alternate-key upsert.
Child sss_templatedataset queries run in parallel — 5,000-row pages, 50k hard cap — then nest into a JSON tree by parent key field.
Totals, amount due, credit-balance detection, aging buckets, and bill-address resolution — all the business logic, kept out of the templates.
Handlebars → HTML → pixel-faithful PDF via Playwright Chromium, with fonts baked into the container image.
Nothing is stored by default. Pass Attach and the run writes an annotation (note attachment) to the target record; the optional draft email is a per-environment flag — so you don't pay Dataverse file storage twice, or at all.
One unbound custom API — sss_GenerateDocument — from the model-driven app, Power Automate, Code Apps, and Power Pages.
Output=html returns the rendered layout without starting a browser; Output=data returns the enriched data tree as JSON, so template authors can see every field before writing a line of markup.
The dangerous failure is a document that renders successfully but wrongly. A truncated dataset or an unresolved parent key comes back in a warnings field instead of passing silently — branch on it rather than trusting HTTP 200.
No black-box SaaS holding your documents. DocGen deploys into your own cloud and talks only to your own data.
Scale-to-zero Azure Container Apps (1 vCPU / 2 GiB). All-in run cost typically well under €1,000/yr at current Azure pricing — you pay Azure directly, and the actual cost depends on your region, tier and volume.
One app registration, client-credentials token. The container uses the same service principal as its Dataverse application user.
The container app reads its Entra client secret from Key Vault through its own managed identity — never checked in, never in logs. The Dataverse plugin needs its own copy, and the platform request it uses can't resolve Key Vault-backed variables, so that one is a Text environment variable you restrict to admins. We'd rather say so here than have your security reviewer find it.
No queues, no blob storage, no caching until real volume proves the need. Fewer moving parts to break.
Engine and integration coverage: happy path plus normal and credit-balance variants, verified against real sample data.
Monitoring, patching, Chromium and Dataverse-API compatibility maintenance. Dev and test environments are included at no charge — you should never be billed for good ALM.
A recorded template change on the real production statement template: edit the Handlebars source, re-render, and see the change land in the document. In production the same edit ships by seed — an idempotent alternate-key upsert — with no compiled-code release.
The typical firm changes its documents about six times a year — a rebrand, a new remittance block, a regulatory line, a field the partners want moved. Under compiled templating, every one of those is a project.
Priced per production environment, per year — not per user, not per document, and not by template count. Marginal cost per document is effectively zero because the infrastructure is yours, so metering volume would only be a tax on using the thing you bought. Dev and test environments are free.
| Line | Per year |
|---|---|
| SSS DocGen | €8,500 |
| SSS DMS | €8,500 |
| Both, same environment | €14,500 |
| Line | Price |
|---|---|
| Template change — layout, wording, field swap | €850 |
| Block of 5 changes | €3,800 |
| Template change — new dataset or enrichment rule | €1,500 |
| Line | Price |
|---|---|
| Deployment and onboarding, first environment | €6,500 |
| Each additional environment | €2,500 |
| New template — simple | €2,000 |
| New template — standard | €3,000 |
| New template — complex | €4,500 |
Taking PSA Hub too? Then Year 1 of DocGen is included and the €6,500 deployment fee is waived outright — the environment, Entra registration and Key Vault work happens once, during the PSA Hub implementation, so we don't charge for it twice. From Year 2 it bills at €5,500 alongside your subscription. See the worked example →
Why the number is on the page. Everything else in this category makes you book a call to find out the price. We don't think a price is a negotiating position that has to be protected until a salesperson has qualified you. It's €8,500 per production environment per year — the same number for a five-person team and a five-thousand-person one, because you aren't buying seats.
Per-seat document tools license every user with write access to a Dataverse table. Above roughly 200 users, that costs more than DocGen — and it keeps growing as the firm does.
Licensing never blocks a document. Documents are business-critical, so enforcement is deliberately soft: past renewal, whatever the state — the PDF still generates, and the discrepancy is flagged to us, not to your users. A licensing dispute should never stop a firm invoicing.
You do. A template is configuration — Handlebars markup and FetchXML rows — living in your Dataverse, readable and exportable at any time. If we part ways, your templates stay where they've always been.
Any Dataverse environment where real business documents are generated — typically one per legal entity. Dev and test environments are free, however many you run: we don't tax good ALM.
A change edits a template you already have: layout, wording, or a field swap is €850; a new dataset or enrichment rule behind it is €1,500. A new template is a document class you don't have yet — €2,000–€4,500 by complexity, quoted before you approve.
No. One production environment is €8,500 a year whether it runs three templates or fifty, and there's no count to report at renewal. If your library is very large we'll still say so — a library that size tends to hide near-duplicates, and rationalising it makes the thing easier to own — but it's advice, not an invoice.
They're rendered in your Azure subscription and returned to the caller — nothing is stored by default, and nothing leaves your tenant. Pass Attach and the PDF is written to the record as a note, in your Dataverse, under your retention rules.
Because your documents cost us nothing. The engine runs scale-to-zero on your own infrastructure, so a per-document meter would just be a tax on using the thing you bought. The only meter that tracks real cost is the environment — so that's what you pay for, once a year, at a number you can read on this page.
The fastest route to a useful answer: tell us what you generate today, what it's built on, and how often it changes. We'll come back with whether DocGen fits, what it would cost you, and what it wouldn't solve — before anyone books a call.
Which documents, which system generates them now, roughly how often they change, and how many production environments you run. That's enough for us to answer properly.
See DocGen run against your own Dataverse data — a real statement, generated from a template you can read and edit. Book a 30-minute walkthrough and we'll map your existing documents to the engine.