Your billing stack knows the invoice. German law needs the XML.
Zugflow listens to invoice.finalized and orders/paid, and returns a hybrid e-invoice: a PDF a person can read, with EN 16931 Cross Industry Invoice XML embedded inside it.
50 documents a month on the free tier. No card.
RECHNUNG
RE-2026-0417
2026-09-13
Von
Altix GmbH
10115 Berlin
DE123456789
An
Cliente SARL
75001 Paris
FR12345678901
- Nettobetrag
- 4,140.00 EUR
- USt. 19%
- 786.60 EUR
- Gesamtbetrag
- 4,926.60 EUR
<rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:..."> <rsm:ExchangedDocumentContext> <ram:ID>urn:cen.eu:en16931:2017</ram:ID> </rsm:ExchangedDocumentContext> <rsm:ExchangedDocument> <ram:ID>RE-2026-0417</ram:ID> <ram:TypeCode>380</ram:TypeCode> </rsm:ExchangedDocument> <ram:ApplicableTradeTax> <ram:CalculatedAmount>786.60</ram:CalculatedAmount> <ram:CategoryCode>S</ram:CategoryCode> <ram:RateApplicablePercent>19</ram:RateApplicablePercent> </ram:ApplicableTradeTax> <ram:SpecifiedTradeSettlementHeaderMonetarySummation> <ram:TaxBasisTotalAmount>4140.00</ram:TaxBasisTotalAmount> <ram:GrandTotalAmount>4926.60</ram:GrandTotalAmount> </ram:SpecifiedTradeSettlement...></rsm:CrossIndustryInvoice>One file. The page is what your customer reads; the embedded XML is what their accounting software reads. Both are generated from the same totals.
Why this exists
A PDF attached to an email is no longer an invoice.
Since 1 January 2025 every business in Germany must be able to receive a structured electronic invoice, and the obligation to issue them phases in through 2028. France is on a parallel track. In both, a plain PDF does not satisfy the requirement — the invoice has to carry machine-readable data in a format built on EN 16931.
The hybrid answer is Factur-X, known as ZUGFeRD in Germany: a PDF/A-3 file with a Cross Industry Invoice XML payload embedded inside it. Your customer opens a normal-looking invoice; their accounting software reads the XML.
Producing one correctly means an archival PDF profile, an embedded file with the right relationship and metadata, a conforming XMP packet, and an XML document that survives the official schema. That is the part we do.
How it works
Three moving parts, and you own two of them.
Point a webhook at us
Create an endpoint for Stripe, Shopify or your own billing stack. You get a URL and a signing secret. Signatures are verified against the raw request body before anything is parsed.
We compile the document
The payload is mapped to UN/CEFACT Cross Industry Invoice, totals are recomputed in exact decimal arithmetic, and the EN 16931 business rules are applied before anything is rendered.
You get one file back
A PDF/A-3 container with factur-x.xml embedded as /Alternative. Fetch it from the API, or have it POSTed to your callback with a signed payload and automatic retries.
curl -X POST https://zugflow.altixcode.com/api/v1/documents \
-H "Authorization: Bearer zf_live_..." \
-H "Content-Type: application/json" \
-d '{
"number": "RE-2026-0417",
"issueDate": "2026-09-13",
"currency": "EUR",
"buyer": {
"name": "Cliente SARL",
"vatId": "FR12345678901",
"address": { "line1": "Rue de Paris 2", "city": "Paris",
"postCode": "75001", "countryCode": "FR" }
},
"lines": [
{ "name": "Platform licence, Q3", "quantity": "1",
"unitPrice": "2400.00", "vatRate": "19", "vatCategory": "S" }
]
}'What we guarantee
Correctness you can check, not correctness we assert.
Validated, not assumed
Every document is checked against the official Factur-X 1.07.3 XSD before it is returned. A document that does not validate is an error, never a file you find out about at the tax office.
Exact decimal money
Totals are computed in scaled integers, not floats. A thousand lines of one cent come to exactly 10.00, and VAT is rounded per category rather than per line, the way EN 16931 specifies.
The two faces agree
The rendered page and the embedded XML are generated from one set of computed totals. They cannot disagree, because there is only ever one calculation.
Replays are idempotent
Inbound events are keyed on the provider's own event id with a unique constraint. A Stripe redelivery returns the original document instead of minting a second invoice number.
Conformance profiles
MINIMUM
Not a legal invoice in DE or FR
BASIC WL
Header only, no line items
BASIC
Minimum recommended for Germany
EN 16931
The default — full COMFORT profile
EXTENDED
Beyond the norm, for complex trade
Where this stands
New service, verified engine.
The compilation engine is covered by an automated suite that checks the XML against the official schema and the PDF against veraPDF for PDF/A-3b conformance on every build. Those are the claims that matter, and they are machine-checked rather than asserted here.
What we will not claim: customer numbers, uptime history or an audit we have not had. Zugflow is newly launched. The free tier exists so you can put it in front of your own accountant before you pay for it.