Zum Inhalt springen

Ironfang Finance - Beispiel

Beispiel einer Peppol-XML-Rechnung

Eine vollständige Rechnung nach Peppol BIS Billing 3 in UBL-XML, die die Prüfung besteht, Feld für Feld erklärt, mit einer fehlerhaften Kopie, die zeigt, wie ein Fehler in den Summen aussieht und wie er behoben wird.

Das Beispiel herunterladen oder prüfen

Ergebnis
Gültig: Die Prüfschritte XML, UBL-Schema, EN 16931 und Peppol wurden alle bestanden, ohne Warnungen.
Geprüft
25. September 2026, mit dem kostenlosen Validator von Ironfang Finance
Regeln
Peppol BIS Billing 3.0, Release Mai 2026 (2026.5, auch bekannt als 3.0.21); Regelwerk fwrs_bis3_billing_invoice_2026_5_r5, VESID eu.peppol.bis3:invoice:2026.5
Prüfmodul
phive 12.1.0 mit phive-rules-peppol 4.5.6 und Saxon-HE 12.10
SHA-256
c9d1474941163526a1a518405de43c5a31d3f5261a72adf80877cc9389534ea9

Alles darin ist erfunden: Adressen unter example.test und GS1-Lokationsnummern mit dem Präfix 952, das GS1 für Demonstrationen reserviert. Die Endpunktkennungen sind keine registrierten Peppol-Teilnehmer; senden Sie nie ein echtes Dokument an sie.

Die ganze Rechnung

Das ist das vollständige Dokument, genau wie heruntergeladen. Die folgenden Abschnitte nehmen es auseinander. Es ist dieselbe Datei, die der Validator sendet, wenn Sie sein gültiges Beispiel ausprobieren.

<?xml version="1.0" encoding="UTF-8"?>
<!--
  A fictional Peppol BIS Billing 3.0 invoice published by Ironfang for the
  free validator at https://ironfang.uk/tools/peppol-validator. Every party,
  identifier, address and amount is invented: example.test names, GS1
  location numbers under prefix 952, which GS1 designates for demonstrations
  and examples, and an account reference that is not a bank account. Reuse it
  freely.
