ZUGFeRD-Rechnung: Beispiel mit PDF-Ansicht und XML erklärt

Wie eine ZUGFeRD-Rechnung aussieht: eine vollständige Beispielrechnung als lesbarer Beleg und als XML-Ausschnitt, die wichtigsten Felder erklärt, offizielle Beispieldateien.

Pennio RedaktionFachlich geprüft12. September 2026Aktualisiert: 12.9.2026

Wie sieht eine ZUGFeRD-Rechnung eigentlich aus? Die kurze Antwort: wie jede andere PDF-Rechnung. Die lange Antwort ist interessanter, denn in derselben Datei steckt eine zweite Rechnung, die kein Mensch liest – und die für das Finanzamt und die Buchhaltungssoftware Ihres Kunden die eigentliche ist. Dieser Artikel zeigt beide Seiten an einer durchgängigen Beispielrechnung: erst den Beleg, wie er auf dem Bildschirm erscheint, dann das XML, das darunter liegt, Feld für Feld erklärt.

Was Sie sehen und was drinsteckt

Eine ZUGFeRD-Datei hat zwei Ebenen. Die PDF/A-3 ist die Ansicht: Briefkopf, Anschrift, Positionen, Summen. Sie öffnen sie mit jedem PDF-Reader. Das eingebettete XML namens factur-x.xml ist der Datensatz: dieselben Angaben in benannten Feldern nach der Norm EN 16931, in der Syntax UN/CEFACT CII.

Beide müssen übereinstimmen. Steht in der PDF 902,02 Euro und im XML 902,00, ist die Rechnung fehlerhaft – und das BMF hat im Schreiben vom 15. Oktober 2024 festgelegt, dass in diesem Fall das XML gilt. Wie das Format aufgebaut ist und welche Versionen und Profile es gibt, erklärt der Artikel ZUGFeRD-Format und Versionen; die Grundlagen stehen im Leitfaden ZUGFeRD.

Die Beispielrechnung

Ein fiktiver Elektrobetrieb stellt einem Gewerbekunden eine Installation in Rechnung. Zwei Positionen, Regelbesteuerung mit 19 Prozent, Zahlungsziel 14 Tage. So sieht der sichtbare Teil aus:

Meier Elektrotechnik · Ludwigstraße 12 · 86150 Augsburg · USt-IdNr. DE123456789 · rechnung@meier-elektrotechnik.example

An: Bauer GmbH · Industriestraße 7 · 86199 Augsburg

Rechnung Nr. 0018-2609-BAUER · Rechnungsdatum: 11.09.2026 · Leistungsdatum: 09.09.2026

Pos.BezeichnungMengeEinzelpreisGesamt
1Installation Unterverteilung8 Std.85,00 €680,00 €
2Leitungsschutzschalter B1612 Stk.6,50 €78,00 €

Nettobetrag 758,00 € · Umsatzsteuer 19 % 144,02 € · Rechnungsbetrag 902,02 €

Zahlbar bis 25.09.2026 per Überweisung auf DE02 1203 0000 0000 2020 51.

Die Rechnungsnummer 0018-2609-BAUER liest sich so: laufende Nummer 18, ausgestellt im September 2026, Kunde Bauer. Die laufende Nummer vorn ist firmenweit fortlaufend; das Kürzel hinten ist Zusatzinformation, die § 14 UStG ausdrücklich erlaubt. Warum das praktisch ist, erklärt der Artikel Rechnungsnummer pro Kunde.

Alle Beträge gehen auf: 8 × 85,00 = 680,00; 12 × 6,50 = 78,00; Summe 758,00; davon 19 Prozent sind 144,02; zusammen 902,02. Das ist keine Nebensache – der Validator rechnet genau das nach.

Dasselbe als XML

Hier der eingebettete Datensatz, gekürzt auf die tragenden Elemente. Der vollständige Baum ist etwa doppelt so lang; ausgelassen sind die zweite Position, Adressen und Bankverbindung.

