Measuring cannibalization before you sign a lease
Use before/after Huff runs to separate net new visits from visits transferred away from your own stores and competitors.
The most expensive mistake in network expansion rarely shows up as a bad store. It shows up as a good store that made two other stores worse. The new location hits its forecast, the regional total barely moves, and a year later someone runs a same-store sales report and finds out where the visits came from.
Cannibalization can be measured before you sign. Here is how MapDove does it and how to read the results.
Before and after, same model
The method is simple and deliberately symmetric. MapDove runs the category’s Huff model for the city twice:
- Before: every existing store, no candidate.
- After: the same stores plus the candidate, with attractiveness
(sqft / base_sqft)^0.7 × brand_strength.
For each existing store j, the modeled demand it captures is summed across every hex in its trade radius. Its change is converted to visits using the same calibration factor k that produces the headline forecast:
Δvisits_j = k × (E_after,j − E_before,j)
k is the ratio of observed average daily visits in the last 90 days to modeled expected demand, across the existing stores in that city and category. Since the forecast and the losses share one k, they are directly comparable. A candidate forecast at 400 visits a day and total losses of 300 a day means 300 of those 400 visits are transferred.
Where net new visits come from
This point is the core of the method, and people often miss it.
In MapDove’s Huff formulation each hex has an outside option with utility u0 = 1 / (0.6 · R)^λ. It represents the trips residents make somewhere the model doesn’t track: another city, home, or an untracked format. When the candidate opens, it takes share from the existing stores and from the outside option. Only the second part is genuinely new to the category.
predicted visits = transferred from existing stores + net new (from the outside option)
net new = predicted visits − total cannibalized
The implication is structural. In dense, well-served markets the outside option is small, so most of a new store’s visits are transferred. In thinly served growth areas, a much larger share is net new. The model is telling you what experienced operators already know: infill in a saturated core mostly moves customers around, while the frontier creates them.
Reading the impacted list
The Huff result includes total cannibalized daily visits across all stores in the category, plus the most affected stores (up to ten, with a loss of at least half a visit per day). For each one you get:
- distance from the candidate,
- current average daily visits,
- the modeled change in daily visits and as a percentage.
The list includes competitors as well as your own stores. That distinction is the whole point:
| Source of the candidate’s visits | Effect on your network |
|---|---|
| Your own existing stores | Cannibalization, a cost to you |
| Competitors’ stores | Share gain |
| Outside option | Category growth (net new) |
Filter the impacted list by brand. Suppose a Bean Republic candidate takes 120 visits a day from Copperline Coffee and 60 from two Bean Republic stores. Its network value is about the forecast minus 60, not the forecast minus 180.
An illustrative example
Picture a FreshCart Market candidate on the growth edge of a Sunbelt city. Grocery uses λ = 1.8 and a 9 km trade radius. The model returns:
- predicted daily visits: 1,450
- total cannibalized: 980, so about 470 net new per day
- impacted: a competitor 2.1 km away (−410, −18%), FreshCart’s own store 3.4 km away (−260, −11%), another competitor 4.8 km away (−150), and smaller losses beyond
FreshCart’s own-network loss is about 260 visits a day plus whatever smaller own-brand losses appear further down the list. The question for the committee is whether a store with 1,450 daily visits, of which roughly 1,190 are new to FreshCart, justifies the rent. It is not whether 1,450 is a good number. These figures are illustrative and drawn from synthetic demo parameters, but the framing transfers directly to a real decision.
Also watch the percentage column. An 11% loss at a store already near break-even matters more than a 15% loss at a flagship with headroom.
Ways to reduce cannibalization
- Move the pin. Distance decay is steep. Shifting a candidate 1–2 km away from your own store often cuts own-brand losses sharply while keeping most of the forecast. Compare variants side by side with compare sites.
- Change the format. A smaller floor plate lowers attractiveness through the 0.7 exponent, which reduces both the forecast and the draw from nearby stores.
- Use suitability spacing. Setting the MCDA minimum spacing near your format’s typical p50 trade area distance keeps shortlists from piling up in one place.
- Consider relocation. If an existing store loses 30% or more to a candidate, the real question may be whether to move it.
Limits worth stating
The model holds k and the existing stores’ attractiveness fixed, so it doesn’t capture competitor responses, promotions, or loyalty programs that blunt switching. It reads distance as straight-line, not drive time. Use it to rank and size options, and combine it with drive-time catchments and local knowledge.
Practical takeaways
- Report three numbers, not one: predicted visits, own-brand cannibalization and net new.
- Filter the impacted list by brand. Losses at competitor stores are gains for you.
- Expect high transfer in saturated cores and treat a high net-new share there with skepticism.
- Test pin moves and floor plate variants before you negotiate.
See the cannibalization docs for the full output schema.
All figures shown on this site come from MapDove’s synthetic demo dataset, modeled from neighborhood-level parameters. No real device data is used.
Back to the blog