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.

Invoice header
Core invoice data — present in almost every template.
| Field / placeholder | Type | Example | Description |
|---|---|---|---|
{{invoiceNumber}} | string | INV-2026-042 | Invoice number (§ 14 UStG) |
{{type}} | enum | invoice | credit_note | proforma | correction | Invoice type |
{{issueDate}} | ISO date | 2026-04-14 | Issue date |
{{dueDate}} | ISO date | 2026-05-14 | Due date |
{{deliveryDate?}} | ISO date | 2026-04-10 | Delivery / service date, optional |
{{servicePeriod.start?}} | ISO date | 2026-03-01 | Service period start — required in DE if ≠ issueDate |
{{servicePeriod.end?}} | ISO date | 2026-03-31 | Service period end |
{{currency}} | string | EUR | ISO 4217 currency code |
{{subtotal}} | number | 1500.00 | Net total |
{{total}} | number | 1785.00 | Gross total |
{{orderNumber?}} | string | PO-2026-042 | Customer PO number, optional |
{{customerNumber?}} | string | CUST-4711 | Customer number, optional |
{{contractNumber?}} | string | CONTR-2026-01 | Contract number, optional |
{{notes?}} | string | Thanks for your business … | Free-text notes, optional |
Seller (sender)
Data of the invoice issuer. Buyer uses the same structure.
| Field / placeholder | Type | Example | Description |
|---|---|---|---|
{{seller.name}} | string | ACME GmbH | Company name |
{{seller.tradingName?}} | string | ACME | Trading name, optional |
{{seller.street}} | string | Hauptstr. 1 | Street + number |
{{seller.additionalStreet?}} | string | Building B | Additional address line, optional |
{{seller.postalCode}} | string | 10115 | Postal code |
{{seller.city}} | string | Berlin | City |
{{seller.state?}} | string | DE-BE | State (ISO 3166-2), optional |
{{seller.countryCode}} | string | DE | ISO 3166-1 alpha-2 |
{{seller.vatId?}} | string | DE123456789 | VAT ID, optional |
{{seller.taxId?}} | string | 12/345/67890 | Tax number, optional |
{{seller.email?}} | string | billing@acme.de | Email, optional |
{{seller.phone?}} | string | +49 30 12345678 | Phone, optional |
{{seller.website?}} | string | acme.de | Website, optional |
{{seller.bankAccount.iban?}} | string | DE89… | IBAN — required for SEPA credit transfer in ZUGFeRD/XRechnung; iban is required inside bankAccount |
{{seller.bankAccount.bic?}} | string | COBADEFFXXX | BIC (nested), optional |
{{seller.bankAccount.bankName?}} | string | Commerzbank | Bank name, optional |
{{seller.bankAccount.accountHolder?}} | string | ACME GmbH | Account holder, optional |
Buyer (recipient)
Identical structure to seller — same paths (buyer.name, buyer.bankAccount.*, buyer.vatId, …).
| Field / placeholder | Type | Example | Description |
|---|---|---|---|
{{buyer.name}} | string | Kunde AG | Company name |
{{buyer.street}} | string | Musterweg 5 | Street |
{{buyer.postalCode}} | string | 80331 | Postal code |
{{buyer.city}} | string | München | City |
{{buyer.countryCode}} | string | DE | ISO 3166-1 alpha-2 |
{{buyer.vatId?}} | string | DE987654321 | VAT ID, optional |
{{buyer.email?}} | string | contact@kunde.de | Email, optional |
Line items — {{items}}
Array placeholder. Use as dataSource: '{{items}}' in the table block. Field access via columns[].field.
| Field / placeholder | Type | Example | Description |
|---|---|---|---|
position | number | 1 | Position number |
articleNumber | string | ART-001 | Article / service number, optional |
description | string | Consulting | Item / service description |
quantity | number | 10 | Quantity |
unit | UNECE Rec 20 | HUR, C62, KGM, … | Unit (HUR=hour, C62=piece, KGM=kg) |
unitPrice | number | 150.00 | Unit price, net |
taxRate | number 0–100 | 19 | VAT rate in % |
taxCategoryCode | string | S | EN-16931 tax category code (e.g. S=standard, AE=reverse charge, Z=zero, E=exempt) — optional, not a schema-enforced enum |
netAmount | number | 1500.00 | Net line amount |
taxAmount | number | 285.00 | VAT line amount |
grossAmount | number | 1785.00 | Gross line amount |
Tax rows — {{taxSummary}}
Array placeholder. Bind via dataSource in summary.dynamicRows.
| Field / placeholder | Type | Example | Description |
|---|---|---|---|
taxRate | number | 19 | Tax rate in % |
taxCategoryCode | string | S | EN-16931 tax category code (e.g. S=standard, AE=reverse charge, Z=zero, E=exempt) — optional, not a schema-enforced enum |
netAmount | number | 1500.00 | Net portion |
taxAmount | number | 285.00 | VAT amount |
Payment — {{paymentTerms}} & {{paymentMethods}}
Payment terms and methods.
| Field / placeholder | Type | Example | Description |
|---|---|---|---|
{{paymentTerms.dueDays}} | number | 30 | Payment term in days, required |
{{paymentTerms.description?}} | string | Payable within 30 days | Free-text payment note, optional |
{{paymentTerms.earlyPaymentDiscount.days?}} | number | 7 | Early-payment window in days (nested) |
{{paymentTerms.earlyPaymentDiscount.discountPercent?}} | number | 2 | Early-payment discount in % (nested) |
{{paymentMethods}} | array | — | Optional — 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 / placeholder | Type | Example | Description |
|---|---|---|---|
{{countrySpecific.countryCode}} | const | DE | Required discriminator ("DE") |
{{countrySpecific.leitwegId?}} | string | 04011000-12345-34 | Leitweg-ID for B2G (required for public sector) |
{{countrySpecific.buyerReference?}} | string | PO-2026-0815 | Buyer reference (BT-10) — required by EN 16931 when no Leitweg-ID |
{{countrySpecific.paymentMeansCode?}} | string | 58 | UNTDID 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?}} | boolean | true | German 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.
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.
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.