I noticed this by accident, which is how I notice most things.
I was testing a change to how Smopper stores prices and I had two branches of the same chain open in two tabs. Same week, same product, same size. Different price. Not by much, but it was there, and it was not a data error, and once I had seen it I could not stop looking for it.
Four miles between those two stores. Twelve minutes of driving.
This is normal and it is called zone pricing
Nothing here is a scandal. Grocery chains have priced by geographic zone for decades and they do not particularly hide it. A store's prices reflect its local costs (rent, wages, delivery distance, shrink) and its local competition. A location with an Aldi across the street prices differently than one that is the only grocery store for six miles.
The part worth writing about is not that it happens. It is how much and where, because both turned out to be different from what I assumed, and one of them was flatly the opposite of what I would have told you a month ago.
An awkward thing about the data first
Smopper stores prices in two shapes, and the difference decides what questions I can even ask.
Some prices are branch-level: this specific store, this specific price. Others are region-level: the chain publishes one price for a whole market area and every location in it inherits it. Which shape we get is not our choice. It depends on how the chain exposes its pricing.
Here is the awkward part. Of the roughly twenty-eight thousand prices we hold, about nineteen thousand are region-level and only about eight and a half thousand are branch-level. Effectively all of the branch-level ones come from a single chain, Kroger.
Which means the three stores I actually shop, and write about most, cannot answer this question at all. For Aldi, Giant Eagle and Kuhn's, we hold one price per market. If those chains vary prices between branches, we would not be able to see it. That is a limit of what is published, not a finding about those chains.
So everything below is Kroger. It is a large national chain with over a thousand locations in our data, which makes it a decent laboratory for the general question even though it is not the chain in my own rotation.
What I measured
Every case where we hold a price for the same product at two or more branches of the same chain. That is 1,556 products. For each one: the highest branch price, the lowest, and the spread between them as a percentage of the low.
What came out
53.2% of those products had at least one branch that disagreed with another. Slightly more than half. When there was a difference, the average spread was 11.5%.
I sat with that number for a while. Half of everything, and when it moves it moves by about a tenth. That is considerably more variation than "the same chain, twelve minutes apart" had any right to produce in my head.
Then I broke it down by aisle, and the shape of it is the actually interesting bit.
SMOPPER INSIGHTS
Share of products priced differently between branches of one chain
1,556 products held at two or more branches of the same chain. Household is 49 products, every one of them identical across every branch.
Three things I got wrong
Produce barely varies
I was confident going in that produce would be the most variable aisle. It is perishable, it has genuinely different local shrink rates, and it is the hardest category for a shopper to price-check from memory. Every argument pointed the same way.
It came out at 36.5%, second-lowest of the six, with the smallest average spread of any category that moves at all. I do not have a clean explanation. My best guess is that produce is priced regionally off a central buy and the local variation happens in what gets stocked rather than in what it costs. A store with worse turnover gets a smaller selection rather than a different price. But that is a guess, and I would rather label it as one than dress it up.
Household goods do not vary at all
Not "barely." Zero. Forty-nine products (paper towels, detergent, soap, foil) held at multiple branches, and every single one had the identical price at every location.
That is such a clean result that my first instinct was that I had broken something. I do not think I have. Household goods are the most directly comparable items in a grocery store: national brands, sealed, identical SKUs, and the ones a customer is most likely to price against a big-box store or an online retailer. A chain that varies its paper towel price by neighbourhood is a chain that gets a screenshot posted about it.
Bakery is the most variable aisle in the store
This one I simply had not considered. In hindsight it makes sense: in-store bakery is genuinely produced locally, with local labour and local waste, and its output is the least comparable thing in the building. Nobody knows what a loaf of store-baked bread "should" cost the way they know what a gallon of milk should cost.
So what is the pattern?
Having thrown out my perishable-versus-shelf-stable theory, here is the one that actually fits the data:
Prices vary between branches in inverse proportion to how easily a customer can check them.
Household goods are trivially checkable and vary by nothing. Bakery and deli are effectively uncheckable and vary the most. Dairy sits high, which is the one that does not fit neatly, since milk is very checkable. Except that dairy is also where the loss-leader gallon lives, and a loss leader is set by local competition by definition.
That is a theory built after looking at the data rather than before, which makes it worth exactly what such theories are usually worth. I would want a second chain and another year before I would defend it hard.
A number I am not going to put in a headline
The largest spread in the dataset is 906%. A product where one branch's price is ten times another's.
That is not zone pricing. That is a bad row: a pack size misread, or a per-pound price stored against a package, or a clearance price captured at one location. There are a handful of those in the tail and they are the reason every number above is a share or a median rather than a maximum.
I mention it because the temptation to write "we found price differences of up to 906% between stores in the same chain" is real, it would be technically defensible, and it would be a lie in every way that matters.
What to do with this if you are not running a database
Three things, and one of them is "nothing."
Do not drive across town for a different branch of the same chain. Half your cart is identical and the half that is not moves by about a tenth. Gas plus twenty minutes beats that comfortably. This is the honest answer for almost everybody.
If two branches are already on your route, the difference is free money. One near work, one near home. You are not making a trip, you are choosing between trips you were making anyway, and over a year it is not nothing.
Assume the bakery and deli prices you remember are from the other store. That is where the variance actually lives. If the bread seemed more expensive than you remembered, you may not be imagining it, and it may not be inflation.
The thing this broke on our end
Worth admitting, since it is the reason I went looking in the first place.
When you search Smopper we need to show you a price at a store near you. For branch-level prices that is straightforward, because we know where the branch is. For region-level prices we know the region, and a region can be large.
What I found while poking at this is that the two shapes were not being filtered by location with quite the same rigour, which meant it was possible to be shown a region-level price from further away than you would want sitting alongside branch-level prices from down the road. Not wrong, exactly. Not as local as it implies, either. That is being tightened.
One more thing
Zone pricing works because nobody has a price history. You cannot notice that a price differs across town if you have no record of what it is across town, and you cannot notice it changed in March if you have no record of March.
That is the whole argument for keeping this data rather than fetching it fresh and throwing it away. A current price answers "what does this cost." A history answers "is this normal," and nearly every useful grocery question turns out to be the second kind.
You can check your own list against the stores actually near you, which is the version of this that is worth something.


