Limits & Errors
What VerseDocs can and cannot do at scale, measured rather than estimated, and every error code it can return.
The two-minute ceiling
Every action runs inside the Dataverse plug-in sandbox, which imposes a hard two-minute timeout. There is no asynchronous or job-based mode: an action either finishes inside two minutes or it fails.
In practice this is generous. Measured on a live environment: a Word document with 50,000 repeated rows renders in about 112 seconds, and 20,000 rows converted to a 938-page PDF in about 59 seconds. Conversion costs roughly two to three times the native render, not an order of magnitude.
Elapsed time is not a stable function of input size. The same operation on the same data varied by more than 10× between runs, because the sandbox schedules and recycles workers outside your control — the first call after an idle period alone costs an extra 15–20 seconds. A job that has always finished in 40 seconds can fail on an unlucky day with no change to your data. Size your work so a typical run finishes comfortably under 60 seconds, and treat anything slower than that as at risk.
When a render cannot finish in time, VerseDocs stops it first and returns TEMPLATE_RENDER_ABORTED naming how many rows it reached, so a flow can branch on it. Nothing partial is returned.
File sizes
Measured against a real environment, round-tripping files of increasing size. Note that base64 encoding inflates a file by about a third on the wire, so the payload column is what actually travels.
| File size | On the wire | Time | Result |
|---|---|---|---|
| 1 MB | 1.33 MB | ~2–4 s | Reliable |
| 5 MB | 6.7 MB | ~4 s | Reliable |
| 15 MB | 20 MB | ~8.5 s | Reliable |
| 25 MB | 33 MB | ~15 s | Reliable |
| 40 MB | 53 MB | ~21 s | Reliable |
| 60 MB | 80 MB | ~37 s | Works, but no longer comfortable |
| 80 MB | 107 MB | ~93 s | Uncomfortably close to the two-minute timeout |
| 90 MB | 120 MB | — | Flaky: succeeded 2 times in 3 |
| 100 MB | 133 MB | — | Fails |
Bulk generation
| Path | Limit | If you exceed it |
|---|---|---|
| Generate document button, from a grid | 100 selected records per run | A plain message asks you to select fewer — nothing is generated silently for a subset. |
vdocs_TemplateBatch | 25 rows per call | TEMPLATE_BATCH_TOO_LARGE, refused in under a second before any row is rendered. Nothing partial is produced. Chunk the request — page the FetchXML or the RowIds list in your flow and call it repeatedly. |
For volumes beyond that, chunk the work in the flow — a month at a time, or a page of results at a time — rather than asking for everything in one call.
Sustained bulk work: Dataverse throttling
This one catches people out, and it is not a VerseDocs limit — it is Dataverse protecting itself. The platform caps cumulative plug-in execution time per user. Sustained bulk generation can exhaust that budget and suspend that user’s API access.
The symptom looks nothing like a quota message: everything slows down, including operations that have nothing to do with VerseDocs. In testing, a trivial query for a single account row took over two minutes once the budget was spent, and recovery took roughly 20 minutes of genuine idle — shorter waits were not enough.
If you are generating hundreds of documents, spread the work over time, or across more than one service account, rather than driving it as fast as the API will accept.
What VerseDocs does not do
- No OCR. Text is extracted from PDFs containing real, selectable text. A scanned page or a photo of a document is not made searchable.
- No AI extraction or classification. Use AI Builder upstream, then hand VerseDocs the clean result.
- No translation. Translate the data before it enters a template.
- No CAD or InfoPath conversion.
- PowerPoint templating is fields only — no loops, conditionals or image tokens in decks.
Error codes
Every failure returns JSON with a stable code and a human-readable message. Branch on the code, never on the message — codes are contractual, wording is not.
General
| Code | Meaning |
|---|---|
INVALID_INPUT | A required parameter was missing or malformed. In a flow, an unbound dynamic-content field is the usual cause. |
FILE_TOO_LARGE | The input exceeded the size the action accepts. |
UNSUPPORTED_FILE_TYPE | The file is not a type this action handles. |
UNSUPPORTED_FEATURE | The document uses something this action cannot process. |
INTERNAL_ERROR | An unexpected failure. Contact support with the Meta from the response. |
Licensing
| Code | Meaning |
|---|---|
UTILITY_LICENSE_REQUIRED | A utility-pack action was called without a valid license key. Document generation and conversion are not affected. |
EDITION_REQUIRED | The license does not cover this action. Also returned for a PDF/A request from an unlicensed environment, where a trial watermark would break the conformance the file claims. |
Templating
| Code | Meaning |
|---|---|
TEMPLATE_FIELD_MISSING | A token references a path that does not exist. The message names it exactly. |
TEMPLATE_INVALID_FORMAT | A formatter was applied to a value it cannot format. |
TEMPLATE_EACH_TARGET_NOT_ARRAY | A loop target is not an array. |
TEMPLATE_IMAGE_MISSING | An image token names an image that was not supplied. |
TEMPLATE_SYNTAX_ERROR | A malformed token — commonly an image token with no size. |
TEMPLATE_UNCLOSED_BLOCK | A block was opened and never closed. |
TEMPLATE_MISMATCHED_BLOCK | Block tags overlap or are closed in the wrong order. |
TEMPLATE_STRAY_CLOSE_TAG | A closing tag with no matching opening tag. |
XLSX_ROWS_RANGE_MISSING | Row data supplied but the workbook defines no rows range. |
XLSX_INVALID_ROWS_RANGE | The rows range spans more than one row, or is defined more than once. |
PPTX_NO_SLIDES | The deck has no slides to render. |
Generating from a Dataverse row
| Code | Meaning |
|---|---|
TEMPLATE_NOT_FOUND | No template row with that id. |
TEMPLATE_INACTIVE | The template exists but is deactivated. |
ROW_NOT_FOUND | The target record does not exist, or the calling user cannot read it. |
BOUND_TABLE_MISMATCH | The template's bound table does not match the record's table. |
FETCHXML_INVALID | The binding manifest is not valid FetchXML. |
TEMPLATE_BATCH_TOO_LARGE | The batch request is too large to attempt. |
TEMPLATE_BATCH_ABORTED | The batch stopped part-way. |
ANNOTATION_CREATE_FAILED | The document generated but could not be attached — usually a missing Create privilege on Note. |
| Code | Meaning |
|---|---|
WRONG_PASSWORD | The PDF is encrypted and the password was wrong or absent. |
INVALID_PAGE_RANGE | A page range is malformed or outside the document. |
NO_ACROFORM | The PDF has no fillable form. |
UNSUPPORTED_XFA_FORM | The PDF uses an XFA form, which is not supported. |
CONVERSION_NOT_CONFIGURED | Registered but should not occur in normal operation — conversion needs no configuration. |
HTML_TO_DOCX_CONVERSION_FAILED | The HTML could not be converted. |
PDFEXTRAS_UNSUPPORTED_FILE_TYPE | Not a file the PDF utility actions handle. |
Images, barcodes and archives
| Code | Meaning |
|---|---|
IMAGE_DECODE_FAILED | The bytes are not a readable image. |
IMAGE_UNSUPPORTED_FORMAT | That image format is not supported. |
IMAGE_INVALID_CROP_BOUNDS | The crop falls outside the image. |
IMAGE_INVALID_WATERMARK | The watermark options are not valid. |
BARCODE_UNSUPPORTED_TYPE | Not one of qr, code128, ean13. |
BARCODE_UNSUPPORTED_FORMAT | Output format is not png or svg. |
BARCODE_INVALID_PAYLOAD | The payload does not suit the symbology — an EAN-13 needs 12 or 13 digits. |
BARCODE_UNREADABLE | No barcode could be decoded from the image. |
ZIP_INVALID_ARCHIVE | The file is not a readable zip archive. |
Text, data and documents
| Code | Meaning |
|---|---|
TEXT_REGEX_INVALID_PATTERN | The regular expression does not compile. |
TEXT_REGEX_TIMEOUT | The regular expression took too long — usually catastrophic backtracking. |
TEXT_INVALID_BASE64 | The input is not valid base64. |
TEXT_UNSUPPORTED_CASE_MODE | Unknown casing mode. |
TEXT_UNSUPPORTED_HASH_ALGORITHM | Unknown hash algorithm. |
TEXT_HMAC_KEY_MISSING | An HMAC was requested with no key. |
TEXT_INVALID_GUID_FORMAT | Unknown GUID format specifier. |
TEXT_INVALID_PASSWORD_SPEC | The password specification cannot be satisfied. |
DATA_CSV_MALFORMED | The CSV could not be parsed. |
DATA_JSON_INVALID | The JSON could not be parsed. |
DATA_XML_INVALID | The XML could not be parsed. |
DATA_XLSX_SHEET_NOT_FOUND | The named worksheet does not exist. |
DOCX_INVALID_DOCUMENT | The file is not a readable .docx. |
DOCX_INVALID_PATTERN | The find/redact pattern is not valid. |
DOCX_MERGE_TOO_FEW_DOCUMENTS | A merge needs at least two documents. |
DOCX_WATERMARK_INVALID_OPTIONS | The watermark options are not valid. |
EMAIL_INVALID_EML | The file is not a readable .eml message. |
Trial watermarking
A tenant-scoped Premium key covers every environment in the tenant at once. See Licensing.