What is a ZUGFeRD invoice?
A readable document with the invoice data inside it: how the hybrid file is built, which of the six profiles count as an invoice in Germany and why the embedded XML now decides.

Format
ZUGFeRD is a hybrid invoice format: a PDF/A-3 document that a person reads, with a structured XML file embedded inside it that a system processes. It is developed by the Forum elektronische Rechnung Deutschland, FeRD, with the support of the Federal Ministry for Economic Affairs and Energy, and it is free to use. The data model follows EN 16931 and the XML uses the UN/CEFACT CII syntax.
Two things have changed what the format means in practice. Since 1 January 2025 the embedded XML is the invoice and the visible document is a copy of it, where before the PDF took precedence. And not every profile counts as an invoice: the Federal Ministry of Finance recognises ZUGFeRD from version 2.0.1, with MINIMUM and BASIC WL excluded.
One file, two parts. The container is a PDF/A-3 document, the archiving variant of PDF standardised as ISO 19005-3, which requires among other things that every font used in the visible part is embedded so the document still renders correctly years later. Inside it sits the invoice as XML.
A normal invoice layout that anyone can open and read. It is a copy of the data, not the invoice itself.
UN/CEFACT CII, conforming to a valid profile. One invoice document per PDF, named factur-x.xml or xrechnung.xml.
Both parts have to say the same thing. The tax authority has set no prescribed check for this, so sender and recipient are advised to run their own.
factur-x.xml in the attachments panel on the left. The XML is the invoice, the page around it is the copy.The XML leads. Until 31 December 2024, where the two parts disagreed, the visible document prevailed. With the obligatory e-invoice that relationship was reversed: the structured part is now the leading one, the PDF serves human readability, and for bookkeeping the XML decides. Technical defects against the PDF/A standard are a warning rather than a fatal error, as long as the XML is valid and can be extracted.
From the outside a ZUGFeRD invoice looks like an ordinary invoice PDF, and that is the point of it. The difference sits in the attachment: the same invoice once more, as XML. The example below shows the places a recipient looks at first when checking a ZUGFeRD file.
urn:cen.eu:en16931:2017 stands for the profile EN 16931, also called COMFORT. MINIMUM, BASIC and the reference profile XRECHNUNG each carry their own identifier in the same place.The two layers are supposed to carry the same content, but nothing in the file enforces it. A document can show one amount on the page and carry another one in the embedded XML, and both parts will open without complaint. Since 1 January 2025 it is the XML that is booked, so the visible page is the part you can afford to be wrong the least about.
A viewer that renders the embedded XML rather than the PDF page is the only way to see the difference before the invoice is booked.

