Platform specifics
The five things that break a cross-border comparison
These are the reasons a European grocery chains dataset needs its own handling rather than a shared retail schema.
Deposits and VAT sit outside, or inside, the price you see
Container deposits
Several European markets operate deposits on beverage containers. They are refundable, they differ by
container type, and they are frequently displayed separately.
A beverage at €4.99 plus €1.50 deposit is not a €6.49 product. Comparing a deposit market against a
non-deposit one without separating them produces a systematic error across the whole beverage category, in one
direction.
Captured as deposit_amount and deposit_type, never folded in — the position our
Flink and Albert Heijn pages
take.
VAT
Rates differ by country and, within a country, by product class — staples frequently at a reduced rate
and prepared items at standard. So a cross-border comparison on displayed prices compares different tax treatments.
We record price_vat_basis as displayed and do not adjust, because adjusting requires assuming a
product classification we did not observe. Where a listing states the rate we capture it.
Unit pricing, own label, and pack architecture
Unit-pricing law
Several markets mandate a displayed unit price; others do not. That is useful where it exists and it is worth
checking rather than trusting.
We parse pack data and compute unit price ourselves, capture the displayed figure where shown, and flag
unit_price_matches where they disagree — usually a listing error worth surfacing to the retailer.
Own label
Own-label share is large across European grocery and rising. Those lines have no equivalent at another
retailer — no shared identifier, no matching product.
Flagged, matched within a chain, and marked unmatched across chains. An index that quietly pairs own-label
lines is measuring something other than what it claims, and the error grows with own-label share.
Pack architecture
The same brand appears in different pack formats per market, for supply-chain and regulatory reasons. A price ratio
across borders on headline price compares different quantities.
pack_size, pack_unit and unit_count are parsed, with
price_per_unit on a stated basis and pack_parse_confidence carried. Where parsing is
unsafe, unit price is null with a reason rather than derived from a guess.
Why this is one page, and where the detail lives
Your hub list carries these chains as individual rows. One page covers them because the five breakers above are
the whole difficulty, and they are shared. The per-chain differences — own-label share, promotional
intensity, online range depth — are scoping variables rather than different arguments.
Where the per-market detail lives
Several markets already have a page working the argument through in full:
- Edeka — a cooperative where independent stores set prices,
and German Pfand and Grundpreis handling.
- Colruyt — a stated price-matching policy, and what it does
to attribution.
- Albert Heijn — promotional mechanics with
conditionality, and a franchise element.
- Mercadona — categories with no branded comparison set at
all.
- Aldi and
Lidl — the discounter case, where matching mostly fails.
This page is the cross-border layer over those. If you are running one market, read its page. If you are running
several, the five breakers are what decide whether the comparison holds.