Stapel

NL

What is there, and what is missing

Arrival detection is only as good as the coordinates underneath it. Here are the measured figures, including the chains Stapel scores worst on.

Version
stores.nl.v1.json, built on
Size
24,699 stores, 175 chains. 1,632 kB raw, 561 kB gzipped. This is the file that ships with the app; the twenty-nine other countries are below
Source
OpenStreetMap, from a Geofabrik country extract, per chain on brand:wikidata
Licence
ODbL, the same as the source
SHA-256
24c32922c096078dfd3522384460a8bcdf201ecc9cf12f605a84e5120b4cfbbf

Coverage per chain

"Found" is what the pipeline kept after cleaning. "Published" is what the chain or Locatus says it has. "Coverage" is the first divided by the second, so above 100% the pipeline found more than the chain itself lists.

All 36 Dutch chains, worst coverage first. Measured on 10 September 2026, against the extract the file was built from.
Chain Found Published Coverage
DA21230071%
Pets Place12817075%
Decathlon222492%
C&A9610393%
Blokker576193%
Etos49352294%
Xenos15716595%
Kruidvat9871,01397%
GAMMA16216698%
Karwei12813198%
Praxis18018498%
La Place464798%
Primera54655099%
PLUS43744099%
Lidl437438100%
de Bijenkorf77100%
MediaMarkt5454100%
Trekpleister186185101%
Jumbo695685101%
HEMA560544103%
Ekoplaza8885104%
Welkoop167160104%
Intersport3735106%
IKEA1514107%
Intratuin5753108%
Albert Heijn1,1991,017118%
Holland & Barrett194——
H&M85——
vanHaren135——
Douglas94——
ICI PARIS XL141——
Rituals96——
Shell500——
BP187——
Esso468——
Starbucks99——

Why DA and Pets Place sit at the bottom

DA at 71% and Pets Place at 75% are the two worst, and it is not the filter: the shops are simply not in OpenStreetMap. Both are chains of small high-street shops, which is exactly where OSM coverage thins. A missing shop means no arrival alert there; the card itself works as normal.

Why Albert Heijn reads 118%

978 Albert Heijn plus 38 AH XL is 1,016 supermarkets, within one store of the Locatus figure. The entire difference is AH to go: OpenStreetMap knows 178, AH publishes 86. Of those 178, 84 sit inside OK fuel stations and 47 are NS station outlets, and 151 were edited during 2026, so it is not stale. AH appears not to count franchised forecourt shops.

A forecourt kiosk is not a full supermarket, but a record holds only its chain, coordinates and address: the sub-format is lost, and an AH to go is indistinguishable from an ordinary Albert Heijn inside the app.

What is wrong with it

Five things you should know before trusting this data. All of them measured, none of them suspected.

1. Addresses are missing, and it varies by chain

The twelve worst of 36 chains. Coordinates are complete everywhere.
Chain No address Of total Share
Starbucks239923.2%
Xenos2815717.8%
La Place84617.4%
Shell8350016.6%
Esso7246815.4%
DA2921213.7%
vanHaren1413510.4%
Ekoplaza8889.1%
Douglas8948.5%
Rituals8968.3%
Intersport3378.1%
Praxis141807.8%

Arrival detection runs on coordinates and is unaffected. A postcode search is not: it silently finds nothing for almost a quarter of the Starbucks locations.

2. Kruidvat is too perfect

987 of 987 records have identical tag sets, no missing field, and source=AS Watson BNL: a corporate import, not volunteer mapping. Excellent while somebody refreshes it, and uniformly stale the day they stop, with nothing visibly changing. The other chains degrade gradually; this one falls off a cliff.

3. Nothing notices that a shop has closed

A shop that closes stays in OpenStreetMap until a volunteer removes it, and that lags by months. Etos already has one tagged as vacant while still carrying the brand. There is no check for this in any direction, and it is not solvable from my side. That is why you can pin a shop yourself in the app.

4. The validation catches drift, not wrongness

The build pipeline stops if a chain moves more than 20% against the previous release. Tested: it fails on a 27.2% Lidl swing and on a chain disappearing entirely, and tolerates 3.4%. But it cannot tell a correct number from a consistently wrong one, and the table of expected counts it compares against is hand-entered and rots.