-->
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
    xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
    <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>EX-2026-0001</cbc:ID>
    <cbc:IssueDate>2026-06-15</cbc:IssueDate>
    <cbc:DueDate>2026-07-15</cbc:DueDate>
    <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
    <cbc:Note>Fictional sample invoice for the Ironfang Peppol validator.</cbc:Note>
    <cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
    <cbc:BuyerReference>PO-EXAMPLE-0001</cbc:BuyerReference>
    <cac:AccountingSupplierParty>
        <cac:Party>
            <cbc:EndpointID schemeID="0088">9520000000011</cbc:EndpointID>
            <cac:PartyIdentification>
                <cbc:ID schemeID="0088">9520000000011</cbc:ID>
            </cac:PartyIdentification>
            <cac:PartyName>
                <cbc:Name>Example Supplier Ltd</cbc:Name>
            </cac:PartyName>
            <cac:PostalAddress>
                <cbc:StreetName>1 Example Street</cbc:StreetName>
                <cbc:CityName>Exampleton</cbc:CityName>
                <cbc:PostalZone>EX1 1EX</cbc:PostalZone>
                <cac:Country>
                    <cbc:IdentificationCode>GB</cbc:IdentificationCode>
                </cac:Country>
            </cac:PostalAddress>
            <cac:PartyTaxScheme>
                <cbc:CompanyID>GB000000000</cbc:CompanyID>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:PartyTaxScheme>
            <cac:PartyLegalEntity>
                <cbc:RegistrationName>Example Supplier Ltd</cbc:RegistrationName>
            </cac:PartyLegalEntity>
            <cac:Contact>
                <cbc:Name>Accounts</cbc:Name>
                <cbc:ElectronicMail>accounts@supplier.example.test</cbc:ElectronicMail>
            </cac:Contact>
        </cac:Party>
    </cac:AccountingSupplierParty>
    <cac:AccountingCustomerParty>
        <cac:Party>
            <cbc:EndpointID schemeID="0088">9520000000028</cbc:EndpointID>
            <cac:PartyIdentification>
                <cbc:ID schemeID="0088">9520000000028</cbc:ID>
            </cac:PartyIdentification>
            <cac:PartyName>
                <cbc:Name>Example Buyer Ltd</cbc:Name>
            </cac:PartyName>
            <cac:PostalAddress>
                <cbc:StreetName>2 Sample Road</cbc:StreetName>
                <cbc:CityName>Sampleford</cbc:CityName>
                <cbc:PostalZone>EX2 2EX</cbc:PostalZone>
                <cac:Country>
                    <cbc:IdentificationCode>GB</cbc:IdentificationCode>
                </cac:Country>
            </cac:PostalAddress>
            <cac:PartyLegalEntity>
                <cbc:RegistrationName>Example Buyer Ltd</cbc:RegistrationName>
            </cac:PartyLegalEntity>
            <cac:Contact>
                <cbc:Name>Purchasing</cbc:Name>
                <cbc:ElectronicMail>purchasing@buyer.example.test</cbc:ElectronicMail>
            </cac:Contact>
        </cac:Party>
    </cac:AccountingCustomerParty>
    <cac:Delivery>
        <cbc:ActualDeliveryDate>2026-06-10</cbc:ActualDeliveryDate>
    </cac:Delivery>
    <cac:PaymentMeans>
        <cbc:PaymentMeansCode name="Credit transfer">30</cbc:PaymentMeansCode>
        <cbc:PaymentID>EX-2026-0001</cbc:PaymentID>
        <cac:PayeeFinancialAccount>
            <cbc:ID>EXAMPLE-ACCOUNT-0001</cbc:ID>
            <cbc:Name>Example Supplier Ltd</cbc:Name>
        </cac:PayeeFinancialAccount>
    </cac:PaymentMeans>
    <cac:PaymentTerms>
        <cbc:Note>Payment within 30 days of the invoice date.</cbc:Note>
    </cac:PaymentTerms>
    <cac:TaxTotal>
        <cbc:TaxAmount currencyID="GBP">148.00</cbc:TaxAmount>
        <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="GBP">740.00</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="GBP">148.00</cbc:TaxAmount>
            <cac:TaxCategory>
                <cbc:ID>S</cbc:ID>
                <cbc:Percent>20</cbc:Percent>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:TaxCategory>
        </cac:TaxSubtotal>
    </cac:TaxTotal>
    <cac:LegalMonetaryTotal>
        <cbc:LineExtensionAmount currencyID="GBP">740.00</cbc:LineExtensionAmount>
        <cbc:TaxExclusiveAmount currencyID="GBP">740.00</cbc:TaxExclusiveAmount>
        <cbc:TaxInclusiveAmount currencyID="GBP">888.00</cbc:TaxInclusiveAmount>
        <cbc:PayableAmount currencyID="GBP">888.00</cbc:PayableAmount>
    </cac:LegalMonetaryTotal>
    <cac:InvoiceLine>
        <cbc:ID>1</cbc:ID>
        <cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
        <cbc:LineExtensionAmount currencyID="GBP">500.00</cbc:LineExtensionAmount>
        <cac:Item>
            <cbc:Description>Example widget, standard finish</cbc:Description>
            <cbc:Name>Example widget</cbc:Name>
            <cac:SellersItemIdentification>
                <cbc:ID>EX-WIDGET-01</cbc:ID>
            </cac:SellersItemIdentification>
            <cac:ClassifiedTaxCategory>
                <cbc:ID>S</cbc:ID>
                <cbc:Percent>20</cbc:Percent>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:ClassifiedTaxCategory>
        </cac:Item>
        <cac:Price>
            <cbc:PriceAmount currencyID="GBP">50.00</cbc:PriceAmount>
        </cac:Price>
    </cac:InvoiceLine>
    <cac:InvoiceLine>
        <cbc:ID>2</cbc:ID>
        <cbc:InvoicedQuantity unitCode="HUR">2</cbc:InvoicedQuantity>
        <cbc:LineExtensionAmount currencyID="GBP">240.00</cbc:LineExtensionAmount>
        <cac:Item>
            <cbc:Description>Installation of example widgets, per hour</cbc:Description>
            <cbc:Name>Installation service</cbc:Name>
            <cac:SellersItemIdentification>
                <cbc:ID>EX-INSTALL-01</cbc:ID>
            </cac:SellersItemIdentification>
            <cac:ClassifiedTaxCategory>
                <cbc:ID>S</cbc:ID>
                <cbc:Percent>20</cbc:Percent>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:ClassifiedTaxCategory>
        </cac:Item>
        <cac:Price>
            <cbc:PriceAmount currencyID="GBP">120.00</cbc:PriceAmount>
        </cac:Price>
    </cac:InvoiceLine>