A profile determines how much of the data model the XML carries, from a booking aid to a full invoice with extensions. Five are data profiles, the sixth is a reference profile. The column that matters in Germany is whether the profile is a complete invoice under the VAT Act.
EXTENDED does not mean outside EN 16931. It carries the full EN 16931 content and adds structured business information on top, which is why FeRD asks recipients and service providers to recognise and validate it correctly rather than checking it against XRechnung rules.
Section 14 of the VAT Act requires an e-invoice to be issued, transmitted and received in a structured electronic format that permits electronic processing. The Federal Ministry of Finance states that the hybrid format ZUGFeRD from version 2.0.1, with the exception of the profiles MINIMUM and BASIC WL, falls under the permitted formats.
Three consequences follow. A ZUGFeRD file below 2.0.1 is not an e-invoice for this purpose. MINIMUM and BASIC WL remain useful as booking aids but cannot replace an invoice. And EXTENDED, often assumed to be a special case, is permitted, although the parties have to agree on its use beforehand, which is not required for the other profiles.
The obligation itself follows the German calendar: receiving since 1 January 2025, issuing from 1 January 2027 above EUR 800,000 of prior-year turnover and from 1 January 2028 for everyone else. The detail is on e-invoicing in Germany.
The current version is ZUGFeRD 2.5.2, with the information package published on 4 August 2026. The package is free and contains the schema files, XSLT files and code lists that implementers and validation tools build on.
ZUGFeRD handles versions differently from XRechnung, and this is the point most often misunderstood. XRechnung versions are withdrawn: only the version in force may be used. ZUGFeRD specifications have no expiry date, so an older version stays usable as long as it is at least 2.0.1 and the profile is one that counts as an invoice.
The exception is the reference profile XRECHNUNG. Because it carries an XRechnung, its form and content have to follow the XRechnung specification that is currently valid, which means it inherits the XRechnung version rules.
Factur-X is the French name for the same format. FeRD develops it together with the French forum FNFE-MPE, and since version 2.0 of 24 March 2020 ZUGFeRD and Factur-X are identical in substance. A file produced as ZUGFeRD is readable as Factur-X and the other way round.
The profile names carry both heritages, which is why the same profile appears as EN 16931 in one document and as COMFORT in another. They are the same thing.
Both conform to EN 16931 and both are permitted in Germany. The difference is what arrives and who decides.
One file with a readable document and the data inside it. Useful where the recipient is not fully automated, or where a person has to look at the invoice before it is booked. Common between businesses.
Plain XML in UBL or CII, with German validation rules on top of the European standard. Mandatory towards German public authorities, where the Leitweg-ID also applies.
The two meet in the reference profile: a ZUGFeRD document can carry an XRechnung, which keeps the readable layer while satisfying a recipient that asks for XRechnung. What a validator checks differs, though. A valid ZUGFeRD EN 16931 or EXTENDED invoice can produce errors when it is checked against XRechnung rules alone, without being faulty. Each format has to be validated against its own rule set.
Two details decide more rework than they should.
factur-x.xml or xrechnung.xml.#SKONTO#TAGE=14#PROZENT=2.00#.There is no statutory duty to validate a ZUGFeRD invoice. The Federal Ministry of Finance nevertheless calls it sensible in its FAQ and recommends doing it when the invoice is created and sent. Its letter of 15 October 2025 adds, at marginal number 35a, that a trader exercising the care of a prudent businessman may rely on the technical result of a validation by a suitable application, and that keeping the validation report is advisable.
Our free e-invoice validator takes a ZUGFeRD file, extracts the XML and checks it against the schema, the European business rules and the rules of the profile. The report names the rule and the element behind each finding.
Invoices are kept for eight years under section 14b (1) sentence 1 of the VAT Act. An electronic invoice is retained in the form in which it was received and has to remain machine-evaluable, in line with the GoBD. For ZUGFeRD that means the file as it arrived, PDF and embedded XML together, rather than one of the two parts.
Where the invoice came by e-mail, the e-mail is the envelope and does not have to be kept, unless it carries information belonging to the invoice that is itself subject to retention.
Invoice-Portal produces ZUGFeRD in the profiles that count as an invoice, converts between ZUGFeRD, XRechnung and Peppol BIS, and validates the file before it goes out.
The current version is 2.5.2. Older specifications do not expire, so a file built on an earlier 2.x version remains usable, provided it is at least 2.0.1 and uses a profile that counts as an invoice. New implementations are better built on the current version.
No. Only ZUGFeRD from version 2.0.1 is recognised as an e-invoice, and MINIMUM and BASIC WL are excluded even then. Version 1.0 predates the alignment with EN 16931.
EN 16931, the COMFORT profile. Receipt and processing are mandatory for the buyer, so it travels without a prior arrangement. EXTENDED has to be agreed beforehand, and BASIC is a matter of agreement as well.
Like an ordinary invoice PDF, with the XML file attached inside it. The structure of that XML is shown in the example above, and complete sample documents are published by FeRD under ZUGFeRD example invoices, with further ones in the information package for version 2.5.2.
Since 1 January 2025 the XML is the leading part and decides for bookkeeping. Before that the visible document took precedence. The sender should check that both match before dispatch, and the recipient should visualise and validate the XML rather than reading the PDF alone.
Yes, embedded in the XML as base64 and only in the profiles EN 16931 and EXTENDED. Additionally attaching them to the PDF is possible in every profile, but a recipient that reads only the XML will not see them there.
That depends on the receiving body. German public bodies generally require XRechnung, and the reference profile XRECHNUNG is the way to deliver one inside a ZUGFeRD document. Check the requirement of the authority before sending, and remember that the Leitweg-ID is needed either way.
No. It is a specification that describes how the document is built. Producing, sending, receiving and validating is done by software that implements it, which is why many products carry the ZUGFeRD label.
Upload the PDF, the validator takes the XML out of it and checks it against the profile it declares.
Free and unlimited · the file stays in your browser session
Prefer to talk directly? info@invoice-portal.de · +49 561 56014568
Let us start with the basics.
Three questions, so the first answer is a useful one.
Add a message and send it.