In short
For businesses in Germany, ZUGFeRD in the EN 16931 profile is the most convenient choice: a readable PDF with embedded XML. German authorities require XRechnung with a Leitweg-ID. Peppol is a delivery network, mainly for recipients abroad who are registered there. Consumers, small invoices up to €250 and customers outside the EU get a regular PDF. Quittio makes this choice automatically.
What the three have in common
All three are based on the European standard EN 16931. It defines what an electronic invoice contains: seller, buyer, lines, VAT, totals, payment. Every field has a number, such as BT-1 for the invoice number or BT-10 for the buyer reference.
Technically there are two notations (syntaxes) for the same data: CII (Cross Industry Invoice) and UBL (Universal Business Language). The formats differ in the syntax they use, whether a PDF is included and which additional rules apply.
| Format | What it is | Typical recipient |
|---|---|---|
| ZUGFeRD / Factur-X | PDF/A-3 with embedded CII XML. People read the PDF, software reads the XML. ZUGFeRD (Germany) and Factur-X (France) are the same standard. | Businesses |
| XRechnung | The German standard for public buyers: XML only, in CII or UBL, with additional German rules (BR-DE) | German authorities |
| Peppol BIS Billing 3.0 | UBL XML delivered over the Peppol network, an international network for e-invoices | Businesses and authorities connected to Peppol |
| CII, UBL | Plain XML in either syntax | Recipients that ask for exactly that |
| A PDF without XML (PDF/A-3 for archiving) | Consumers, small invoices, countries without a mandate |
The decision in one table
What matters is who receives the invoice. For a seller in Germany:
| Your customer | Format | Why |
|---|---|---|
| Business in Germany | ZUGFeRD (EN 16931) | An e-invoice under German VAT law and a readable PDF |
| German public authority | XRechnung (CII) | Required by public buyers; the Leitweg-ID goes into the buyer reference |
| Consumer | No e-invoicing mandate | |
| Small invoice up to €250 gross | Small invoices are exempt (sec. 33 UStDV) | |
| Business in another EU country | ZUGFeRD (EN 16931) | Readable PDF with standard XML |
| Business reachable via Peppol | Peppol BIS | Delivery over the Peppol network |
| Customer outside the EU | No EU rules |
Businesses in Germany: ZUGFeRD
For invoices to businesses in Germany, XRechnung and ZUGFeRD from version 2.0.1 count as e-invoices, ZUGFeRD in the profiles BASIC, EN 16931, EXTENDED and XRECHNUNG. Both formats are allowed. ZUGFeRD has a practical advantage: recipients who do not process invoices automatically yet can simply read the PDF.
Quittio uses the EN 16931 profile, the complete standard. The smaller profiles MINIMUM and BASIC WL are not enough; the guide ZUGFeRD profiles explained explains why.
XRechnung to businesses?
That works too. Some businesses prefer plain XML because their accounting software imports it directly. If in doubt, ask what your customer processes and set the format accordingly.
German authorities: XRechnung with Leitweg-ID
Public buyers in Germany require XRechnung. Every authority has a Leitweg-ID, its routing address for invoices. It goes into the invoice as buyer reference (BT-10). If it is missing, Quittio reports rule BR-DE-15.
Quittio recognises authorities by a valid Leitweg-ID in the buyer reference or an electronic address with scheme 0204 and then chooses xrechnung-cii automatically. XRechnung also requires electronic addresses for seller and buyer, a seller contact and payment instructions.
Peppol: a network, not a domestic file format
Peppol is first of all a delivery network. Participants are reachable through a Peppol ID; invoices travel via certified access points. The file format inside is Peppol BIS Billing 3.0, UBL according to EN 16931 with its own rules.
Peppol is not mandatory in Germany. It becomes relevant when customers abroad receive invoices via Peppol. Quittio creates the valid file; your access point provider handles delivery. A dedicated package for sending (quittio/peppol) is on the roadmap.
For Quittio to choose Peppol automatically, pass a lookup that checks whether the buyer is reachable in the network. Quittio does not ship a lookup service of its own:
use Quittio\Core\Data\Party\BuyerParty;
use Quittio\Core\Formats\DefaultFormatResolver;
use Quittio\Core\Quittio;
use Quittio\Country\DE\CountryDE;
$quittio = Quittio::create($config, [new CountryDE], formatResolver: new DefaultFormatResolver(
defaultProfile: 'en16931',
autoUpgradeProfile: true,
peppolLookup: fn (BuyerParty $buyer): bool => $directory->isRegistered($buyer->electronicAddress),
));Consumers, small amounts, abroad
- Consumers: no e-invoicing mandate. Quittio creates a PDF without XML.
- Small invoices up to €250: exempt. Mark the invoice with
->smallAmount()and a PDF is created. - Customers outside the EU: no EU rules, so a PDF.
$result = Quittio::invoice()
->buyer($customer)
->line('Coffee', netPrice: '3.50')
->smallAmount() // ≤ 250 €
->render(); // → pdfHow Quittio chooses automatically
Without a format, Quittio decides from data you provide anyway: the countries of seller and buyer, whether the buyer is a consumer, and the buyer reference. In this order:
- Domestic invoice with a country rule: in Germany a Leitweg-ID leads to XRechnung, a marked small invoice to PDF.
- Buyer reachable via Peppol (only with a lookup): Peppol.
- Consumer: PDF.
- Other domestic invoices: ZUGFeRD with the EN 16931 profile.
- Cross-border within the EU: the buyer’s country pack rules first, otherwise ZUGFeRD.
- Seller or buyer outside the EU: PDF.
The result tells you what Quittio chose, or you can ask beforehand with prepare():
$result = Quittio::make($invoice)->render(); // no format: automatic choice
$result->format(); // "zugferd"
$result->profile()?->key(); // "en16931"
$prepared = Quittio::make($invoice)->prepare(); // the same decision, without rendering
$prepared->format();Setting a format yourself
If a customer requires a specific format, name it. Every format has its default profile. Several formats from one calculation are possible too, e.g. ZUGFeRD for sending and XRechnung for the customer’s archive:
$result = Quittio::invoice()
->buyer($customer)
->buyerReference('04011000-12345-03') // Leitweg-ID, mandatory for XRechnung
->line('Consulting', netPrice: '120.00')
->render('xrechnung-cii');
// for an invoice you built before
$result = Quittio::make($invoice)->format('peppol')->render();
// several formats, one calculation
$result = Quittio::make($invoice)->formats(['zugferd', 'xrechnung-cii'])->render();
$result->as('xrechnung-cii')->xml();To use the same format for every invoice, set defaults.format in config/quittio.php. The default null means automatic choice.