Back to invoice templates

Placeholder reference

Every field from the Creator payload is available in the BlockTemplate as a Mustache placeholder. Mark optionality with the ? suffix or the condition property of a block.

Placeholders such as {{invoiceNumber}} and {{seller.name}} flowing into a PDF invoice

Invoice header

Core invoice data — present in almost every template.

Field / placeholderTypeExampleDescription
{{invoiceNumber}}stringINV-2026-042Invoice number (§ 14 UStG)
{{type}}enuminvoice | credit_note | proforma | correctionInvoice type
{{issueDate}}ISO date2026-04-14Issue date
{{dueDate}}ISO date2026-05-14Due date
{{deliveryDate?}}ISO date2026-04-10Delivery / service date, optional
{{servicePeriod.start?}}ISO date2026-03-01Service period start — required in DE if ≠ issueDate
{{servicePeriod.end?}}ISO date2026-03-31Service period end
{{currency}}stringEURISO 4217 currency code
{{subtotal}}number1500.00Net total
{{total}}number1785.00Gross total
{{orderNumber?}}stringPO-2026-042Customer PO number, optional
{{customerNumber?}}stringCUST-4711Customer number, optional
{{contractNumber?}}stringCONTR-2026-01Contract number, optional
{{notes?}}stringThanks for your business …Free-text notes, optional

Seller (sender)

Data of the invoice issuer. Buyer uses the same structure.

Field / placeholderTypeExampleDescription
{{seller.name}}stringACME GmbHCompany name
{{seller.tradingName?}}stringACMETrading name, optional
{{seller.street}}stringHauptstr. 1Street + number
{{seller.additionalStreet?}}stringBuilding BAdditional address line, optional
{{seller.postalCode}}string10115Postal code
{{seller.city}}stringBerlinCity
{{seller.state?}}stringDE-BEState (ISO 3166-2), optional
{{seller.countryCode}}stringDEISO 3166-1 alpha-2
{{seller.vatId?}}stringDE123456789VAT ID, optional
{{seller.taxId?}}string12/345/67890Tax number, optional
{{seller.email?}}stringbilling@acme.deEmail, optional
{{seller.phone?}}string+49 30 12345678Phone, optional
{{seller.website?}}stringacme.deWebsite, optional
{{seller.bankAccount.iban?}}stringDE89…IBAN — required for SEPA credit transfer in ZUGFeRD/XRechnung; iban is required inside bankAccount
{{seller.bankAccount.bic?}}stringCOBADEFFXXXBIC (nested), optional
{{seller.bankAccount.bankName?}}stringCommerzbankBank name, optional
{{seller.bankAccount.accountHolder?}}stringACME GmbHAccount holder, optional

Buyer (recipient)

Identical structure to seller — same paths (buyer.name, buyer.bankAccount.*, buyer.vatId, …).

Field / placeholderTypeExampleDescription
{{buyer.name}}stringKunde AGCompany name
{{buyer.street}}stringMusterweg 5Street
{{buyer.postalCode}}string80331Postal code
{{buyer.city}}stringMünchenCity
{{buyer.countryCode}}stringDEISO 3166-1 alpha-2
{{buyer.vatId?}}stringDE987654321VAT ID, optional
{{buyer.email?}}stringcontact@kunde.deEmail, optional

Line items — {{items}}

Array placeholder. Use as dataSource: '{{items}}' in the table block. Field access via columns[].field.

Field / placeholderTypeExampleDescription
positionnumber1Position number
articleNumberstringART-001Article / service number, optional
descriptionstringConsultingItem / service description
quantitynumber10Quantity
unitUNECE Rec 20HUR, C62, KGM, …Unit (HUR=hour, C62=piece, KGM=kg)
unitPricenumber150.00Unit price, net
taxRatenumber 0–10019VAT rate in %
taxCategoryCodestringSEN-16931 tax category code (e.g. S=standard, AE=reverse charge, Z=zero, E=exempt) — optional, not a schema-enforced enum
netAmountnumber1500.00Net line amount
taxAmountnumber285.00VAT line amount
grossAmountnumber1785.00Gross line amount

Tax rows — {{taxSummary}}

Array placeholder. Bind via dataSource in summary.dynamicRows.

Field / placeholderTypeExampleDescription
taxRatenumber19Tax rate in %
taxCategoryCodestringSEN-16931 tax category code (e.g. S=standard, AE=reverse charge, Z=zero, E=exempt) — optional, not a schema-enforced enum
netAmountnumber1500.00Net portion
taxAmountnumber285.00VAT amount

Payment — {{paymentTerms}} & {{paymentMethods}}

Payment terms and methods.

Field / placeholderTypeExampleDescription
{{paymentTerms.dueDays}}number30Payment term in days, required
{{paymentTerms.description?}}stringPayable within 30 daysFree-text payment note, optional
{{paymentTerms.earlyPaymentDiscount.days?}}number7Early-payment window in days (nested)
{{paymentTerms.earlyPaymentDiscount.discountPercent?}}number2Early-payment discount in % (nested)
{{paymentMethods}}arrayOptional — entries with type (bank_transfer=UNTDID 30, direct_debit=49, credit_card=48, paypal, cash=10, other) and details. bank_transfer requires seller.bankAccount; direct_debit additionally requires buyer.bankAccount

Country-specific — {{countrySpecific}}

Country-dependent fields. countryCode is the required discriminator. EN 16931 requires at least one of {buyerReference, leitwegId} for DE.

Field / placeholderTypeExampleDescription
{{countrySpecific.countryCode}}constDERequired discriminator ("DE")
{{countrySpecific.leitwegId?}}string04011000-12345-34Leitweg-ID for B2G (required for public sector)
{{countrySpecific.buyerReference?}}stringPO-2026-0815Buyer reference (BT-10) — required by EN 16931 when no Leitweg-ID
{{countrySpecific.paymentMeansCode?}}string58UNTDID 4461 (default "58" SEPA). Values: 10=Cash, 30=Credit Transfer, 42=Bank, 48=Card, 49=Direct Debit, 57=Standing Agreement, 58=SEPA, 59=SEPA B2B DD
{{countrySpecific.isKleinunternehmer?}}booleantrueGerman small-business rule § 19 UStG

Iterating lists (table block)

Set dataSource to the array placeholder. Every column.field accesses the item property directly — no additional item.* prefix needed.

json
1{
2 "type": "table",
3 "data": {
4 "dataSource": "{{items}}",
5 "columns": [
6 { "field": "position", "header": "Pos", "width": "8%" },
7 { "field": "description", "header": "Description", "width": "*" },
8 { "field": "quantity", "header": "Qty", "width": "12%", "align": "center" },
9 { "field": "unitPrice", "header": "Unit", "width": "15%", "align": "right", "format": "currency" },
10 { "field": "netAmount", "header": "Net", "width": "15%", "align": "right", "format": "currency" }
11 ]
12 }
13}

Optional values & conditions

The ? suffix suppresses empty placeholders. For whole blocks use condition — it accepts a placeholder expression.

json
1{
2 "type": "text",
3 "data": { "content": "Phone: {{seller.phone?}}" }
4}
5// → Block is skipped when seller.phone is missing.
6 
7{
8 "type": "text",
9 "condition": "{{notes}}",
10 "data": { "content": "Note: {{notes}}" }
11}
12// → Block only renders when notes is set.