Aufbau einer UBL-Rechnung

Der vollständige Aufbau einer UBL-Rechnung Schritt für Schritt erklärt: von Header und Parteien bis zu Rechnungszeilen und MwSt.-Summen.

Eine UBL-Rechnung besteht aus einem festen Satz von Bausteinen. Ob Sie Rechnungen über die eConnect-Plattform versenden, über die PSB API oder eine eigene Integration aufbauen: Es hilft enorm zu wissen, welche Bestandteile eine UBL-Rechnung enthält und in welcher Reihenfolge sie stehen. Dieser Artikel geht die Struktur von Anfang bis Ende durch.

Die großen Linien

Eine UBL Invoice (Version 2.1) besteht aus vier Hauptbereichen, immer in dieser Reihenfolge:

  1. Rechnungsebene: Identifikation, Typ, Daten und Referenzen
  2. Parteien: wer sendet, wer empfängt und optional wer bezahlt wird
  3. Zahlungs- und Lieferinformationen: wie und wann gezahlt wird
  4. Finanziell: MwSt.-Summen, Rechnungssummen und die einzelnen Rechnungszeilen

Innerhalb jedes Hauptbereichs stehen Elemente in einer festen XML-Reihenfolge. Diese Reihenfolge wird vom UBL-Standard vorgeschrieben. Vertauschen Sie die Reihenfolge, wird die Rechnung bei der Validierung abgelehnt.

1. Rechnungsebene
Identifikation und Typ

Jede Rechnung beginnt mit einer Handvoll Pflichtelementen, die die Rechnung als Ganzes identifizieren:

<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>F-2026-00042</cbc:ID>
<cbc:IssueDate>2026-03-08</cbc:IssueDate>
<cbc:DueDate>2026-04-07</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

Die CustomizationID teilt dem Empfänger mit, welchem Profil die Rechnung folgt (z.B. NLCIUS oder BIS Billing V3). Die ProfileID identifiziert den Geschäftsprozess. Der InvoiceTypeCode gibt an, ob es sich um eine reguläre Rechnung (380), eine Gutschriftvariante (381) oder eine Self-Billing-Rechnung (389) handelt.

Tipp: eConnect erkennt das Profil automatisch anhand der CustomizationID. Sie müssen dafür nichts konfigurieren.

Referenzen

Nach der Identifikation folgen optionale Verweise. Die häufigste ist die Bestellnummer (OrderReference), aber Sie können auch auf einen Vertrag, ein Projekt oder eine zuvor gesendete Rechnung verweisen:

<cac:OrderReference>
  <cbc:ID>PO-2026-1234</cbc:ID>
</cac:OrderReference>
<cac:ContractDocumentReference>
  <cbc:ID>CT-2025-5678</cbc:ID>
</cac:ContractDocumentReference>

Für empfangende Organisationen, die Rechnungen automatisch verarbeiten (denken Sie an große Unternehmen und Behörden), ist die Bestellnummer oft verpflichtend. Ohne Bestellnummer wird die Rechnung nicht akzeptiert.

Anlagen

Viele Rechnungen enthalten ein PDF als visuelle Anlage. Dieses wird als base64-kodierte Datei im AdditionalDocumentReference-Element (EmbeddedDocumentBinaryObject) aufgenommen. eConnect kann diese Anlage beim Versenden automatisch hinzufügen.

Ob ein eingebettetes PDF in der eConnect-Plattform als Rechnungs-PDF angezeigt wird (die Rechnungsansicht im Dashboard), hängt von der exakten Erkennungswert in diesem Block ab:

  • cbc:DocumentDescription = CommercialInvoice (camelCase, ohne Leerzeichen), oder
  • DocumentType = PrimaryImage

Der Fließtext "Commercial Invoice" meint dasselbe, aber die Plattformerkennung folgt ausschließlich dem exakten Literal oben. Fehlt dieses Tag, zählt das PDF als normale Anlage statt als Rechnungsansicht. Siehe Status — Eingangsrechnung nur XML oder auch PDF?.

2. Parteien

Eine UBL-Rechnung kennt mindestens zwei Parteien und optional eine dritte und vierte.

Der Lieferant (AccountingSupplierParty)

Der Absender der Rechnung. Pflichtangaben sind der Name, die Adresse und mindestens eine steuerliche Identifikationsnummer (Umsatzsteuer-ID oder Handelskammernummer). In den Niederlanden ist die Handelskammernummer die primäre Peppol-ID:

