I have spent most of my career at the intersection of ad-tech and location services. I built navigation systems in the automotive industry and I work in retail media tooling. At some point you start noticing a gap: the platforms know where the stores are, but they do not know what the stores are worth.
In-store retail media (screens, endcaps, checkout displays) often allocates budget equally across store networks. Whether that is because the platform charges flat rates or because the brand manager does not differentiate, the result is the same: a digital screen in a Lidl in dense Berlin-Kreuzberg gets the same budget as a screen in a Lidl on Sylt with 33 people within walking distance. Nobody tells you which is which. So I graded all of them.
I pulled every Lidl store in Germany from OpenStreetMap. 3,251 locations. I ran each one through a catchment grading tool I have been building: population within a 10-minute walk, competitor density, transit access, income levels. Then I simulated what happens when a brand allocates a EUR 10,000 monthly budget equally across the network.
The Real Stores
Every Lidl in Germany, graded A through D based on catchment quality.
| Grade | Stores | % of network | Avg population (10min walk) | Avg transit score |
|---|---|---|---|---|
| A | 32 | 1% | 15,930 | 96 |
| B | 800 | 25% | 4,506 | 54 |
| C | 1,336 | 42% | 2,164 | 33 |
| D | 1,031 | 32% | 749 | 25 |
The best Lidl in Germany (Berlin, score 91) has 18,681 people within a 10-minute walk, excellent transit, and estimated high foot traffic. The worst (Sylt, score 2) has 33 people within a 10-minute walk. Under equal allocation, D-grade stores as a group cost about 20.9x more per modeled impression than A-grade stores.
A third of the network is D-grade. 1,031 stores with fewer than 750 people on average within walking distance. These are real stores in real towns. Under equal budget allocation, they consume a third of the budget.
The Three Strategies
I tested three ways to spend EUR 10,000 monthly across 3,199 Lidl stores:
Strategy 1: Equal Allocation
Every store gets EUR 3.13. This is a common outcome when a brand uploads a store list without differentiation, or when the platform does not adjust pricing by store quality.
Strategy 2: Simulated Platform Optimization
A modeled proxy for platform optimization: budget is shifted toward stores using a noisy traffic signal (square root of estimated daily traffic with random variation). This simulates the kind of optimization a platform might run based on historical delivery data. It is better than equal, but the signal is lagging and noisy.
Strategy 3: Catchment-Informed
Fees are weighted by store grade. A-grade stores get roughly 8.6x the fee of D-grade stores (weight ratio 6.0 vs 0.7). The fee distribution follows the catchment quality curve. No historical data needed.
The Map: 3,199 Lidl Stores by Grade
Every Lidl in Germany, colored by catchment grade. Green = A/B (higher estimated traffic, urban). Yellow = C (suburban). Red = D (lower estimated traffic, rural, or over-competed). Toggle Aldi locations to see where catchments overlap.
The Budget Flow: 60 Copenhagen Stores
To show how budget shifts between strategies, here are 60 real supermarkets in Greater Copenhagen graded by the same API. Use the slider.
The Results: 3,199 Real Stores
| Metric | Equal | Sim. Platform | Catchment |
|---|---|---|---|
| % budget on D stores | 32.2% | 18.7% | 12.4% |
| eCPM at grade-A stores | EUR 0.02 | EUR 0.06 | EUR 0.06 |
| eCPM at grade-D stores | EUR 0.41 | EUR 0.24 | EUR 0.16 |
| Overpayment multiplier (D vs A) | 20.9x | 4.3x | 2.4x |
Under equal allocation, 32.2% of the budget goes to D-grade stores. The effective CPM at those stores is about 20.9x higher than at A-grade stores under this model.
Simulated platform optimization cuts D-store spend from 32.2% to 18.7%. Catchment-informed allocation cuts it to 12.4%. The overpayment multiplier drops from 20.9x to 2.4x. The remaining 2.4x reflects the chosen catchment weight curve; a traffic-proportional allocation could flatten it further.
The Double-Paying Problem
It gets worse. I pulled all 2,721 Aldi stores in Germany from OpenStreetMap and computed the distance to every Lidl. If a brand runs retail media on both networks, how much reach overlap is there?
| Overlap | Lidl stores | % of network |
|---|---|---|
| Aldi within 500m | 727 | 23% |
| Aldi within 1km | 1,276 | 40% |
40% of Lidl stores have an Aldi within a kilometer. Those stores likely have significant catchment overlap. A brand running in-store placements on both networks has potential duplicated reach at those locations. Toggle the Aldi layer on the map above to see it.
The overlap within 500m is roughly uniform across grades: 22% of A-grade Lidl stores have an Aldi that close, 25% of D-grade stores do. The overlap does not discriminate by quality. It compounds with it: you may be overpaying at D-grade stores and duplicating reach at a large fraction of the network.
The Overpayment Multiplier
The Overpayment Multiplier: how many times more you're paying per modeled impression at D-grade stores versus A-grade stores, under each strategy.
overpayment = eCPM(grade_D) / eCPM(grade_A)
# 3,199 real Lidl stores in Germany:
# Equal allocation: 20.9x (A: EUR 0.02, D: EUR 0.41)
# Simulated platform: 4.3x (A: EUR 0.06, D: EUR 0.24)
# Catchment-informed: 2.4x (A: EUR 0.06, D: EUR 0.16)These are 3,199 real store locations pulled from OpenStreetMap, graded by catchment-derived traffic proxies (population, transit, competitors), with the budget simulation run on the actual grade distribution. The "impressions" are modeled from foot traffic estimates, not measured ad exposure. A third of the Lidl network is D-grade. Under equal allocation, a third of your budget goes there.
Two caveats. First, D-grade is not automatically waste. A brand targeting rural customers with fewer alternatives might intentionally want those stores. The model treats all D-store spend as low-quality, but real campaign objectives vary. Second, the model assumes all stores are eligible for all placements. In practice, store-level product availability often determines which stores can run a promotion at all.
What Happens in Competitive Auctions
The allocation model above uses the real Lidl grade distribution. The auction model below is synthetic: it tests mechanism behavior on a generated store network, not measured Lidl campaign delivery. It is useful for understanding how strategies interact under competition.
Retail media is increasingly programmatic. Brands bid against each other for placement slots. So I also built a second-price auction simulator with competing advertisers, floor prices, and budget pacing.
In a counterfactual test (one catchment bidder against five equal bidders, same budget) the catchment bidder achieves near-zero low-grade waste and 100% of its impressions come from A-B stores. Equal bidders spend about 8% of their budget on D/E/F inventory without differentiating.
And when everyone uses catchment grading? Waste drops to near-zero and A-B impression share rises to about 75%. But A-store clearing prices increase about 2.6x because everyone is bidding for the same high-quality slots. Catchment grading is a structural improvement. It works even in equilibrium. But it is not a free lunch.
Sponsored Search vs. In-Store Retail Media
In sponsored search, spend naturally flows toward high-volume queries. Low-volume keywords barely consume budget. Physical store networks have fixed per-location inventory: every store with a screen can absorb budget regardless of traffic. Under equal allocation, low-traffic stores absorb the same share as flagships. In Lidl Germany, that bottom tier is 32% of the network.
This is specific to in-store and physical retail media. Online retail media (sponsored product listings on a retailer's website or app) has a different dynamic because impression volume is tied to page views and search queries, not store foot traffic.
What the Platform Does Not Tell You
The retailer operating the retail media network has POS data for every store. They know which stores move product and which ones do not. They know the foot traffic, the basket sizes, the conversion rates. This data exists. It is typically not shared at store level with the advertiser.
The dashboard shows total impressions, average CPM, maybe a breakdown by placement type. It typically does not show you how individual stores compare on quality metrics. You get "850,000 impressions at EUR 4.27 eCPM." You may not get: how many of those were in stores with fewer than 750 people in the catchment.
My hypothesis is that there is little incentive to volunteer this breakdown. If advertisers could see that a third of their exposure is in D-grade locations, they might stop paying for them. Catchment grading gives the advertiser an independent store-level quality signal derived from publicly available data.
The Code
The simulator is about 750 lines of Python, four modes, no dependencies beyond stdlib. The 3,199 Lidl Germany stores were pulled from OpenStreetMap and graded via a catchment analysis API.
# Reproduce the Lidl Germany allocation table from the blog:
python run_lidl.py
# The CLI also generates synthetic store networks for mechanism testing:
python auction_lab.py --mode allocation --store_count 500 --budget 10000
python auction_lab.py --mode counterfactual --store_count 500 --budget 10000
python auction_lab.py --mode homogeneous --store_count 500 --budget 10000What This Means for Brands
If you are running in-store retail media campaigns, ask your platform: "Can you break down performance by store-level catchment quality?" The answer will tell you how much visibility you have into where your budget actually goes.
If you are a retail media network, you already know which stores are your best inventory. You may not have a systematic way to price them differently. Catchment grading gives you the language to tier your own inventory before advertisers figure out how to do it themselves.
The Tool Behind the Grades
The grades in this post come from a location intelligence tool I have been building called Catchment. It takes a coordinate and a category, and returns everything you need to evaluate a store location: real walking isochrones, competitor mapping with brand detection across 60+ chains, daytime population, transit scoring, revenue estimates, and a letter grade from A to F.
It covers 27 European countries and 7M+ points of interest. The grading uses six dimensions: walking catchment population, competitor pressure, traffic context, category fit, neighborhood clustering, and transit access. The API can enrich up to 100 stores in a single call, or optimize a full campaign budget across 200 locations.
It is not publicly available yet. If you run retail media campaigns or operate a retail media network and want to try it on your own store list, get in touch.
The Pitch
I graded 3,199 Lidl stores, built a four-mode auction simulator, and showed that equal allocation sends a third of the budget to the lowest catchment-quality third of the network. This entire post is, transparently, a demonstration of what catchment grading can do for retail media planning.
The difference between this and a typical ad-tech sales pitch is that I showed 3,199 real stores with real grades and honest limitations. Most platforms show you aggregate reporting.
3,199 Lidl + 2,721 Aldi stores from OpenStreetMap.