5. Overpass is gone; the assumption underneath it stayed

Fetching six chains through Overpass took 881 seconds: 123 to 137 seconds per chain almost regardless of what comes back, because scanning a whole country dominates. That load does not belong on a free volunteer service, so whole countries now come from a Geofabrik extract I download and process locally. Overpass is only the route for refreshing a single chain now. What did not change: all of it still rests on what volunteers put into OpenStreetMap, and an extract is a copy of that.

How the file is built

For anyone rebuilding the file
  1. A list of Wikidata identifiers per chain, not one. Albert Heijn has three; with only one, 216 stores disappear silently.
  2. Thin the country's Geofabrik extract with osmium down to everything carrying shop, amenity or brand, and match it against every chain in one pass. Refreshing a single chain still goes through Overpass, which reports a timeout with HTTP 200, so that field is checked separately.
  3. Normalise, round coordinates to five decimals, and merge duplicates within 25 metres.
  4. Filter on a whitelist of shop types. Excluding by name pulls in 65 non-stores for AH alone, including car parks and two charging stations.
  5. Compare against the previous release and stop the build on a large swing.
  6. Stamp a version, a SHA-256 and an ECDSA P-256 signature on it, and publish. Not Ed25519: that only reaches java.security on Android 13, and Stapel runs from Android 8.
  7. Bundle the same file in the app, so a fresh install knows everything offline.

The build is reproducible byte for byte from the cached raw data.

Twenty-nine more countries

The same files exist for every country in the table below, which carries the count for each as built on the date in its caption, because that is a figure a rebuild moves. Each country arrived in a release of its own, and the release notes say which. They do not ship with the app: only the Netherlands is bundled, and you download the rest a country at a time, over wifi.

The twenty-nine countries you can add, built on 16, 17, 22, 23, 25 and 29 September, 1 October and 4 November 2026.
Country Stores Chains Gzipped
United States485,8401,6409,727 kB
Japan112,7251971,062 kB
Great Britain73,0751901,455 kB
Canada70,1251,1181,168 kB
Germany59,647731,207 kB
Poland56,102200814 kB
Italy45,297175686 kB
France41,24077577 kB
Spain34,345183498 kB
Mexico30,666148347 kB
Australia27,549200345 kB
Brazil24,239126387 kB
Austria14,138138237 kB
Belgium12,942178208 kB
Switzerland12,174134188 kB
Portugal11,491166196 kB
Czechia11,480161144 kB
Sweden11,225107164 kB
Norway10,5177691 kB
Greece10,05698140 kB
South Africa9,80146146 kB
Argentina8,59761132 kB
Slovakia7,50312586 kB
Denmark6,9446058 kB
Finland6,75559119 kB
Ireland6,16310588 kB
New Zealand6,05714679 kB
Iceland293106 kB
Luxembourg13763 kB

For those twenty-nine there is no table of published counts to check against, so per-chain coverage is not measured there. That is a gap, and it is stated here because it exists.

Countries that arrive in parts

Every country arrives in parts. Your phone fetches the parts lying near your last known point and no more, plus one baseline part for anyone sharing no location. That is the one case where a download says something about where you are, and it is written out in full on the privacy page.

Every one of them is published as parts alone now, with no whole-country file beside it. Size is not what decides that. Iceland fits inside a single file several times over and is still published this way. The Netherlands is the one country that also ships inside the app itself, so a freshly installed Stapel knows shops before it has downloaded anything.

The baseline part is what changed for people, not just for the pipeline. Before it existed, a phone that could share no location fix in Spain, Belgium, Portugal or Italy installed nothing at all: there was no part to pick without a point to pick it against. Now it installs the baseline, which holds every chain in the country.

Attribution and licence

Store locations are derived from OpenStreetMap, © OpenStreetMap contributors, available under the Open Database License (ODbL) 1.0.

The derived database that Stapel bundles and syncs is published under the same licence, along with the code that builds it, and the same attribution appears inside the app on the About screen.

Chain names and logos belong to those chains. The app ships brand logos, from Wikimedia Commons and from the chains’ own sites, with the provenance and licence of each recorded in the app.

In the Play Store

Stapel is in the Play Store. Free, with no account, and you do not need to be on any list.