Simple Smooth Safe
DOCUMENT GENERATION · MICROSOFT DATAVERSE / POWER PLATFORM

A template change shouldn't cost $5,000 and a dev queue.
Generate Dataverse documents from config, not compiled code.

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.

// Replaces compiled Aspose/LINQ templating inside vertical Dynamics 365 solutions. Near-zero marginal cost per document.

In production today

Multi-office firmFirm size
12 templatesTemplates migrated
Weeks → DaysChange turnaround, before → after
// Anonymised customer result. Named reference available under NDA.

The legacy template-change ritual

▚ TODAY — Aspose Words + LINQ, compiled into the app
  • Client wants a line moved on an invoice
  • A platform consultant edits compiled C# templating code
  • 15–40 hours of build, test, and deploy per change
  • ~$5,500 average per change, billed T&M
  • Wait in the vendor's dev queue for a release
  • Aspose.Words OEM license + annual support on top
▶ WITH DocGen
  • Client wants a line moved on an invoice
  • Edit template.html (Handlebars) or a FetchXML dataset
  • Preview locally: npm run preview <code>
  • Seed by alternate-key upsert — no code release
  • Live in every channel that calls the API
  • One change per quarter included; beyond that, a fixed price you can approve without a scoping call

One call, seven stages

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.

sss_GenerateDocument · account-statement-openchecks
// 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
}
// Illustrative shape. Business logic lives in the Enricher — templates stay logic-light and safe to hand to non-developers. Why compiled templates cost what they do →

What comes out the other end

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.

Anonymised account statement generated by DocGen: firm letterhead, client address block, an invoice detail table, an unapplied-payments table, an aging summary, and a payment and remittance panel.
Account statement · open checks
The same statement template in its credit-balance variant, showing a negative net amount due and the credit-balance wording in place of the payment request.
Account statement · credit balance

What's in the engine

Config-driven templates

A template is data, not code: manifest.json, FetchXML datasets, and a Handlebars template.html, seeded into Dataverse by idempotent alternate-key upsert.

Parallel datasets

Child sss_templatedataset queries run in parallel — 5,000-row pages, 50k hard cap — then nest into a JSON tree by parent key field.

The Enricher

Totals, amount due, credit-balance detection, aging buckets, and bill-address resolution — all the business logic, kept out of the templates.

Chromium PDF rendering

Handlebars → HTML → pixel-faithful PDF via Playwright Chromium, with fonts baked into the container image.

Delivery, opt-in

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.

Callable everywhere

One unbound custom API — sss_GenerateDocument — from the model-driven app, Power Automate, Code Apps, and Power Pages.

HTML & data modes

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.

Correctness warnings

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.

Runs in your tenant, by design

No black-box SaaS holding your documents. DocGen deploys into your own cloud and talks only to your own data.

Your Azure subscription

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.

Your Dataverse & Entra ID

One app registration, client-credentials token. The container uses the same service principal as its Dataverse application user.

Secrets, and where they actually live

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.

Deliberately simple

No queues, no blob storage, no caching until real volume proves the need. Fewer moving parts to break.

100+ tests

Engine and integration coverage: happy path plus normal and credit-balance variants, verified against real sample data.

Managed & versioned

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.

Forty seconds, template edit to finished document

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.

What six changes a year costs

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.

Compiled templating, today
$33,000per year
  • 6 changes × ~$5,500 each
  • Billed time & materials, per change
  • Each one waits in a dev queue
  • Cost grows with every change you ask for
With DocGen
$10,200per year
  • €8,500 platform — one production environment, every template in it
  • 4 changes included, one per quarter
  • 2 chargeable changes × €850
  • Fixed price, quoted before you approve
You keep
$22,800per year, every year
  • 69% less for the same six changes
  • No dev queue between you and a corrected invoice
  • Savings compound — the more you change, the wider the gap
// Central case. Change frequency drives the delta: at 2 changes/yr DocGen still wins; at 12 it wins by roughly triple. The ~$5,500 per change is a modelled input taken from one client's own historical change costs, not an industry benchmark — the case study shows the working.

Pricing

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.

Platform

per production environment · per year
LinePer year
SSS DocGen€8,500
SSS DMS€8,500
Both, same environment€14,500
Included
  • Dev and test environments at no charge
  • Every template in the environment — no bands, no count to report
  • Monitoring and patching
  • Chromium and Dataverse API compatibility maintenance
  • Business-hours support, next-business-day response
  • One template change per quarter
// Each additional production environment is the same rate. Example: two production environments running DocGen → €17,000/year, whatever the template count. Per-environment vs per-seat, and where the crossover sits →

Changes

fixed price · no retainer
LinePrice
Template change — layout, wording, field swap€850
Block of 5 changes€3,800
Template change — new dataset or enrichment rule€1,500

One-time

fixed price · per item
LinePrice
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
// All prices are in euros and exclusive of VAT. EU business customers with a valid VIES-registered VAT number are reverse-charged; see Terms of Service §5.1 for the full treatment. Annual, billed yearly.

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.

// Azure infrastructure is billed directly to your own subscription by Microsoft (typically well under €1,000/yr, depending on region, tier and volume) and is not part of these figures.

Questions buyers actually ask

Who owns the templates?

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.

What counts as a production environment?

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.

What's a change versus a new template?

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.

Does the number of templates change the price?

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.

Where do the generated PDFs live?

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.

Why isn't pricing per document?

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.

Tell us about your documents

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.

Send us the shape of the problem.

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.

How we handle what you send
  • Controller. Simple Smooth Safe, Unipessoal Lda., Rua Retiro dos Pacatos 50, Ed. Startup, Sala 9, 2635-224 Rio de Mouro, Portugal. NIF/VAT PT518264742. Questions or requests: info@simplesmoothsafe.com.
  • Purpose. To answer your enquiry and follow up about SSS DocGen. That is the only thing we use it for. We do not sell it, share it, or add you to a marketing list.
  • Legal basis. Your consent, given by ticking the box on the form. Nothing is pre-ticked, and submitting without consenting isn't possible.
  • Your rights. Withdraw consent, or ask us to delete what you sent, at any time by emailing us — no reason needed, and no effect on anything else.
  • Retention. Kept for up to 24 months after our last exchange, or until you withdraw consent, whichever comes first. Full detail in the Privacy Policy.
// Prefer email? info@simplesmoothsafe.com reaches the same place.

Own your document templates.

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.

// info@simplesmoothsafe.com