Build1 publisher2 min readPublished
UK pub-software seller keeps Stripe's merchant-of-record service off its home sales
UK software seller to pubs and bars turns on Stripe Managed Payments, at 3.5% over card fees, only for customers in the 27 EU countries. Leaving UK buyers out keeps the fee, and 20% VAT, off home sales that do not owe tax yet.
The Engineer · Build desk
Drafted by a language model from the sources cited here and checked against its claim ledger before publication. How we use AISend a correction

What happened
- Managed Payments makes Stripe the legal seller of record, so Stripe calculates, collects, files and remits the indirect tax and carries the liability.
- Stripe withholds the tax from each payout, and the seller only ever receives the net amount.
- The company says a sale to a German business owes German VAT from the first sale, while a UK pub owes nothing until the seller crosses the £90,000 threshold.
- A geolocated IP decides only whether a checkout session uses Managed Payments, and Stripe computes the tax from the billing address typed on its hosted page.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- cost On £90,000 of UK sales, keeping the service on at home would cost the seller £3,150 in fees for tax handling it does not yet need.
- constraint Turning the service on needs an account change as well as a deploy, since Stripe rejects the field until Managed Payments is activated and its terms accepted in the Dashboard.
- decision Each market beyond the EU becomes a tax decision taken with an accountant before it becomes a code change, and buyers there stay on ordinary checkout in the meantime.
Everything outside the 27 is off by construction [7]. The US stays off because the company has no sales-tax nexus at its volume [8]. Norway, Switzerland, Australia, Canada, Japan, Singapore and the UAE run their own regimes for foreign digital sellers. None of them enters the Set until the company has talked to an accountant and checked Stripe's own tax coverage list [9]. The post prefers an allowlist on scope: a denylist is a promise about every country on earth, while an allowlist is a promise about 27 [18].
The decision function has three gates, and all of them must pass [11]. The first is an environment switch that must be exactly the string "true", read at call time so runtime configuration and tests behave predictably [11]. The second is the country, taken from an IP geolocation header that is missing locally and on some edge cases [13]. Missing means the normal flow, never a best guess. The tests cover null and the empty string separately because the two arrive by different routes [13]. The third gate uppercases the code before the lookup. Without it, has('de') against a Set of uppercase codes returns false silently, and the post notes that this error under-collects [14].
The test file asserts that the Set has exactly 27 members and contains neither GB nor US [10]. The post concedes that a size check on a hard-coded list looks like a tautology dressed up as coverage [19]. It defends the check as a tripwire, because "the accident costs real money in a direction nobody notices for a quarter" [17]. I'd keep it. An accidental GB entry would start charging the fee and VAT on home sales, while a dropped DE would stop Stripe collecting German VAT, and neither raises an error [2].
The IP header is a coarse signal. The design tolerates it because Stripe takes the tax from the billing address once the session is on [15]. The post says a German pub owner on a VPN "is handled correctly by Stripe regardless of what our header said" [16]. By the post's own description of the gate, that holds when the VPN exits inside the EU-27. A German customer who geolocates to the UK, or arrives with no header, goes through the normal checkout, where Stripe is not the seller of record and the tax stays with the company [3].
What to watch
- Whether the company adds Norway, Switzerland or another non-EU regime to the Set after an accountant review and a check of Stripe's tax coverage list.
- The company's UK sales crossing £90,000, after which UK VAT is due anyway and the case for leaving GB out rests on the 3.5% fee alone.
- Any change to Stripe's 3.5% Managed Payments fee or to the countries its tax coverage list includes.