<?xml version="1.0" encoding="UTF-8"?>
<rsm:CrossIndustryInvoice
    xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100"
    xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100"
    xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100">

  <rsm:ExchangedDocumentContext>
    <ram:GuidelineSpecifiedDocumentContextParameter>
      <ram:ID>urn:cen.eu:en16931:2017</ram:ID>
    </ram:GuidelineSpecifiedDocumentContextParameter>
  </rsm:ExchangedDocumentContext>

  <rsm:ExchangedDocument>
    <ram:ID>0018-2609-BAUER</ram:ID>
    <ram:TypeCode>380</ram:TypeCode>
    <ram:IssueDateTime>
      <udt:DateTimeString format="102">20260911</udt:DateTimeString>
    </ram:IssueDateTime>
  </rsm:ExchangedDocument>

  <rsm:SupplyChainTradeTransaction>

    <ram:IncludedSupplyChainTradeLineItem>
      <ram:AssociatedDocumentLineDocument>
        <ram:LineID>1</ram:LineID>
      </ram:AssociatedDocumentLineDocument>
      <ram:SpecifiedTradeProduct>
        <ram:Name>Installation Unterverteilung</ram:Name>
      </ram:SpecifiedTradeProduct>
      <ram:SpecifiedLineTradeAgreement>
        <ram:NetPriceProductTradePrice>
          <ram:ChargeAmount>85.00</ram:ChargeAmount>
        </ram:NetPriceProductTradePrice>
      </ram:SpecifiedLineTradeAgreement>
      <ram:SpecifiedLineTradeDelivery>
        <ram:BilledQuantity unitCode="HUR">8.00</ram:BilledQuantity>
      </ram:SpecifiedLineTradeDelivery>
      <ram:SpecifiedLineTradeSettlement>
        <ram:ApplicableTradeTax>
          <ram:TypeCode>VAT</ram:TypeCode>
          <ram:CategoryCode>S</ram:CategoryCode>
          <ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
        </ram:ApplicableTradeTax>
        <ram:SpecifiedTradeSettlementLineMonetarySummation>
          <ram:LineTotalAmount>680.00</ram:LineTotalAmount>
        </ram:SpecifiedTradeSettlementLineMonetarySummation>
      </ram:SpecifiedLineTradeSettlement>
    </ram:IncludedSupplyChainTradeLineItem>

    <!-- Position 2 (Leitungsschutzschalter, 12 × 6,50 = 78,00) analog -->

    <ram:ApplicableHeaderTradeAgreement>
      <ram:SellerTradeParty>
        <ram:Name>Meier Elektrotechnik</ram:Name>
        <!-- PostalTradeAddress, E-Mail-Adresse -->
        <ram:SpecifiedTaxRegistration>
          <ram:ID schemeID="VA">DE123456789</ram:ID>
        </ram:SpecifiedTaxRegistration>
      </ram:SellerTradeParty>
      <ram:BuyerTradeParty>
        <ram:Name>Bauer GmbH</ram:Name>
        <!-- PostalTradeAddress, E-Mail-Adresse -->
      </ram:BuyerTradeParty>
    </ram:ApplicableHeaderTradeAgreement>

    <ram:ApplicableHeaderTradeSettlement>
      <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
      <ram:ApplicableTradeTax>
        <ram:CalculatedAmount>144.02</ram:CalculatedAmount>
        <ram:TypeCode>VAT</ram:TypeCode>
        <ram:BasisAmount>758.00</ram:BasisAmount>
        <ram:CategoryCode>S</ram:CategoryCode>
        <ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
      </ram:ApplicableTradeTax>
      <ram:SpecifiedTradePaymentTerms>
        <ram:DueDateDateTime>
          <udt:DateTimeString format="102">20260925</udt:DateTimeString>
        </ram:DueDateDateTime>
      </ram:SpecifiedTradePaymentTerms>
      <ram:SpecifiedTradeSettlementHeaderMonetarySummation>
        <ram:LineTotalAmount>758.00</ram:LineTotalAmount>
        <ram:TaxBasisTotalAmount>758.00</ram:TaxBasisTotalAmount>
        <ram:TaxTotalAmount currencyID="EUR">144.02</ram:TaxTotalAmount>
        <ram:GrandTotalAmount>902.02</ram:GrandTotalAmount>
        <ram:DuePayableAmount>902.02</ram:DuePayableAmount>
      </ram:SpecifiedTradeSettlementHeaderMonetarySummation>
    </ram:ApplicableHeaderTradeSettlement>

  </rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>

Drei Dinge fallen auf. Erstens die Namensräume am Anfang: rsm für das Dokument selbst, ram für die wiederverwendbaren Bausteine (fast alles), udt für einfache Datentypen wie das Datum. Zweitens die Codes statt Wörter: 380 statt „Rechnung", S statt „Regelsteuersatz", HUR statt „Stunde", 20260911 statt „11.09.2026". Drittens die Summen in drei Stufen: Position (LineTotalAmount 680,00), Steueraufschlüsselung (BasisAmount 758,00 → CalculatedAmount 144,02) und Gesamtsumme (GrandTotalAmount 902,02). Alle drei müssen zusammenpassen.

