Variables and data
Merge variables available inside editable templates and how conditionals work.
2 min readLast updated 13 Apr 2026
Editable templates pull live data via merge variables. Each doc type exposes a different variable set — the data it has access to.
Viewing available variables
In the Designer, open the Variables panel (right side, secondary tab). It lists every variable available for the current doc type, grouped by source object (e.g. quote.*, customer.*, tenant.*).
Click a variable to copy its token; paste into any text block or conditional expression.
Common namespaces
tenant.*— your company details: name, address, logo, VAT number.customer.*— the bill-to party: name, address, contact, payment terms.quote.*/booking.*/invoice.*— the source record.shipment.*— routing, mode, load type, incoterm, dates.charges[]— line items on the record; rendered via table blocks.user.*— the person who generated the document (for "prepared by").now— generation timestamp.
Formatting
Tokens accept format hints: {{invoice.total | money}}, {{booking.etd | date:"DD MMM YYYY"}}, {{customer.name | upper}}. Available filters: money, date, upper, lower, title, default:"N/A".
Currency formatting respects the source record's currency and the tenant's locale.
Conditionals
Any block can be gated by a conditional expression:
quote.incoterm != ""— show incoterm block only if set.invoice.currency == "USD"— show USD bank details only for USD invoices.booking.mode == "AIR"— show air-specific instructions only on air bookings.
Expressions support ==, !=, <, >, &&, ||, and !. Missing variables evaluate to empty string / zero.
Loops
Table blocks auto-loop over the bound array (charges[], cargoLines[]). You don't write the loop — you pick the array binding and the columns.
For custom repeats (e.g. multiple signature blocks per trip stop), use a repeater block and bind it to an array variable.
What's not available
Variables only cover data the source record knows about. You can't pull arbitrary fields from unrelated records — if you need a field that isn't listed, raise it as a template enhancement request so we can expose it.
Was this article helpful?