</Invoice>
<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>EX-2026-0001</cbc:ID>
<cbc:IssueDate>2026-06-15</cbc:IssueDate>
<cbc:DueDate>2026-07-15</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:Note>Fictional sample invoice for the Ironfang Peppol validator.</cbc:Note>
<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<cbc:BuyerReference>PO-EXAMPLE-0001</cbc:BuyerReference>
  • CustomizationID sagt, welcher Spezifikation die Rechnung folgt. Dieser Wert ist Peppol BIS Billing 3.0 auf dem Kern der EN 16931; der Validator wählt damit das Regelwerk, und ein empfangender Access Point erkennt daran, was er vor sich hat.
  • ProfileID nennt den Geschäftsprozess, hier den Peppol-Abrechnungsprozess 01.
  • ID, IssueDate und DueDate sind Rechnungsnummer und Datumsangaben, Datumsangaben immer in der Form YYYY-MM-DD. InvoiceTypeCode 380 ist eine Handelsrechnung; eine Gutschrift wird normalerweise als eigenes CreditNote-Dokument gesendet.
  • DocumentCurrencyCode ist die Währung, in der jeder Betrag angegeben ist, und jeder Betrag wiederholt sie in einem Attribut currencyID.
  • BuyerReference ist die Referenz, die der Käufer von Ihnen angegeben haben möchte. Peppol verlangt entweder sie oder eine Bestellreferenz (PEPPOL-EN16931-R003).

Verkäufer, Käufer und elektronische Adressen

<cac:AccountingSupplierParty>
    <cac:Party>
        <cbc:EndpointID schemeID="0088">9520000000011</cbc:EndpointID>
        <cac:PartyIdentification>
            <cbc:ID schemeID="0088">9520000000011</cbc:ID>
        </cac:PartyIdentification>
        <cac:PartyName>
            <cbc:Name>Example Supplier Ltd</cbc:Name>
        </cac:PartyName>
        <cac:PostalAddress>
            <cbc:StreetName>1 Example Street</cbc:StreetName>
            <cbc:CityName>Exampleton</cbc:CityName>
            <cbc:PostalZone>EX1 1EX</cbc:PostalZone>
            <cac:Country>
                <cbc:IdentificationCode>GB</cbc:IdentificationCode>
            </cac:Country>
        </cac:PostalAddress>
        <cac:PartyTaxScheme>
            <cbc:CompanyID>GB000000000</cbc:CompanyID>
            <cac:TaxScheme>
                <cbc:ID>VAT</cbc:ID>
            </cac:TaxScheme>
        </cac:PartyTaxScheme>
        <cac:PartyLegalEntity>
            <cbc:RegistrationName>Example Supplier Ltd</cbc:RegistrationName>
        </cac:PartyLegalEntity>
        <cac:Contact>
            <cbc:Name>Accounts</cbc:Name>
            <cbc:ElectronicMail>accounts@supplier.example.test</cbc:ElectronicMail>
        </cac:Contact>
    </cac:Party>
</cac:AccountingSupplierParty>
  • EndpointID ist die elektronische Adresse des Beteiligten im Peppol-Netz: wohin ein Dokument für ihn zugestellt wird. Beide Beteiligten müssen eine haben (PEPPOL-EN16931-R020 für den Verkäufer, PEPPOL-EN16931-R010 für den Käufer), und jede muss in schemeID angeben, welches Kennungsschema sie verwendet (BR-62, BR-63).
  • Das Schema 0088 ist eine GS1 Global Location Number aus der Codeliste Electronic Address Scheme. Echte Rechnungen verwenden oft stattdessen ein nationales Schema für Unternehmens- oder Umsatzsteuernummern; verwenden Sie das Schema und den Wert, die Ihr Access Point für Sie registriert hat.
  • PartyTaxScheme enthält die Umsatzsteuer-ID des Verkäufers und PartyLegalEntity den eingetragenen Namen des Unternehmens. PartyIdentification ist eine optionale weitere Kennung.

Der Käufer ist genauso aufgebaut, mit seiner eigenen Adresse:

<cbc:EndpointID schemeID="0088">9520000000028</cbc:EndpointID>

Rechnungspositionen