Die vollständige Fassung dieses Beispiels haben wir mit dem Referenzvalidator Mustangproject gegen das Profil EN 16931 geprüft: 89 Regeln, kein Fehler.

Die wichtigsten Felder erklärt

Die EN 16931 gibt jedem Feld eine Nummer, den Business Term (BT). Diese Nummern tauchen in Fehlermeldungen von Validatoren auf – wer sie kennt, versteht die Meldung. Die Felder aus dem Beispiel:

BTBedeutungXML-ElementIm Beispiel
BT-1RechnungsnummerExchangedDocument/ID0018-2609-BAUER
BT-2RechnungsdatumExchangedDocument/IssueDateTime20260911 (Format 102 = JJJJMMTT)
BT-3RechnungstypExchangedDocument/TypeCode380 Rechnung; 381 Gutschrift/Storno
BT-5WährungInvoiceCurrencyCodeEUR
BT-9FälligkeitsdatumSpecifiedTradePaymentTerms/DueDateDateTime20260925
BT-27Name des VerkäufersSellerTradeParty/NameMeier Elektrotechnik
BT-31USt-IdNr. des VerkäufersSpecifiedTaxRegistration/ID mit schemeID="VA"DE123456789
BT-44Name des KäufersBuyerTradeParty/NameBauer GmbH
BT-106Summe der Positionen nettoLineTotalAmount758.00
BT-110Umsatzsteuer gesamtTaxTotalAmount144.02
BT-112Rechnungsbetrag bruttoGrandTotalAmount902.02
BT-115ZahlbetragDuePayableAmount902.02

Die Spezifikation definiert weit mehr Felder – Leistungszeitraum, Leitweg-ID, Rabatte, Vorauszahlungen. Für eine gewöhnliche Rechnung sind die zwölf oben plus Adressen, Positionen und E-Mail-Adressen das, was zählt. Was der Gesetzgeber unabhängig vom Format auf jeder Rechnung verlangt, listet der Artikel Pflichtangaben auf der Rechnung.

Codes, die Sie im XML wiederfinden
  • TypeCode 380 = Rechnung, 381 = Gutschrift (in Deutschland für Stornorechnungen üblich), 384 = korrigierte Rechnung
  • CategoryCode S = Regelsteuersatz, E = steuerbefreit (etwa § 19 UStG, mit Begründungstext), AE = Reverse Charge, K = innergemeinschaftliche Lieferung
  • unitCode H87 = Stück, HUR = Stunde, C62 = Einheit (allgemein), MTR = Meter, KGM = Kilogramm
  • schemeID VA = USt-IdNr., FC = Steuernummer, EM = E-Mail-Adresse

Wo Sie offizielle Beispieldateien finden

Das FeRD liefert mit jeder Spezifikation ein Paket mit Beispieldateien je Profil – vollständige ZUGFeRD-PDFs samt XML, dazu ein Stylesheet, das das XML lesbar anzeigt. Kostenlos nach Registrierung auf ferd-net.de.

Das Mustangproject pflegt auf GitHub eine Sammlung von Testdateien (github.com/ZUGFeRD/corpus): gültige ZUGFeRD- und Factur-X-Dateien in mehreren Versionen und Profilen, außerdem absichtlich fehlerhafte Dateien zum Testen von Validatoren. Die Sammlung versteht sich als Community-Projekt, nicht als offizielle FeRD-Veröffentlichung – zum Lernen und Testen taugt sie trotzdem.

Wie Sie das XML aus einer ZUGFeRD-PDF holen

Sie haben eine ZUGFeRD-Rechnung bekommen und möchten hineinsehen? Drei Wege:

Im PDF-Reader. Öffnen Sie die Datei in einem vollwertigen Reader – Adobe Acrobat Reader, Foxit, PDF-XChange. Der Browser reicht nicht. Klicken Sie auf das Büroklammer-Symbol (Anhänge). Dort liegt factur-x.xml; Sie können es speichern und in einem Texteditor öffnen.