<cac:AccountingSupplierParty>
  <cac:Party>
    <cbc:EndpointID schemeID="0106">12345678</cbc:EndpointID>
    <cac:PartyName>
      <cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
    </cac:PartyName>
    <cac:PostalAddress>
      <cbc:StreetName>Kerkstraat 1</cbc:StreetName>
      <cbc:CityName>Woerden</cbc:CityName>
      <cbc:PostalZone>3441 AB</cbc:PostalZone>
      <cac:Country>
        <cbc:IdentificationCode>NL</cbc:IdentificationCode>
      </cac:Country>
    </cac:PostalAddress>
    <cac:PartyTaxScheme>
      <cbc:CompanyID>NL123456789B01</cbc:CompanyID>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:PartyTaxScheme>
    <cac:PartyLegalEntity>
      <cbc:RegistrationName>Voorbeeldbedrijf B.V.</cbc:RegistrationName>
      <cbc:CompanyID schemeID="0106">12345678</cbc:CompanyID>
    </cac:PartyLegalEntity>
  </cac:Party>
</cac:AccountingSupplierParty>
Der Käufer (AccountingCustomerParty)

Der Empfänger der Rechnung. Die Struktur ist identisch mit der des Lieferanten. Die EndpointID ist die Peppol-Adresse, an die die Rechnung geroutet wird.

Optionale Parteien

In einigen Fällen gibt es zusätzliche Parteien:

  • PayeeParty: wenn der Betrag an eine andere Partei als den Lieferanten gehen soll (z.B. bei Factoring)
  • TaxRepresentativeParty: wenn ein steuerlicher Vertreter die Mehrwertsteuer im Namen des Lieferanten abführt (kommt bei ausländischen Lieferanten vor, die in den Niederlanden mehrwertsteuerpflichtig sind)
3. Zahlung und Lieferung
Zahlungsmethode (PaymentMeans)

Dieser Block beschreibt, wie die Rechnung bezahlt werden soll. Er enthält die Zahlungsmethode (Überweisung, Lastschrift), die Bankkontonummer und optional ein Zahlungskennzeichen:

<cac:PaymentMeans>
  <cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
  <cbc:PaymentID>RF71 2348 2367</cbc:PaymentID>
  <cac:PayeeFinancialAccount>
    <cbc:ID>NL91ABNA0417164300</cbc:ID>
    <cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
  </cac:PayeeFinancialAccount>
</cac:PaymentMeans>

Code 30 steht für Überweisung, 49 für Lastschrift, 58 für SEPA-Lastschrift. Die vollständige Codeliste ist in UNCL4461 definiert.

Zahlungsbedingungen (PaymentTerms)

Ein Freitextfeld, in dem Zahlungsbedingungen beschrieben werden. Einige Systeme verwenden dies auch für Skonti.

Lieferinformationen (Delivery)

Optional. Enthält das Lieferdatum und die Lieferadresse, relevant bei Warenlieferungen.

4. Der finanzielle Block
Zuschläge und Nachlässe auf Rechnungsebene (AllowanceCharge)

Vor den MwSt.-Summen stehen eventuelle Rechnungsrabatte oder -zuschläge. Jeder Posten hat einen Indikator (true = Zuschlag, false = Nachlass), einen Betrag und eine MwSt.-Kategorie:

<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Rabatt</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="EUR">50.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>21.00</cbc:Percent>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:AllowanceCharge>

AllowanceCharge kann auch innerhalb des Price-Elements einer Rechnungszeile vorkommen, um den Unterschied zwischen dem Bruttopreis und dem Nettoeinheitspreis darzustellen. Auf dieser Preisebene gilt eine Einschränkung: Nur Nachlässe (ChargeIndicator=false) sind erlaubt, keine Zuschläge. Zusätzlich schreibt die Validierungsregel BR-28 vor, dass der Bruttopreis nicht negativ sein darf. Weitere Details finden Sie im Artikel über Zuschläge und Nachlässe.

MwSt.-Summen (TaxTotal)

Die Mehrwertsteuer wird pro Satz zusammengefasst. Jeder Satz erhält ein eigenes TaxSubtotal mit der Bemessungsgrundlage und dem berechneten MwSt.-Betrag:

<cac:TaxTotal>
  <cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
  <cac:TaxSubtotal>
    <cbc:TaxableAmount currencyID="EUR">200.00</cbc:TaxableAmount>
    <cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
    <cac:TaxCategory>
      <cbc:ID>S</cbc:ID>
      <cbc:Percent>21.00</cbc:Percent>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:TaxSubtotal>
</cac:TaxTotal>

Die MwSt.-Kategorie S steht für den Normalsatz. Weitere häufig verwendete Codes sind Z (Nullsatz), E (befreit), AE (Steuerschuldumkehr Inland), K (innergemeinschaftlich) und G (Export).

Rechnungssummen (LegalMonetaryTotal)

Das Schlussstück der Rechnung. Hier stehen alle Beträge, die zusammen den zahlbaren Betrag ergeben:

