Platzhalter-Referenz
Jedes Feld aus dem Creator-Payload ist im BlockTemplate als Mustache-Platzhalter verfügbar. Optionalität über das ?-Suffix oder die condition-Property eines Blocks.

Rechnungskopf
Kerninformationen der Rechnung — in fast jedem Template vertreten.
| Feld / Platzhalter | Typ | Beispiel | Beschreibung |
|---|---|---|---|
{{invoiceNumber}} | string | INV-2026-042 | Rechnungsnummer (§ 14 UStG) |
{{type}} | enum | invoice | credit_note | proforma | correction | Rechnungsart |
{{issueDate}} | ISO date | 2026-04-14 | Ausstellungsdatum |
{{dueDate}} | ISO date | 2026-05-14 | Zahlungsziel |
{{deliveryDate?}} | ISO date | 2026-04-10 | Leistungs-/Lieferdatum, optional |
{{servicePeriod.start?}} | ISO date | 2026-03-01 | Leistungszeitraum Start — in DE Pflicht wenn ≠ issueDate |
{{servicePeriod.end?}} | ISO date | 2026-03-31 | Leistungszeitraum Ende |
{{currency}} | string | EUR | ISO 4217 Währungscode |
{{subtotal}} | number | 1500.00 | Summe netto |
{{total}} | number | 1785.00 | Summe brutto |
{{orderNumber?}} | string | PO-2026-042 | Bestellnummer des Kunden, optional |
{{customerNumber?}} | string | CUST-4711 | Kundennummer, optional |
{{contractNumber?}} | string | CONTR-2026-01 | Vertragsnummer, optional |
{{notes?}} | string | Vielen Dank … | Freitext-Hinweise, optional |
Seller (Absender)
Daten des Rechnungsstellers. Buyer hat die gleiche Struktur.
| Feld / Platzhalter | Typ | Beispiel | Beschreibung |
|---|---|---|---|
{{seller.name}} | string | ACME GmbH | Firmenname |
{{seller.tradingName?}} | string | ACME | Handelsname, optional |
{{seller.street}} | string | Hauptstr. 1 | Straße + Hausnummer |
{{seller.additionalStreet?}} | string | Gebäude B | Zusatz-Adresszeile, optional |
{{seller.postalCode}} | string | 10115 | PLZ |
{{seller.city}} | string | Berlin | Ort |
{{seller.state?}} | string | DE-BE | Bundesland (ISO 3166-2), optional |
{{seller.countryCode}} | string | DE | ISO 3166-1 alpha-2 |
{{seller.vatId?}} | string | DE123456789 | USt-IdNr., optional |
{{seller.taxId?}} | string | 12/345/67890 | Steuernummer, optional |
{{seller.email?}} | string | rechnung@acme.de | E-Mail, optional |
{{seller.phone?}} | string | +49 30 12345678 | Telefon, optional |
{{seller.website?}} | string | acme.de | Webseite, optional |
{{seller.bankAccount.iban?}} | string | DE89… | IBAN — Pflicht bei SEPA-Überweisung (ZUGFeRD/XRechnung); iban innerhalb bankAccount Pflicht |
{{seller.bankAccount.bic?}} | string | COBADEFFXXX | BIC (nested), optional |
{{seller.bankAccount.bankName?}} | string | Commerzbank | Bankname, optional |
{{seller.bankAccount.accountHolder?}} | string | ACME GmbH | Kontoinhaber, optional |
Buyer (Empfänger)
Struktur identisch zu seller — gleiche Pfade (buyer.name, buyer.bankAccount.*, buyer.vatId, …).
| Feld / Platzhalter | Typ | Beispiel | Beschreibung |
|---|---|---|---|
{{buyer.name}} | string | Kunde AG | Firmenname |
{{buyer.street}} | string | Musterweg 5 | Straße |
{{buyer.postalCode}} | string | 80331 | PLZ |
{{buyer.city}} | string | München | Ort |
{{buyer.countryCode}} | string | DE | ISO 3166-1 alpha-2 |
{{buyer.vatId?}} | string | DE987654321 | USt-IdNr., optional |
{{buyer.email?}} | string | kontakt@kunde.de | E-Mail, optional |
Positionen — {{items}}
Array-Platzhalter. Im table-Block als dataSource: '{{items}}' verwenden. Feldzugriff in columns[].field.
| Feld / Platzhalter | Typ | Beispiel | Beschreibung |
|---|---|---|---|
position | number | 1 | Positionsnummer |
articleNumber | string | ART-001 | Artikel-/Leistungsnummer, optional |
description | string | Beratung | Artikel-/Leistungsbezeichnung |
quantity | number | 10 | Menge |
unit | UNECE Rec 20 | HUR, C62, KGM, … | Einheit (HUR=Stunde, C62=Stück, KGM=kg) |
unitPrice | number | 150.00 | Einzelpreis netto |
taxRate | number 0–100 | 19 | USt.-Satz in % |
taxCategoryCode | string | S | EN-16931 Tax-Category-Code (z. B. S=Standard, AE=Reverse-Charge, Z=Null, E=Befreiung) — optional, kein API-Enum |
netAmount | number | 1500.00 | Netto-Zeilenbetrag |
taxAmount | number | 285.00 | USt.-Zeilenbetrag |
grossAmount | number | 1785.00 | Brutto-Zeilenbetrag |
Steuerzeilen — {{taxSummary}}
Array-Platzhalter. In summary.dynamicRows per dataSource binden.
| Feld / Platzhalter | Typ | Beispiel | Beschreibung |
|---|---|---|---|
taxRate | number | 19 | Steuersatz in % |
taxCategoryCode | string | S | EN-16931 Tax-Category-Code (z. B. S=Standard, AE=Reverse-Charge, Z=Null, E=Befreiung) — optional, kein API-Enum |
netAmount | number | 1500.00 | Netto-Anteil |
taxAmount | number | 285.00 | USt.-Betrag |
Zahlung — {{paymentTerms}} & {{paymentMethods}}
Zahlungsbedingungen und -methoden.
| Feld / Platzhalter | Typ | Beispiel | Beschreibung |
|---|---|---|---|
{{paymentTerms.dueDays}} | number | 30 | Zahlungsziel in Tagen, Pflicht |
{{paymentTerms.description?}} | string | Zahlbar innerhalb 30 Tagen | Freitext zur Zahlung, optional |
{{paymentTerms.earlyPaymentDiscount.days?}} | number | 7 | Skonto-Frist in Tagen (nested) |
{{paymentTerms.earlyPaymentDiscount.discountPercent?}} | number | 2 | Skonto in % (nested) |
{{paymentMethods}} | array | — | Optional — Einträge mit type (bank_transfer=UNTDID 30, direct_debit=49, credit_card=48, paypal, cash=10, other) und details. bank_transfer verlangt seller.bankAccount; direct_debit verlangt zusätzlich buyer.bankAccount |
Länderspezifisch — {{countrySpecific}}
Länderabhängige Felder. countryCode ist Pflicht-Discriminator. EN 16931 verlangt für DE mindestens eines von {buyerReference, leitwegId}.
| Feld / Platzhalter | Typ | Beispiel | Beschreibung |
|---|---|---|---|
{{countrySpecific.countryCode}} | const | DE | Pflicht-Discriminator ("DE") |
{{countrySpecific.leitwegId?}} | string | 04011000-12345-34 | Leitweg-ID für B2G (Pflicht bei Behörden) |
{{countrySpecific.buyerReference?}} | string | PO-2026-0815 | Bestellreferenz (BT-10) — Pflicht per EN 16931 wenn keine Leitweg-ID |
{{countrySpecific.paymentMeansCode?}} | string | 58 | UNTDID 4461 (Default "58" SEPA). Werte: 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 | Kleinunternehmer §19 UStG |
Listen iterieren (table-Block)
Setze dataSource auf den Array-Platzhalter. Jede column.field greift direkt auf die Item-Eigenschaft zu — ohne weiteres item.*-Prefix.
1{2 "type": "table",3 "data": {4 "dataSource": "{{items}}",5 "columns": [6 { "field": "position", "header": "Pos", "width": "8%" },7 { "field": "description", "header": "Beschreibung", "width": "*" },8 { "field": "quantity", "header": "Menge", "width": "12%", "align": "center" },9 { "field": "unitPrice", "header": "Einzel", "width": "15%", "align": "right", "format": "currency" },10 { "field": "netAmount", "header": "Netto", "width": "15%", "align": "right", "format": "currency" }11 ]12 }13}Optionale Werte & Bedingungen
?-Suffix unterdrückt leere Platzhalter. Für ganze Blöcke nutzt du condition — dort darf ein Platzhalter-Ausdruck stehen.
1{2 "type": "text",3 "data": { "content": "Telefon: {{seller.phone?}}" }4}5// → Block rendert nicht, wenn seller.phone fehlt.6 7{8 "type": "text",9 "condition": "{{notes}}",10 "data": { "content": "Hinweis: {{notes}}" }11}12// → Block rendert nur, wenn notes gesetzt ist.