<cac:InvoiceLine>
    <cbc:ID>1</cbc:ID>
    <cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="GBP">500.00</cbc:LineExtensionAmount>
    <cac:Item>
        <cbc:Description>Example widget, standard finish</cbc:Description>
        <cbc:Name>Example widget</cbc:Name>
        <cac:SellersItemIdentification>
            <cbc:ID>EX-WIDGET-01</cbc:ID>
        </cac:SellersItemIdentification>
        <cac:ClassifiedTaxCategory>
            <cbc:ID>S</cbc:ID>
            <cbc:Percent>20</cbc:Percent>
            <cac:TaxScheme>
                <cbc:ID>VAT</cbc:ID>
            </cac:TaxScheme>
        </cac:ClassifiedTaxCategory>
    </cac:Item>
    <cac:Price>
        <cbc:PriceAmount currencyID="GBP">50.00</cbc:PriceAmount>
    </cac:Price>
</cac:InvoiceLine>

Jede Position hat eine Menge mit einer Einheit aus der UN/ECE-Empfehlung 20 (C62 bedeutet eine Einheit, HUR eine Stunde), einen Nettobetrag, den Artikel mit seiner Umsatzsteuerkategorie und den Stückpreis. Die Kategorie S ist der Normalsatz, hier 20 Prozent. Der Nettobetrag der Position ist Menge mal Preis, ohne Nachlässe oder Zuschläge auf diesen Positionen.

Berechnung der Rechnungspositionen
PositionArtikelMengePreisNettobetrag
1Example widget10 Einheiten (C62)50.0010 x 50.00 = 500.00
2Installation service2 Stunden (HUR)120.002 x 120.00 = 240.00

Umsatzsteueraufschlüsselung und Dokumentsummen

<cac:TaxTotal>
    <cbc:TaxAmount currencyID="GBP">148.00</cbc:TaxAmount>
    <cac:TaxSubtotal>
        <cbc:TaxableAmount currencyID="GBP">740.00</cbc:TaxableAmount>
        <cbc:TaxAmount currencyID="GBP">148.00</cbc:TaxAmount>
        <cac:TaxCategory>
            <cbc:ID>S</cbc:ID>
            <cbc:Percent>20</cbc:Percent>
            <cac:TaxScheme>
                <cbc:ID>VAT</cbc:ID>
            </cac:TaxScheme>
        </cac:TaxCategory>
    </cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="GBP">740.00</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="GBP">740.00</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="GBP">888.00</cbc:TaxInclusiveAmount>
    <cbc:PayableAmount currencyID="GBP">888.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Jede Summe lässt sich aus den Positionen berechnen, und die Regeln der EN 16931 prüfen jeden Schritt:

Wie die Summen aufgehen
FeldBerechnungGBPRegel
LineExtensionAmount500.00 + 240.00740.00BR-CO-10
TaxExclusiveAmountSumme der Positionen, abzüglich Nachlässen und zuzüglich Zuschlägen auf Dokumentenebene (hier keine)740.00BR-CO-13
TaxableAmount (S, 20%)Netto der Positionen in Kategorie S740.00BR-S-08
TaxAmount (S, 20%)740.00 x 20%, auf zwei Nachkommastellen gerundet148.00BR-S-09
TaxTotal/TaxAmountSumme der Steuerbeträge der Aufschlüsselung148.00BR-CO-14
TaxInclusiveAmount740.00 + 148.00888.00BR-CO-15
PayableAmountSumme mit Umsatzsteuer, abzüglich Vorauszahlung, zuzüglich Rundung (hier beides nicht)888.00BR-CO-16

Berechnen Sie diese Werte mit Dezimalarithmetik, nicht mit Gleitkommazahlen, und runden Sie jeden Betrag auf zwei Nachkommastellen, wo die Regeln es verlangen. Eine Summe aus binären Gleitkommazahlen kann um einen Penny danebenliegen, und das reicht, um durchzufallen. Der englischsprachige Artikel Understanding EN 16931 validation errors erklärt die Rechenregeln ausführlicher.

Zahlungsangaben

<cac:PaymentMeans>
    <cbc:PaymentMeansCode name="Credit transfer">30</cbc:PaymentMeansCode>
    <cbc:PaymentID>EX-2026-0001</cbc:PaymentID>
    <cac:PayeeFinancialAccount>
        <cbc:ID>EXAMPLE-ACCOUNT-0001</cbc:ID>
        <cbc:Name>Example Supplier Ltd</cbc:Name>
    </cac:PayeeFinancialAccount>
</cac:PaymentMeans>
<cac:PaymentTerms>
    <cbc:Note>Payment within 30 days of the invoice date.</cbc:Note>
</cac:PaymentTerms>

