UBL? CII? ZUGFeRD? Factur-X? Anyone diving into e-invoicing for the first time drowns in acronyms.
The good news: there's no chaos behind them – just a surprisingly logical system. You only need to know which format follows which concept.
These formats get confused with each other all the time, even though they pursue completely different ideas. The single most important distinction: UBL and CII are pure XML data formats, while Factur-X and ZUGFeRD are hybrid formats made of PDF plus XML.
The Overview at a Glance
| Format | What is it? | Contains PDF? | XML standard |
|---|---|---|---|
| UBL | XML invoice format | ❌ No | UBL |
| CII | XML invoice format | ❌ No | UN/CEFACT CII |
| Factur-X | PDF + embedded XML | ✅ Yes | CII |
| ZUGFeRD 2.x | PDF + embedded XML | ✅ Yes | CII |
Looks manageable at first glance – and it is. Let's walk through the four formats one by one.
UBL (Universal Business Language)
- Developed by OASIS
- An XML format for many business documents (invoices, orders, delivery notes, etc.)
- Widespread across many European countries
Used, for example, by:
- Peppol BIS Billing
- Denmark
- Norway
- Belgium
- The Netherlands
- Parts of the UK market
Example:
<Invoice>
<cbc:ID>12345</cbc:ID>
...
</Invoice>CII (Cross Industry Invoice)
- Developed by UN/CEFACT
- Also an XML invoice format
- Especially widespread in Germany and France
- EN16931-compliant
Example:
<rsm:CrossIndustryInvoice>
...
</rsm:CrossIndustryInvoice>ZUGFeRD
ZUGFeRD is not an XML format of its own.
It consists of:
- a PDF/A-3
- an embedded XML file
Since ZUGFeRD 2.x, this XML is always a CII file.
So:
PDF
└── embedded XML
└── CIIThe recipient can either:
- read the PDF, or
- import the XML automatically.
That's the whole charm of the hybrid format: human-readable and machine-readable in a single file.
Factur-X
Factur-X is essentially the French sibling of ZUGFeRD.
More precisely: Factur-X and ZUGFeRD 2.x use the exact same technical specification.
They differ mainly in name and marketing:
- France → Factur-X
- Germany → ZUGFeRD
Technically, they are compatible.
Here, too:
PDF/A-3
└── embedded CII XMLWhy Do UBL and CII Exist at All?
The European standard EN16931 does not mandate a specific XML format.
It only defines:
- which fields must be present
- which business rules apply
- which calculations must be correct
For the actual implementation, EN16931 allows two XML syntaxes:
- UBL
- CII
Both can describe the very same invoice. That's exactly why two worlds live side by side – not out of whim, but because the standard permits it.
What Does Germany Use?
Common in Germany today:
- XRechnung → mostly CII, sometimes UBL
- ZUGFeRD → always CII
- Factur-X → always CII
What Does Peppol Use?
Peppol BIS Billing uses by default:
- UBL
That's why many European e-invoicing platforms build on UBL.
Overview
EN16931
│
┌───────────────┴───────────────┐
│ │
UBL XML CII XML
│ │
│ ┌─────┴─────┐
│ │ │
Peppol ZUGFeRD Factur-X
│ │
PDF/A-3 + XML PDF/A-3 + XMLPractical Bonus: Embedding ZUGFeRD XML via a Report Extension
So much for the theory. But how does such a hybrid format actually come to life in Business Central? Simple: you extend your own report. The following report extension automatically attaches the ZUGFeRD XML to the posted sales invoice on PDF export – turning an ordinary PDF into exactly that PDF/A-3 with embedded CII XML we talked about above:
reportextension 50000 "PTE Posted Sales Invoice" extends "Standard Sales - Invoice"
{
trigger OnPreRendering(var RenderingPayload: JsonObject)
begin
AddXMLAttachmentforZUGFeRDExport(RenderingPayload);
end;
local procedure AddXMLAttachmentforZUGFeRDExport(var RenderingPayload: JsonObject)
var
ExportZUGFeRDDocument: Codeunit "Export ZUGFeRD Document";
begin
if CurrReport.TargetFormat() <> ReportFormat::PDF then
exit;
if not ExportZUGFeRDDocument.IsZUGFeRDPrintProcess() then
exit;
ExportZUGFeRDDocument.CreateAndAddXMLAttachmentToRenderingPayload(Header, RenderingPayload);
end;
}The magic sits in the OnPreRendering trigger: the XML is only embedded when it's genuinely a ZUGFeRD print process in PDF format (CurrReport.TargetFormat() = ReportFormat::PDF). Otherwise the report stays untouched. That's the kind of elegance we live for – a few lines of AL, and your standard invoice suddenly speaks ZUGFeRD.
For the compiler to resolve the Export ZUGFeRD Document codeunit, your app needs a dependency on Microsoft's E-Document for Germany app. Add the following entry to the dependencies array in your app.json:
{
"id": "fdeb586e-beff-49d8-947d-1e73ce980b34",
"name": "E-Document for Germany",
"publisher": "Microsoft",
"version": "27.0.0.0"
}The BEYONDIT Take: Concept Beats Acronym
Once you grasp the concept, the acronyms lose their sting. Just remember these two axes:
- Pure XML (UBL, CII) or hybrid PDF + XML (ZUGFeRD, Factur-X)?
- Which XML syntax sits inside – UBL or CII?
Everything else follows from that. ZUGFeRD and Factur-X are technically identical. Peppol thinks in UBL. Germany thinks in CII. And above it all sits EN16931, which permits both syntaxes.
This is exactly where theory turns into practice – and exactly where we love to dig in. If you want to not just receive XML invoices but actually make them readable, our open-source E-Invoice Viewer for Business Central is the companion you're looking for. And if you want to set up XRechnung and ZUGFeRD cleanly in Business Central, we've written a step-by-step guide for exactly that.
These formats aren't rocket science – you just have to slot them into place once.
Wondering which format is the right one for your customers, public authorities, or European partners? We've untangled plenty of these knots already – let's talk.

