Build1 distinct publisher3 min readPublished
Stripe's own e-invoicing docs offer a Marketplace app or a webhook you write yourself. Either way, the seller identity and the Leitweg-ID come out of master data your billing system was never asked to hold.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Follow any of these and your For You feed starts watching them — no settings page required.
product
PayPal stopped saying no. Payments teams should now plan for a Stripe-owned checkout rail3 distinct publishers
build
244 kB, 500 a minute, 5 percent: three ceilings that fail for the same reason1 distinct publisher
build
Hugging Face's $13B process puts most teams' model pipeline under a single owner2 distinct publishers
build
106 design engineers report a €115,000 median. The salary sites are pricing a different job.1 distinct publisher
The payload usually arrives wrapped as `event.data.object`, so unwrap that before anything else [15]. Then come the coercions, and none of them are optional. Amounts are integer cents, so `10000` is EUR 100.00, and the division by 100 belongs in `Decimal`, not float [11]. Dates are Unix seconds, and `status_transitions.finalized_at`, `created`, `due_date` and `period_start` have to become ISO `YYYY-MM-DD` for BT-2, BT-9, BT-73 and BT-74 [12]. The `currency` field is lowercase `eur`; BT-5 wants `EUR` [13]. If the account runs `tax_behavior: inclusive`, line amounts must be unpicked to net before BT-146 and BT-131 are filled, because EN 16931 line amounts are net [14].
Four values a validator will check are not lookups at all. BT-24, BT-23, payment means code 58 and type code 380 do not exist on the Stripe object; they are constants of the syntax and CIUS you emit [16]. Stripe will not give you BT-31, BT-32, BT-41 through BT-43, BT-34 or BG-16 [17], which is six business terms plus one group [1], all merged from your own records, and that gap on the seller side is the real hole in the mapping. The list of things Stripe never holds is a master-data list: seller USt-IdNr, Steuernummer, IBAN, Leitweg-ID, VAT category K, AE or G with VATEX codes, and Kleinunternehmer status [21]. The Leitweg-ID in particular comes from the authority, not from `customer_address`, and the author parks it in `metadata.leitweg_id` [20].
The validation posture is the part I would copy verbatim. If `vat_id` is missing the mapping still runs, and a BR-DE-16 check must fail rather than emit `DE000000000`, `TODO` or `XXX`, which are to be rejected on sight [19]. A hard failure costs one alert, but a fabricated tax identifier on a filed invoice costs a great deal more than that.
The map itself is one author's work, published on dev.to as Stripe JSON paths to CEN business terms and XRechnung 3.0.2, implementable in any language, with no hosted e-invoicing API needed for the mapping, and explicitly not tax advice [23]. For it to transfer, your prices have to be tax-exclusive [14], you have to issue commercial invoices only, since BT-3 is pinned to 380 and credit notes are a separate Stripe `CreditNote` with type 381 and out of scope [22], and any public-sector routing id has to already exist somewhere you control [20].
The target format is not moving under you. ZUGFeRD 2.0.1 onward in the EN 16931 profile is the accepted family, MINIMUM and BASIC-WL excluded, CII XML, usually shipped as a PDF/A-3 hybrid whose embedded XML is the e-invoice under Section 14 UStG [4], and the 4 August 2026 corrigendum published as 2.5.2 does not change that [3]. It takes effect four months before the first issuing mandate [2]. Above-threshold issuers still on non-EN-16931 EDI get twelve months past that mandate [3], and the remaining in-scope issuers arrive on 1 January 2028 [9]. Transport for domestic B2B is unprescribed, down to a USB stick [10], which tells you how little of this is a delivery problem.
In my context, a shop below the threshold, I would not build the emitter this quarter. I would build the master-data overlay and the unaltered-XML archive, because Section 14b UStG and GoBD already require the structured original to be kept and a printout does not count [6].
Ranked by verification strength, evidence, and original report placement.
Stripe Invoicing stores an invoice record and exposes it on the API and on webhooks, but it does not emit a legally compliant German e-invoice file.
Stripe's own e-invoicing docs state that you either install a Marketplace app (Billit is the named partner) or build a webhook that maps the Invoice object into EN 16931 XML yourself.
ZUGFeRD 2.5.2 is FeRD's 4 August 2026 corrigendum of 2.5 (Factur-X 1.09.2), the current download, effective 1 September 2026, and it does not change the BMF-accepted format family.
The BMF-accepted format family is ZUGFeRD from 2.0.1 onward in the EN 16931 profile, with MINIMUM and BASIC-WL out; ZUGFeRD 2.x is CII XML, usually exchanged as a PDF/A-3 hybrid with the XML embedded, and the structured XML is the e-invoice under Section 14 UStG.
Since 1 January 2025 every domestic German business, including Kleinunternehmer, must be able to receive e-invoices; there is no receive exception per the BMF FAQ, and an e-mail inbox is enough.
Through 31 December 2026 any issuer may still send a sonstige Rechnung; paper is always allowed in that window, and an unstructured PDF still needs the recipient's consent.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 31, 2026
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One author, two very different burdens of proof
Every fact in this story — the six absent seller terms, the EUR 800,000 threshold, the 1 September 2026 ZUGFeRD date — traces to a single dev.to post. Half of it is self-checking: anyone with a Stripe test invoice can confirm in a minute that BT-31 and BG-16 have no source field. The other half paraphrases Section 14b UStG, a BMF FAQ and a FeRD corrigendum without quoting or linking any of them, and that is the half where an error turns into an audit finding rather than a failed build.
Nobody has shipped anything we can see
The only event in this story with a date attached is FeRD publishing its own corrigendum. The mapping itself arrives as a table: no validator run reported against KoSIT, no repository, no merchant using it, and no indication whether German sellers on Stripe take the Marketplace route or write the webhook. That is not weak adoption — it is an absence of adoption facts, and we decline to invent one.
Quieter than the deadline deserves
This piece works against its own drama. It refuses to be tax advice, tells you to let validation fail rather than fabricate a USt-IdNr, and sends you to the official KoSIT validator before trusting anything local. A vendor holding the same finding would have published 'Stripe is not compliant with German law.' Measured against a hard 1 January 2027 mandate, 'six terms and one group' is about the most understated way to say the invoices you generate will not validate.
A faint tool-shaped nudge, visible in the text itself
No sponsor, no vendor byline, and Stripe's own commercial option gets named rather than buried — Billit appears in the first paragraph. Two tells all the same: the asides about a 'CLI flag' and using the table 'even without a CLI' imply the author has tooling in hand, and the argument for merging master data locally is framed as keeping names, VAT IDs and line items away from hosted e-invoicing APIs. That is a defensible privacy point that also happens to favour the author's approach over the Marketplace app.
Enough to act on the code, not on the law
One publisher, one author, no second account, and the freshest fact — a corrigendum dated four weeks before publication — cannot be confirmed from anything in our coverage. What holds confidence up is how cheap the central claim is to falsify: pull one Stripe invoice, look for the seller VAT ID and postal address, and the six-terms finding stands or collapses immediately. The statutory calendar deserves a practitioner check before anyone builds a compliance plan on these dates.