Back to Home

Edge Cases & Limits

How ZeroExport behaves at the edges — missing data, malformed rules, limits, and formatting fallbacks — so generated documents stay predictable.

ZeroExport is built to fail safe and stay predictable: missing data renders empty rather than breaking, malformed rules hide content rather than leaking it, and every value has a defined fallback. This page is the reference for that behavior.


Merge field edge cases

SituationBehavior
Field is empty / blankRenders as empty text — no {{...}} braces printed
Field path can't be resolved (wrong alias or field)Renders empty, no error
Related record is missing ({{A.B.C}} where B is null)Renders empty
Unknown system variable (e.g. {todya})Left as-is, braces included, so the typo is visible
Field name casing differsMatched case-insensitively — {{account.name}} = {{Account.Name}}

Iteration edge cases

SituationBehavior
Parent has no child recordsRepeating rows/items produce no output (no empty row)
Need a "no records" messageAdd a separate element with a visibility rule for the empty case
Builder preview row countChild collections are capped in preview for speed; full data renders on generation
List nesting depthNested lists are limited to 3 levels deep

Conditional visibility edge cases

Visibility is fail-closed — when in doubt, the element is hidden:

SituationResult
Rule references a missing fieldElement hidden
Condition has no rowsElement hidden
Rule is malformed / errors during evaluationElement hidden
A shared condition references an ID that no longer existsElement hidden
Ordering comparison (>, <, >=, <=) on non-numeric valuesCondition is false (fail-closed)
Checkbox field with an operator other than = / !=Condition is false

Limits

LimitValue
Conditions per visibility rule10
Parenthesis nesting in custom logic5 levels

Exceeding either limit hides the element rather than partially evaluating.

Null and empty handling

  • Is Null treats a truly empty compound field (Address / Geolocation with all sub-fields blank) as empty.
  • Explicit = or != against an empty field still evaluates deterministically (e.g. Field = is true when the field is blank).

Formatting fallbacks

CaseBehavior
Date with no format specRendered in the running user's locale
Datetime with no time zoneConverted to the running user's time zone
Date-only field with a time zone in the specTime zone ignored — the date never shifts across zones
Number with no specLocale-aware grouping separators
Percent field (0–100)% appended without re-scaling
Currency in a multi-currency orgUses the record's own currency symbol, not the user's default
Unsupported currency glyphSubstituted with a PDF-safe form (e.g. INR → Rs. , THB → THB ) so it never renders as a blank box
Checkbox / Boolean valueRendered as [X] (true) or [ ] (false)
Multi-select picklistSemicolons become commas: Red;BlueRed, Blue
Compound AddressRendered multi-line, blank parts omitted

PDF rendering constraints

The PDF engine supports a focused subset of CSS. Keep these in mind when styling:

  • Not supported: JavaScript, external stylesheets, CSS classes (inline styles only), flexbox/grid, advanced selectors, and pseudo-elements.
  • Some currency and script glyphs are missing from default PDF fonts — ZeroExport already substitutes PDF-safe currency symbols for you (see above).
  • Preview in HTML first to catch layout issues quickly, then confirm in PDF.

See also