Client projectPrivate
Every competitor site in three markets, rescanned weekly and checked before it counts
5,700+ sites from eight public sources, rescanned every week, stopped at a gate when a list looks wrong, and turned into a map that plans where to build next.
- Industry
- Multi-market network operator
- What it shows
- Competitor intelligence, OSINT, Geospatial analysis, Expansion planning
- Year
- 2026
- Status
- Private
In numbers
- competitor and client sites in three markets, from eight public sources
- 5,700+
- conditions that stop a scan before a bad list can count
- 19
- same-place pairs right when checked by hand
- 815 / 817
- stores of 20 chains joined to the sites, checked against OpenStreetMap
- 3,900
Figures come from the project’s own files and records.
What changes
The steps people did by hand, and the route the work takes now.
Management asks where competitors are opening
Before
- Open every competitor’s map
- Copy the sites into a spreadsheet
- Guess what changed since last time
- Eyeball the gaps
With AI
- Eight public lists collected and checked every week
- A planning map shows the gaps and where to build
A weekly change report and a build plan
The problem
The client competes on the ground. Its rivals open, close and move sites every week, and each publishes its network only on its own map, in its own format. Management wanted to know where competitors were opening, where customers walked past a rival’s site to reach none of the client’s, and where the next site would do the most good. Answering that by hand meant opening eight maps, copying thousands of rows and guessing what had changed since the last time.
What we built
A weekly census of every site in three markets, built only from public sources. Claude runs each scan from written instructions: collect the eight published lists as they are, turn them into one table, stop if anything looks wrong, compare with last week, and report what changed and where.
In the latest week the report found 45 changes: 30 new sites, 5 removed, 4 renamed, 3 with a new address, 2 moved and 1 with a refined location. The scan passed the gate with no stops and three warnings, each answered before the report went out.
Every scan that passes rebuilds a planning map. It joins the sites to an official 1 km population grid, area boundaries and 3,900 stores of 20 retail and fuel chains, and turns them into intelligence layers: who has no site within 1 km, where a competitor is within 1 km and the client is not, how each area scores, which chains host which operators, and where a new site would reach the most people the client does not reach yet.
Why the numbers can be trusted
A census is only useful if nobody has to wonder whether a change is real. A source that returns half its sites, a list cut off at a page limit or coordinates that come back swapped all stop the scan before it can count, and the stopped scan never becomes the baseline. History is never overwritten. A self-test runs a whole scan on planted data, including a broken source that must be stopped.
The map is held to the same standard. Before a new scan is applied, the rebuild must reproduce last week’s map exactly. Every published figure is then calculated three ways, in the page itself, independently from the scan and in the method text, and all three must agree. The rule for when two sites stand in the same place was checked by hand on 817 pairs and was right on 815.
The method also says what the data cannot do. Against about 2,400 sites mapped independently in OpenStreetMap, half of the operators’ own points sit within 13 m, three quarters within 30 m and nine in ten within 56 m. So a 25 m result is only indicative, while a 100 m result barely moves when the threshold does.
What it shows
This is open-source intelligence that management can act on: a standing weekly report instead of a one-off study, and a planning tool that ranks sites by the people they would reach rather than by a score nobody can explain. The same approach fits any business that competes through physical locations, from retail and banking to healthcare and charging. Below, explore a made-up region with the real layers, rules and checks.
Interactive system map
From eight public lists to a map that plans the next site
24 parts and 8 journeys: the weekly scan, the gate that stops a bad one, the person who checks every removal, and the map with its layers. Generic part names; the client stays anonymous.
Play 8 journeys, or click any of its 24 parts.
- sites in three markets, from eight public sources
- 5,700+
- conditions that stop a scan
- 19
- same-place pairs right when checked by hand
- 815/817
- Any site within 1 km
- 76.0%
- Client site within 1 km
- 43.1%
- People in the client gap
- 46,225
- No site within 1 km
- 33,570
Of 140,165 dummy residents. Straight-line distance from each cell’s centre to the nearest site.
Stores come from 20 chains' own lists and were checked against OpenStreetMap. A site counts as inside a store within 100 m, or within 300 m when it carries the chain’s name.
17 changes, 8 of them within 300 m of a client site.10 changes, 2 of them within 300 m of a client site.
- NewOperator F · F-779 · Market ANot in last week’s list · 204 m from a client site
- NewOperator B · B-780 · Market ANot in last week’s list · 137 m from a client site
- NewOperator B · B-781 · Market ANot in last week’s list · 188 m from a client site
- NewOperator B · B-782 · Market ANot in last week’s list · 171 m from a client site
- NewOperator B · B-783 · Market ANot in last week’s list · 181 m from a client site
- NewOperator B · B-784 · Market ANot in last week’s list
- NewOperator D · D-785 · Market BNot in last week’s list
- NewOperator B · B-786 · Market ANot in last week’s list
- NewOperator C · C-787 · Market ANot in last week’s list · 275 m from a client site
- RemovedOperator E · E-127 · Market AGone from the list; checked on the operator’s own map
- RemovedOperator F · F-161 · Market AGone from the list; checked on the operator’s own map · 156 m from a client site
- RemovedOperator D · D-424 · Market AGone from the list; checked on the operator’s own map
- MovedOperator D · D-177 · Market AMoved 609 m · 293 m from a client site
- MovedOperator D · D-605 · Market CMoved 598 m
- RenamedOperator D · D-354 · Market CName changed, same place
- RenamedOperator B · B-280 · Market BName changed, same place
- RenamedOperator B · B-163 · Market AName changed, same place
- NewOperator D · D-788 · Market CNot in last week’s list · 189 m from a client site
- NewOperator C · C-789 · Market ANot in last week’s list · 168 m from a client site
- NewOperator F · F-790 · Market CNot in last week’s list
- NewOperator D · D-791 · Market CNot in last week’s list
- NewOperator C · C-792 · Market BNot in last week’s list
- RemovedOperator B · B-131 · Market AGone from the list; checked on the operator’s own map
- RemovedOperator B · B-137 · Market AGone from the list; checked on the operator’s own map
- MovedOperator F · F-482 · Market BMoved 698 m
- RenamedOperator C · C-478 · Market BName changed, same place
- RenamedOperator B · B-589 · Market AName changed, same place
- Sites are matched by operator, market and the operator’s own ID.
- A removed and a new site of one operator within 30 m count once, as a changed ID.
- Moved: more than 50 m. 10 to 50 m is a refined location.
- Every removal and every doubtful new site is checked by a person, on the operator’s own map, and the note is kept.
- 1No site nearby · Market BArea with no site within 1 km+1,500
- 2No site nearby · Market CArea with no site within 1 km+1,474
- 3Client gap · Market CArea where competitors reach people and the client does not+1,316
- 4Chain 4 store, 3 competitors · Market CCompetitor place, 3+ operators, no client+1,283
- 5No site nearby · Market AArea with no site within 1 km+1,238
- 6Client gap · Market BArea where competitors reach people and the client does not+1,167
- 7Chain 3 store, 4 competitors · Market ACompetitor place, 3+ operators, no client+1,090
- 8Client gap · Market CArea where competitors reach people and the client does not+1,061
- 9Client gap · Market AArea where competitors reach people and the client does not+1,004
- 10Chain 2 store, 4 competitors · Market BCompetitor place, 3+ operators, no client+1,002
142 candidates of four kinds. The plan takes the one that reaches the most people the client does not reach yet, marks them as reached, and repeats, so neighbours never count the same people twice. No weights and no scores: the order is the build order.
- Two reads of every file give the same row countTwo reads of every file give the same row countTwo reads of every file give the same row countTwo reads of every file give the same row countTwo reads of every file give the same row countTwo reads of every file give the same row count
- Every operator and market is in the scanEvery operator and market is in the scanEvery operator and market is in the scanEvery operator and market is in the scanEvery operator and market is in the scanEvery operator and market is in the scan
- No operator’s count moved more than 10% in a weekOperator C in market A grew 2.9%, above the 2% warning line: checked, it is realNo operator’s count moved more than 10% in a weekOperator D in market B: 412 to 198 sites (−52%), probably a broken sourceNo operator’s count moved more than 10% in a weekNo operator’s count moved more than 10% in a weekNo operator’s count moved more than 10% in a weekNo operator’s count moved more than 10% in a week
- At least 90% of last week’s IDs are still thereAt least 90% of last week’s IDs are still thereOperator D in market B: only 48% of last week’s IDs are still thereAt least 90% of last week’s IDs are still thereAt least 90% of last week’s IDs are still thereAt least 90% of last week’s IDs are still thereAt least 90% of last week’s IDs are still there
- Coordinates fall inside their marketCoordinates fall inside their marketCoordinates fall inside their marketOperator E: 214 sites (3.8%) outside their market, above the 1% limit: latitude and longitude swappedCoordinates fall inside their marketCoordinates fall inside their marketCoordinates fall inside their market
- No ID appears twiceNo ID appears twiceNo ID appears twiceNo ID appears twiceNo ID appears twiceNo ID appears twice
- No list stops at a page limit or short of the source’s own totalNo list stops at a page limit or short of the source’s own totalNo list stops at a page limit or short of the source’s own totalNo list stops at a page limit or short of the source’s own totalOperator F: 2,000 records, exactly the page limit: ask for the next pageNo list stops at a page limit or short of the source’s own totalNo list stops at a page limit or short of the source’s own total
- Partner labels did not fall by more than 20%Partner labels did not fall by more than 20%Partner labels did not fall by more than 20%Partner labels did not fall by more than 20%Partner labels did not fall by more than 20%Operator B: rows labelled as a partner’s fell from 57 to 3; they would be counted as its ownPartner labels did not fall by more than 20%
- Both passes of each area search found the same sitesBoth passes of each area search found the same sitesBoth passes of each area search found the same sitesBoth passes of each area search found the same sitesBoth passes of each area search found the same sitesBoth passes of each area search found the same sitesOperator C: the shifted second pass found 6 sites the first missed; rerun those areas
Each warning is answered by a person first. Then the scan is kept as its own dated set, becomes next week’s baseline, and the change report and the map are rebuilt from it.
The scan is moved to a rejected folder and never becomes the baseline. Last week’s scan stays the one to compare against. Nothing is overwritten.
The scan is moved to a rejected folder and never becomes the baseline. Last week’s scan stays the one to compare against. Nothing is overwritten.
The scan is moved to a rejected folder and never becomes the baseline. Last week’s scan stays the one to compare against. Nothing is overwritten.
The scan is moved to a rejected folder and never becomes the baseline. Last week’s scan stays the one to compare against. Nothing is overwritten.
The scan is moved to a rejected folder and never becomes the baseline. Last week’s scan stays the one to compare against. Nothing is overwritten.
A self-test runs a whole scan end to end on planted data, including a deliberately broken source that must be stopped. On the last real scan, 0 stops and 3 warnings, each answered.
Under the hood
- Claude
- Python
- NumPy
- SciPy
- Shapely
- scikit-learn
- Playwright
- Leaflet
- Excel
01Collect (OSINT)
Only the operators’ own published lists: eight public sources, some read in a browser, two by searching map areas twice on shifted tiles. Every raw file is fingerprinted with SHA-256.
02Source register
Where each list comes from, what each field means and the evidence for it, the exceptions, and the rule that a partner’s site counts once, for its own operator.
03The gate
19 conditions stop a scan: a sudden change of more than 10% in a count, missing groups, vanished IDs, swapped coordinates, duplicates, lists cut at a page limit, partner labels that fall away. A failed scan is set aside and never becomes the baseline.
04Change report
New, removed, moved and renamed sites, matched by operator and ID, with changes within 300 m of the client’s own sites flagged. Every removal is checked by hand on the operator’s own map.
05Planning map
Ten views over the sites, an official 1 km population grid, area boundaries and 3,900 chain stores: coverage, client gaps, area scores, overlaps, chains, changes and an expansion planner, all exporting to Excel.
06Verification
A self-test with a deliberately broken source, an identity run that must rebuild last week’s map exactly, and every published figure recalculated three independent ways.