Build1 distinct publisher3 min readUpdated
A 2019 reissue gave roughly 1.3 million Dutch sole traders new btw-ids. One Node.js validation guide argues the offline mod-11 test every pipeline copied no longer holds for them.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
In October 2019 roughly 1.3 million Dutch sole proprietors were issued brand-new btw-ids, effective for the 9-digit block of a sole-trader VAT ID from 1 January 2020 [5]. According to a Node.js validation guide published on dev.to and originally on vatnode.dev, that change quietly broke the usual local-checksum trick for a large class of Dutch numbers [3][13], which means any billing pipeline still gating Dutch VAT IDs offline is deciding tax treatment with a test that no longer proves what it used to [12].
The format itself is rigid and easy to check: NL, nine digits, a literal letter B, then two digits, fourteen characters in all, as in NL001631457B01 [1]. The first misreading starts at the end of the string. Those trailing two digits are a sequence number, not a check digit: B01 is the holder's first business, B02 and B03 further businesses of the same person or entity, and there is nothing in them to verify [2].
The real damage is upstream. The nine-digit block used to be a BSN or an RSIN, and both satisfy the Dutch elfproef, a mod-11 test using weights 9, 8, 7, 6, 5, 4, 3, 2, -1 in which the weighted sum must be divisible by 11 [4]. If your fixtures were all legal entities, that gate looked like a reliable filter [4]. The guide's own sentence describing what replaced the block for sole traders breaks off mid-word in the copy supplied to me [14], so take only what it states plainly: after the 2020 change a mod-11 pre-flight check cannot be relied on for sole-trader btw-ids [12].
That leaves two ways to be wrong before you ever make a network call. A checksum gate can reject a valid post-2020 sole-trader number, and a regex-only gate can wave through a private number that the authoritative register would reject [15]. The second failure has a specific shape in the Netherlands: since 2020 every sole trader holds both a public btw-id in the NL...B01 form, which is the one printed on invoices and checked in VIES, and a BSN-based omzetbelastingnummer in the 123456789B01 form, which is for correspondence with the tax office and is not valid in VIES [6]. Both end in Bnn, so a regex will not catch the swap, and VIES simply returns invalid for the private one [7].
This is why the guide treats the Netherlands as the exception in its series: where the German, French and Polish pipelines can use a cheap local checksum as a pre-flight filter, the Dutch one leans on VIES with the KVK company register as a fallback [8]. The regex proves shape only and never proves registration [9].
What remains worth doing locally is normalisation, in one of two declared modes: strict for documented API input, lenient for checkout, where spaces, dots, a lowercase b and a missing NL prefix are auto-corrected and the original logged [10]. In the guide's examples, "NL 0016 3145 7 B01" normalises to NL001631457B01, "001631457B01" returns null in strict mode and NL001631457B01 in lenient mode, and "NL001631457B0" returns null on length [11].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
In 2020 the Netherlands changed how sole-trader btw-ids are issued, which quietly broke the usual local-checksum trick for a large class of numbers.
The Dutch btw-identificatienummer has a fixed 14-character shape: NL + 9 digits + the literal letter B + 2 digits, for example NL001631457B01.
The trailing two digits of a Dutch btw-id are a sequence number, not a checksum: B01 is the holder's first business, B02 and B03 further businesses of the same person or entity, and there is nothing in those digits to verify.
Historically the 9-digit block was a BSN (citizen service number) or RSIN (legal-entity equivalent), and those satisfy the Dutch elfproef, a mod-11 test using weights [9, 8, 7, 6, 5, 4, 3, 2, -1] where the weighted sum must be divisible by 11; if you only ever saw legal-entity numbers, a mod-11 gate looked like a reliable filter.
In October 2019 roughly 1.3 million sole proprietors (eenmanszaken) were issued a brand-new btw-id, effective 1 January 2020 for the 9-digit block of a sole-trader btw-id.
Since 2020 every Dutch sole trader has two numbers: the btw-id (NL...B01), which is public, printed on invoices and websites, and the one checked in VIES; and the omzetbelastingnummer or btw-nummer, which is BSN-based (123456789B01), private, for correspondence with the Dutch tax office only, and not valid in VIES.
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.
Specific and internally consistent, but single-sourced and vendor-authored
The technical claims are unusually concrete for a single-source cluster: an exact format, exact elfproef weights, runnable code, and four worked normalisation results that a reader can reproduce. Against that, every regulatory fact — the October 2019 reissue, the ~1.3 million count, the 1 January 2020 randomization — is asserted by one self-published guide with no citation to the Belastingdienst, VIES documentation or any independent outlet, and the supplied text is truncated before the authoritative-verification section it relies on.
Underlying scheme change is in force at scale; validator uptake unevidenced
The change the story turns on is not a proposal: per the guide, ~1.3 million sole-trader numbers were reissued and the randomized scheme has been effective since 1 January 2020, so the affected identifier population is large and live. But nothing in the cluster shows any billing pipeline, library or SaaS vendor having adopted the recommended VIES-first, checksum-free approach — no installs, no customer references, no incident reports of false rejections — so adoption of the story's prescription itself is essentially unmeasured.
Substantive core, headline outruns the measurement
The technical argument is sober and even self-limiting — the guide labels its own elfproef code illustrative-only and says a passing regex proves nothing about registration. The overstatement is at the framing layer: the story asserts that billing pipelines 'may not know' and that the checksum 'stopped working', while no evidence in the cluster measures how many pipelines still gate on mod-11, how many valid btw-ids actually fail it, or how often the private-number paste occurs. A vendor-authored, single-source guide advocating an API-based check also carries mild promotional lift.
Vendor-authored guide steering toward hosted VIES/KVK verification
The article opens by directing readers to vatnode.dev as the canonical source and is part of a per-country series; its conclusion — drop local checksums and rely on VIES with a KVK fallback — aligns with the interests of a VAT-validation service, since the recommended workflow is exactly the sort of authoritative lookup such a service sells or wraps. That does not make the technical claim wrong, but it is the only voice in the cluster and it discloses no commercial relationship.
Moderate-low: one truncated, self-published source
Confidence is held down by structural thinness — a single publisher, a single article, no official citations, and a body that ends mid-sentence — even though the reproducible code and one internal inconsistency in the ledger's account of the truncation could both be checked directly. The mechanism described is coherent and the affected population is specific, so the direction of the finding is more credible than its magnitude.
build
One Mutable vat_id Column Is An Audit Failure With A Delay Fuse1 distinct publisher
build
The WebSocket That Lies: Why Liveness Detection Beats Reconnect Logic1 distinct publisher
build
A GAN beauty filter is a device budget allocation, not a feature toggle1 distinct publisher
build
Every viewer hits your HLS key endpoint in the same second, and almost nobody tests it1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 21, 2026