<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="EUR">200.00</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="EUR">242.00</cbc:TaxInclusiveAmount>
  <cbc:AllowanceTotalAmount currencyID="EUR">50.00</cbc:AllowanceTotalAmount>
  <cbc:PayableAmount currencyID="EUR">242.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Die Berechnung lautet: LineExtensionAmount (Summe aller Zeilenbeträge) minus AllowanceTotalAmount (Nachlässe) plus ChargeTotalAmount (Zuschläge) = TaxExclusiveAmount. Darauf die MwSt. = TaxInclusiveAmount. Abzüglich eventueller Vorauszahlungen (PrepaidAmount) = PayableAmount. Diese Berechnung muss exakt stimmen, andernfalls schlägt die Validierung fehl.

Rechnungszeilen (InvoiceLine)

Jede Rechnung hat mindestens eine Zeile. Eine Zeile enthält eine laufende Nummer, die fakturierte Menge, den Zeilenbetrag, eine Artikelbeschreibung und MwSt.-Informationen:

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
  <cac:Item>
    <cbc:Name>Beratungsstunden März 2026</cbc:Name>
    <cac:ClassifiedTaxCategory>
      <cbc:ID>S</cbc:ID>
      <cbc:Percent>21.00</cbc:Percent>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:ClassifiedTaxCategory>
  </cac:Item>
  <cac:Price>
    <cbc:PriceAmount currencyID="EUR">25.00</cbc:PriceAmount>
  </cac:Price>
</cac:InvoiceLine>

Eine Rechnungszeile kann auch einen Nachlass oder Zuschlag enthalten (über ein verschachteltes AllowanceCharge-Element), auf eine Bestellzeile verweisen und zusätzliche Artikeldaten wie Artikelnummern oder Buchungsinformationen enthalten.

Technisch: Das Feld AccountingCost in der Rechnungszeile wird häufig verwendet, um eine Kostenstelle oder Dimension mitzugeben. Empfangssysteme wie AFAS, Unit4 und SAP können dieses Feld für die automatische Verbuchung auslesen. Eine besondere Anwendung ist das Referenzkontenrahmen-Schema (RGS): Durch Aufnahme einer RGS-Referenznummer in AccountingCost kann die empfangende Buchhaltungssoftware den Betrag automatisch auf das richtige Sachkonto buchen. Die PSB transportiert das AccountingCost-Element unverändert in der UBL mit.

Alles muss stimmen

Die Stärke einer UBL-Rechnung liegt in ihrer internen Konsistenz. Die MwSt.-Summen müssen exakt mit der MwSt. pro Zeile übereinstimmen. Die Rechnungssummen müssen exakt die Summe der Zeilenbeträge minus Nachlässe plus Zuschläge ergeben. Weicht ein einziger Cent ab, wird die Rechnung bei der Validierung abgelehnt.

eConnect validiert jede Rechnung bei der Einreichung automatisch und gibt bei Abweichungen eine klare Fehlermeldung aus. Wo möglich werden kleine Abweichungen (wie ein fehlendes Feld, das aus dem Kontext abgeleitet werden kann) automatisch repariert.

Häufig gestellte Fragen
Was passiert, wenn meine Rechnung bei der Validierung abgelehnt wird?

eConnect gibt bei Abweichungen eine klare Fehlermeldung aus, die angibt, welches Element nicht korrekt ist. Häufige Ursachen sind Rechenfehler in MwSt.-Summen, fehlende Pflichtfelder oder ungültige Codes. Kleine Abweichungen (wie ein ableitbares fehlendes Feld) werden wo möglich automatisch repariert.

Muss ich alle Elemente einer UBL-Rechnung selbst ausfüllen?

Das hängt davon ab, wie Sie fakturieren. Wenn Sie Rechnungen in der eConnect-Plattform erstellen, werden alle Pflichtfelder automatisch ausgefüllt. Bei der Einreichung über die API müssen Sie die erforderlichen Felder selbst mitliefern, aber eConnect validiert alles und gibt klares Feedback bei fehlenden oder fehlerhaften Daten.

Kann ich mehrere MwSt.-Sätze auf einer Rechnung verwenden?

Ja. Jede Rechnungszeile hat eine eigene MwSt.-Kategorie und einen eigenen Prozentsatz. Im TaxTotal-Block werden die Sätze automatisch in separate TaxSubtotals gruppiert. So können Sie auf einer Rechnung Zeilen mit 21%, 9%, 0% oder steuerbefreiter MwSt. kombinieren.


Möchten Sie einen bestimmten Teil der Rechnung besser verstehen? Die Artikel unten gehen tiefer auf häufige Szenarien ein.

Tipp: Nutzen Sie den kostenlosen eConnect Validator, um Ihre Rechnung vor dem Versand zu prüfen. Der Validator prüft nicht nur die Schema-Struktur, sondern auch alle Berechnungsregeln und Codelisten.

Rechnung validieren

Verwandt