Zurück zu Rechnungsvorlagen

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.

Platzhalter wie {{invoiceNumber}} und {{seller.name}} fließen in eine PDF-Rechnung

Rechnungskopf

Kerninformationen der Rechnung — in fast jedem Template vertreten.

Feld / PlatzhalterTypBeispielBeschreibung
{{invoiceNumber}}stringINV-2026-042Rechnungsnummer (§ 14 UStG)
{{type}}enuminvoice | credit_note | proforma | correctionRechnungsart
{{issueDate}}ISO date2026-04-14Ausstellungsdatum
{{dueDate}}ISO date2026-05-14Zahlungsziel
{{deliveryDate?}}ISO date2026-04-10Leistungs-/Lieferdatum, optional
{{servicePeriod.start?}}ISO date2026-03-01Leistungszeitraum Start — in DE Pflicht wenn ≠ issueDate
{{servicePeriod.end?}}ISO date2026-03-31Leistungszeitraum Ende
{{currency}}stringEURISO 4217 Währungscode
{{subtotal}}number1500.00Summe netto
{{total}}number1785.00Summe brutto
{{orderNumber?}}stringPO-2026-042Bestellnummer des Kunden, optional
{{customerNumber?}}stringCUST-4711Kundennummer, optional
{{contractNumber?}}stringCONTR-2026-01Vertragsnummer, optional
{{notes?}}stringVielen Dank …Freitext-Hinweise, optional

Seller (Absender)

Daten des Rechnungsstellers. Buyer hat die gleiche Struktur.

Feld / PlatzhalterTypBeispielBeschreibung
{{seller.name}}stringACME GmbHFirmenname
{{seller.tradingName?}}stringACMEHandelsname, optional
{{seller.street}}stringHauptstr. 1Straße + Hausnummer
{{seller.additionalStreet?}}stringGebäude BZusatz-Adresszeile, optional
{{seller.postalCode}}string10115PLZ
{{seller.city}}stringBerlinOrt
{{seller.state?}}stringDE-BEBundesland (ISO 3166-2), optional
{{seller.countryCode}}stringDEISO 3166-1 alpha-2
{{seller.vatId?}}stringDE123456789USt-IdNr., optional
{{seller.taxId?}}string12/345/67890Steuernummer, optional
{{seller.email?}}stringrechnung@acme.deE-Mail, optional
{{seller.phone?}}string+49 30 12345678Telefon, optional
{{seller.website?}}stringacme.deWebseite, optional
{{seller.bankAccount.iban?}}stringDE89…IBAN — Pflicht bei SEPA-Überweisung (ZUGFeRD/XRechnung); iban innerhalb bankAccount Pflicht
{{seller.bankAccount.bic?}}stringCOBADEFFXXXBIC (nested), optional
{{seller.bankAccount.bankName?}}stringCommerzbankBankname, optional
{{seller.bankAccount.accountHolder?}}stringACME GmbHKontoinhaber, optional

Buyer (Empfänger)

Struktur identisch zu seller — gleiche Pfade (buyer.name, buyer.bankAccount.*, buyer.vatId, …).

Feld / PlatzhalterTypBeispielBeschreibung
{{buyer.name}}stringKunde AGFirmenname
{{buyer.street}}stringMusterweg 5Straße
{{buyer.postalCode}}string80331PLZ
{{buyer.city}}stringMünchenOrt
{{buyer.countryCode}}stringDEISO 3166-1 alpha-2
{{buyer.vatId?}}stringDE987654321USt-IdNr., optional
{{buyer.email?}}stringkontakt@kunde.deE-Mail, optional

Positionen — {{items}}

Array-Platzhalter. Im table-Block als dataSource: '{{items}}' verwenden. Feldzugriff in columns[].field.

Feld / PlatzhalterTypBeispielBeschreibung
positionnumber1Positionsnummer
articleNumberstringART-001Artikel-/Leistungsnummer, optional
descriptionstringBeratungArtikel-/Leistungsbezeichnung
quantitynumber10Menge
unitUNECE Rec 20HUR, C62, KGM, …Einheit (HUR=Stunde, C62=Stück, KGM=kg)
unitPricenumber150.00Einzelpreis netto
taxRatenumber 0–10019USt.-Satz in %
taxCategoryCodestringSEN-16931 Tax-Category-Code (z. B. S=Standard, AE=Reverse-Charge, Z=Null, E=Befreiung) — optional, kein API-Enum
netAmountnumber1500.00Netto-Zeilenbetrag
taxAmountnumber285.00USt.-Zeilenbetrag
grossAmountnumber1785.00Brutto-Zeilenbetrag

Steuerzeilen — {{taxSummary}}

Array-Platzhalter. In summary.dynamicRows per dataSource binden.

Feld / PlatzhalterTypBeispielBeschreibung
taxRatenumber19Steuersatz in %
taxCategoryCodestringSEN-16931 Tax-Category-Code (z. B. S=Standard, AE=Reverse-Charge, Z=Null, E=Befreiung) — optional, kein API-Enum
netAmountnumber1500.00Netto-Anteil
taxAmountnumber285.00USt.-Betrag

Zahlung — {{paymentTerms}} & {{paymentMethods}}

Zahlungsbedingungen und -methoden.

Feld / PlatzhalterTypBeispielBeschreibung
{{paymentTerms.dueDays}}number30Zahlungsziel in Tagen, Pflicht
{{paymentTerms.description?}}stringZahlbar innerhalb 30 TagenFreitext zur Zahlung, optional
{{paymentTerms.earlyPaymentDiscount.days?}}number7Skonto-Frist in Tagen (nested)
{{paymentTerms.earlyPaymentDiscount.discountPercent?}}number2Skonto in % (nested)
{{paymentMethods}}arrayOptional — 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 / PlatzhalterTypBeispielBeschreibung
{{countrySpecific.countryCode}}constDEPflicht-Discriminator ("DE")
{{countrySpecific.leitwegId?}}string04011000-12345-34Leitweg-ID für B2G (Pflicht bei Behörden)
{{countrySpecific.buyerReference?}}stringPO-2026-0815Bestellreferenz (BT-10) — Pflicht per EN 16931 wenn keine Leitweg-ID
{{countrySpecific.paymentMeansCode?}}string58UNTDID 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?}}booleantrueKleinunternehmer §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.

json
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.

json
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.