ZUGFeRD · Shopify basics

ZUGFeRD for Shopify: the PDF invoice with the data inside it

Last updated 16 August 2026

ZUGFeRD is the format that lets you keep sending an invoice people can actually read. It looks like an ordinary PDF — logo, layout, totals — but a structured XML invoice is hidden inside the file, so your buyer's accounting software can book it without anyone re-typing a line. This is a plain-English explainer for Shopify merchants: what ZUGFeRD is, how it differs from XRechnung and Peppol, which profile to send, and what it takes to produce a valid one from a Shopify order.

What ZUGFeRD actually is

ZUGFeRD is a hybrid e-invoice format maintained by FeRD, the German forum for electronic invoicing. One file does two jobs:

Since version 2.x, ZUGFeRD is technically aligned with the French Factur-X format — the same hybrid approach under a different name — so a single implementation covers both markets. See our EN 16931 explainer for the data model underneath.

In one line: ZUGFeRD is an e-invoice wearing a PDF. XRechnung is the same invoice data with the PDF taken away; Peppol is a way to deliver either one.

ZUGFeRD vs XRechnung vs Peppol

These names get treated as competing options. They aren't — they sit at different layers, and a German B2B invoice usually involves more than one:

NameWhat it is
EN 16931The European semantic standardwhat data an invoice must carry. Everything below is built on it.
ZUGFeRDA hybrid format: PDF/A-3 with EN 16931 XML (CII) embedded inside. Human-readable and machine-readable in one file. The everyday B2B choice.
XRechnungGermany's pure-XML profile of EN 16931 — no PDF, machine-only, required by public bodies. See XRechnung for Shopify.
Peppol BIS Billing 3.0Another profile of EN 16931, in UBL — the document shape used on the Peppol network.
Peppol (the network)Not a format — the delivery route. ZUGFeRD is usually emailed, but it can travel other ways too.

When a Shopify merchant needs ZUGFeRD

Which profile to send

ZUGFeRD ships several profiles — how much of the invoice is in the XML. Picking the wrong one is the most common way a merchant ends up with a file that looks fine and isn't compliant:

ProfileWhat it's for
Minimum / Basic WLHeader totals only, no full line items. Useful for booking aids — not a compliant e-invoice under the German rules on its own.
BasicLine items included, but a restricted subset of EN 16931. Fine for simple cases, short of the full standard.
EN 16931 (Comfort)The one to send for German B2B. A complete EN 16931 invoice — this is what "ZUGFeRD-compliant" should mean for a Shopify store.
XRechnungThe German public-sector profile carried in the ZUGFeRD family. Needed when you invoice public bodies, with a Leitweg-ID.
ExtendedExtra fields for specialised industry flows. More than a Shopify store normally needs.

Can Shopify produce a ZUGFeRD on its own?

No. Shopify emails a PDF, and that PDF is exactly what it looks like — a picture of an invoice. Out of the box Shopify cannot:

That last point is the one that bites. A PDF with an XML file stapled to it is not a ZUGFeRD; it's a PDF with an attachment. That's the gap an e-invoicing app fills.

What a valid ZUGFeRD has to get right

ElementWhy it matters
PDF/A-3 containerNot any PDF. The archival profile is what permits an embedded file and keeps the invoice readable years later.
Correct embeddingThe XML must sit inside the PDF under the expected filename with the right relationship and metadata — otherwise nothing downstream finds it.
Page and data agreeWhat is printed and what is embedded must be the same invoice. A mismatch is a hard failure, and the classic cause is a PDF template edited independently of the data.
Seller & buyer identityLegal names, addresses and VAT numbers (USt-IdNr.) as structured fields, not a block of text on the page.
Line itemsQuantity, unit price, net amount and VAT category per line — structured, not a free-text description.
VAT breakdownTax grouped by rate and category, with the correct code and legal note for reverse charge or exemption.
Totals that reconcileNet, VAT and gross must add up to the cent, in the XML as well as on the page, or validation rejects the invoice.

How a Shopify store sends a ZUGFeRD

StepWhat happens
1 · CaptureCollect the buyer's company name and VAT number at checkout or on the order — a B2B invoice needs a buyer, not just a shipping address.
2 · MapTurn the Shopify order into the EN 16931 core fields under the EN 16931 (Comfort) profile.
3 · Get VAT rightDerive net and VAT correctly — including reverse charge for cross-border B2B — and check the buyer's VAT number against VIES.
4 · Render & embedProduce the human-readable PDF from the same data, as PDF/A-3, and embed the XML inside it.
5 · ValidateRun the file against the EN 16931 and ZUGFeRD rules so it passes before it is ever sent.
6 · DeliverEmail it — the normal route for ZUGFeRD — or send it over a Peppol Access Point if that is what the buyer expects, and track the outcome.

The part everyone underestimates: VAT correctness

ZUGFeRD is friendlier than XRechnung to look at, and just as unforgiving underneath. The embedded invoice is checked to the cent, and it is checked against the page — if net, VAT and gross don't reconcile, the invoice is rejected, and a rejected invoice that was legally required is a sale that hasn't been billed. Getting clean figures out of Shopify is harder than it looks: whether your prices include or exclude tax changes how net and VAT are derived, rounding across many lines can leave you a cent out, and selling to a VAT-registered business in another EU country usually means reverse charge — 0% VAT with the right category code and legal note on the face of the invoice. Producing a valid hybrid file is only half the job; the numbers inside it have to be right too.

Frequently asked questions

What is ZUGFeRD?

Germany's hybrid e-invoice format: a PDF/A-3 invoice a person can read, with an EN 16931 XML invoice embedded inside it so software can book the data directly. It's maintained by FeRD and technically aligned with the French Factur-X format.

Can Shopify create a ZUGFeRD invoice?

No. Shopify's order confirmations and PDF invoices are plain PDFs — no embedded EN 16931 XML, no PDF/A-3 container, no validation. You add ZUGFeRD output with an app that maps the order to EN 16931 data, renders a matching PDF and embeds the XML correctly.

What's the difference between ZUGFeRD and XRechnung?

Both carry an EN 16931 invoice, packaged differently. ZUGFeRD is hybrid — a readable PDF with the XML embedded — and suits ordinary B2B. XRechnung is pure XML with no PDF and is what German public bodies require. Many German merchants need both, because the buyer decides.

Which ZUGFeRD profile should I send?

The EN 16931 profile — previously called Comfort. Minimum and Basic WL aren't valid e-invoices under the German rules on their own, the XRechnung profile targets public-sector buyers, and Extended adds industry fields a Shopify store rarely needs.

Is a ZUGFeRD file just a PDF invoice?

It looks like one — that's the point — but a plain PDF isn't a ZUGFeRD. It has to be PDF/A-3 with the EN 16931 XML attached inside under the expected filename, and the numbers in the XML must match what's printed on the page.

How do I send a ZUGFeRD invoice from a Shopify store?

Capture the buyer's company details and VAT number; map the order to the EN 16931 fields; get the VAT right including reverse charge; render the PDF from the same data and embed the XML as PDF/A-3; validate; then send by email, or over Peppol if the buyer prefers.

This guide is general information for Shopify merchants, not legal or tax advice. Rules, mandates and thresholds vary by country and change over time — confirm your obligations with a qualified tax adviser.

E-invoices from your Shopify B2B orders

Zeppol turns every B2B order into an EN 16931 document, checks it against the EU and the German rules, and sends it over Peppol or by email. Join the list and I'll be in touch before the deadline.