data can
actually produce.
How the pipeline is chosen
| Pipeline | Selected when | Engine |
|---|---|---|
| PDF overlay | the template’s templateType is pdf-overlay | pdfme fields on an uploaded base PDF |
| Document mode | the content is a block layout (a pages array) | @react-pdf/renderer |
| Canvas (Handlebars) | otherwise (canvas/section content) | Handlebars → HTML → Puppeteer |
templateType is surfaced on GET /v1/templates/:slug. The split
between document mode and canvas is decided by the stored content shape, which depends on how the
template was authored.
Capability matrix
| Capability | Document mode | Canvas (Handlebars) | PDF overlay |
|---|---|---|---|
| Scalar variables | ✅ | ✅ | ✅ |
| Loops / arrays (repeating table) | ❌ none | ✅ | ❌ fixed fields only |
| Dynamic images from data | ❌ static src only | ✅ data-bound | ✅ data-bound (image field) |
| Signature image | ❌ (signature block is text-only) | ✅ via an image variable | ✅ via an image field |
| Variable-length tables | ❌ | ✅ | ❌ |
| Best for | designed block documents | data-heavy docs with repeating rows | filling a fixed PDF form |
Choosing a pipeline
You need a repeating table (e.g. line items, inspection areas)
Author on the Canvas (Handlebars) pipeline. It is the only pipeline that iterates a loop
into repeated rows. See Variables & loops.
You need a dynamic / signature image
Use Canvas (bind an
image variable) or PDF overlay (an image field). See
Images & signatures.You are filling a fixed, pre-designed PDF form
Use PDF overlay — upload the base PDF and stamp typed fields (text, image, QR) onto it.
It is a designed block document, no arrays
Document mode is the simplest and the default of the modern builder.
Migrating a template from canvas content to a document-mode block layout removes loop and
dynamic-image support. If a template relies on either, keep it on the canvas pipeline.