Im Quba-Viewer. Das kostenlose Open-Source-Programm für Windows, macOS und Linux (quba-viewer.org) öffnet die PDF, zeigt die Rechnung an und daneben den XML-Inhalt in lesbarer Form. Die Datei bleibt auf Ihrem Rechner.

Mit Mustangproject. Wer die Kommandozeile nicht scheut, extrahiert das XML mit einem Befehl: java -jar Mustang-CLI-2.24.0.jar --action extract --source rechnung.pdf --out factur-x.xml. Dasselbe Werkzeug prüft die Datei auch – wie, steht im Artikel ZUGFeRD-Validator.

Was das Beispiel für Ihre eigenen Rechnungen heißt

Das XML entsteht nicht aus der PDF, sondern aus den Rechnungsdaten – Kunde, Positionen, Steuersatz, Zahlungsziel. Fehlt eines davon oder ist es nur als Freitext vorhanden („Stück" statt H87, „19 %" statt 19.00), kann kein normkonformes XML entstehen. Deshalb gehört die Prüfung der Pflichtfelder an den Anfang, nicht ans Ende: Wer die Rechnung erst festschreibt und dann merkt, dass die E-Mail-Adresse des Kunden fehlt, kann sie nur noch stornieren.

Ihre Rechnung als ZUGFeRD – ohne einen Blick ins XML

Pennio erzeugt aus jeder festgeschriebenen Rechnung eine ZUGFeRD-PDF/A-3 mit eingebettetem XML nach EN 16931 und zusätzlich eine XRechnung. Pflichtfelder werden vor dem Festschreiben geprüft, die Dateien gegen Mustangproject und den KoSIT-Validator validiert.

7 Tage kostenlos testen

Keine Kreditkarte nötig

Häufige Fragen

Wie sieht eine ZUGFeRD-Rechnung aus?
Von außen wie jede PDF-Rechnung. Der Unterschied liegt im Anhang: eine Datei factur-x.xml mit denselben Rechnungsdaten in strukturierter Form. Sichtbar wird sie über das Anhang-Symbol eines PDF-Readers oder im Quba-Viewer.
Kann ich das XML einer ZUGFeRD-Rechnung selbst lesen?
Ja, es ist Klartext. Die Elementnamen sind englisch und lang, aber sprechend: GrandTotalAmount ist der Bruttobetrag, DueDateDateTime das Fälligkeitsdatum. Ein Viewer zeigt dieselben Daten lesbarer an.
Was bedeutet TypeCode 380?
Den Belegtyp „Rechnung" nach der UN/CEFACT-Codeliste 1001. Stornorechnungen tragen meist 381 (Gutschrift), korrigierte Rechnungen 384.
Warum stehen im XML Codes statt Wörter?
Damit Programme in jedem Land dasselbe verstehen. HUR ist überall eine Stunde, „Std." nicht. Die Codelisten stammen von den Vereinten Nationen (UN/ECE) und werden von der EU gepflegt.
Muss die Rechnungsnummer im XML dieselbe sein wie in der PDF?
Ja, wie jedes andere Feld. Weichen PDF und XML ab, ist die Rechnung fehlerhaft; laut BMF gilt dann der XML-Wert.
Wo bekomme ich eine ZUGFeRD-Beispieldatei zum Testen?
Im Spezifikationspaket des FeRD (ferd-net.de, kostenlos nach Registrierung) oder in der Testsammlung des Mustangproject auf GitHub. Beide enthalten Dateien je Profil und Version.

Stand: September 2026. Quellen: EN 16931, ZUGFeRD-Spezifikation 2.5 (FeRD), UN/CEFACT Cross Industry Invoice, § 14 Abs. 4 UStG, BMF-Schreiben vom 15. Oktober 2024.

Pennio Redaktion Fachlich geprüft

Die Pennio Redaktion schreibt über E-Rechnung, Rechnungsstellung und Umsatzsteuerrecht. Grundlage sind die aktuellen Gesetzestexte, die Norm EN 16931, die Spezifikationen von XRechnung und ZUGFeRD sowie die Veröffentlichungen des Bundesfinanzministeriums. Wir bauen selbst E-Rechnungs-Software und prüfen jede Aussage an den offiziellen Validatoren.

Verwandte Artikel

Das könnte Sie auch interessieren

E-Rechnungen schreiben mit Pennio

ZUGFeRD und XRechnung aus jeder Rechnung, mit Nummern, die Ihre Kunden kennen. 7 Tage kostenlos.

Jetzt kostenlos starten