Der Code 30 für das Zahlungsmittel steht für eine Überweisung. PaymentID ist die Referenz, die der Käufer bei der Zahlung angeben soll, und PayeeFinancialAccount/ID das Konto, auf das gezahlt wird: eine IBAN oder die Kontokennung, die Ihre Bankverbindung verwendet. Das Konto in diesem Beispiel ist ein Platzhalter, kein Bankkonto.

Eine fehlerhafte Kopie und die Korrektur

Das zweite Beispiel ist dieselbe Rechnung mit einer geänderten Zahl: Die Summe der Positionen im Dokument lautet 750.00, während die beiden Positionen zusammen 740.00 ergeben.

<cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="GBP">750.00</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="GBP">740.00</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="GBP">888.00</cbc:TaxInclusiveAmount>
    <cbc:PayableAmount currencyID="GBP">888.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Am selben Tag mit demselben Regelwerk geprüft, ist es ungültig, mit genau zwei Befunden, beide der Stufe Fehler und beide im Prüfschritt EN 16931:

  • BR-CO-10: Die Summe der Positionen (750.00) ist nicht die Summe der Nettobeträge der Positionen (740.00).
  • BR-CO-13: Die Summe ohne Umsatzsteuer (740.00) ist nicht mehr die Summe der Positionen abzüglich Nachlässen zuzüglich Zuschlägen (750.00).

Ein falsches Feld erzeugt zwei Befunde, weil eine zweite Regel vom selben Wert abhängt. Die Summe mit Umsatzsteuer und der fällige Betrag stimmen weiterhin miteinander überein, deshalb schlägt keine weitere Regel an. Die Korrektur besteht darin, die richtige Summe, 740.00, wieder in LegalMonetaryTotal/LineExtensionAmount einzutragen: Das ist das gültige Beispiel oben.

An eine echte Rechnung anpassen

  • Ersetzen Sie beide Beteiligten, einschließlich jeder EndpointID und ihrer schemeID, durch die Kennungen, die für den echten Verkäufer und Käufer registriert sind.
  • Verwenden Sie Ihre echte Umsatzsteuer-ID, Rechnungsnummer, Datumsangaben, Käufer- oder Bestellreferenz und Ihr Zahlungskonto.
  • Wählen Sie die Umsatzsteuerkategorie und den Satz, die für jede Position gelten. Andere Kategorien als S (Nullsatz, steuerbefreit, Steuerschuldnerschaft des Leistungsempfängers und weitere) bringen eigene Regeln mit; dieses Beispiel deckt sie nicht ab, und welche gilt, ist eine steuerliche Frage für Ihre Steuerberatung.
  • Fügen Sie Nachlässe oder Zuschläge auf Dokumentenebene nur mit ihren Summen und ihrer steuerlichen Wirkung hinzu, damit die Berechnungen oben weiterhin aufgehen.
  • Verwenden Sie durchgehend eine Währung, und prüfen Sie jede Änderung, bevor Sie die Rechnung senden.

Ein gültiges Ergebnis bedeutet, dass das Dokument das UBL-Schema und die Regeln von EN 16931 und Peppol BIS Billing für die angegebene Version bestanden hat. Es sendet die Rechnung nicht, registriert niemanden im Peppol-Netz, beweist nicht, dass ein Empfänger sie annimmt, und bescheinigt sie nicht für steuerliche Zwecke. Die Zustellung erfolgt über einen Peppol Access Point. Der englischsprachige Artikel How Peppol invoice validation actually works erklärt die Prüfschritte, die ein Dokument durchläuft.

Aus Code validieren

Der Validator auf der Website ist ohne Konto kostenlos. Um Dokumente aus Ihrem eigenen System zu prüfen, senden Sie dieselben Bytes an die Validierungs-API, mit einem Ironfang-API-Schlüssel mit der Berechtigung finance:einvoices:write:

curl --fail-with-body https://api.ironfang.uk/finance/v1/einvoices/validate \
      -H "Authorization: Bearer $IRONFANG_API_KEY" \
      -H 'Content-Type: application/xml' \
      --data-binary @peppol-bis-billing-3-invoice.xml

Die Antwort ist JSON mit dem Ergebnis, dem Regelwerk, einem Status für jeden Prüfschritt und jedem Befund mit seiner Regelkennung. Der Leitfaden zur Finance-API behandelt Berechtigungen, Grenzen und gespeicherte Ergebnisse, die Regelreferenz erklärt Befunde Regel für Regel, und die Erzeugung aus JSON baut Dokumente wie dieses für Sie, geprüft, bevor sie zurückgegeben werden; im JSON-Playground für Rechnungen können Sie das ohne Konto ausprobieren.