Case study — an omni-channel retailer opening physical stores
What does opening a store do to online sales?
Per-store, per-segment estimates of what a new store does to online spend — with the assumptions behind each one stated, and the stores where the evidence is weaker flagged as such.
- Python
- pandas
- Difference-in-differences
- Cohort analysis
The challenge
An online-first retailer had been opening physical stores, and the board question was deceptively simple: are the stores creating customers, or just moving existing online spend into a more expensive channel? Naive before/after comparisons couldn’t answer it — online behaviour was shifting everywhere, store or no store.
What we did
We built a customer-level analysis spine from years of order history and applied a segmented difference-in-differences design: customers in each new store’s catchment compared against matched customers outside it, before and after opening — cohorted by purchase frequency, recency and pre-period spend, so the effect could differ for loyal customers versus lapsed ones.
The outcome
Instead of one ambiguous average, the retailer got per-store, per-segment estimates: where the evidence pointed to stores growing total customer value, where it pointed to customers shifting channel without spending more, and what that implied for where — and whether — to open next. The estimates come with their assumptions attached, and the stores where the data could not settle the question are marked as unsettled rather than rounded into the average. Store-opening decisions now start from an evidence base instead of a debate.
Synthetic example
No customer data. The shaded gap is the estimated difference between the two groups under matched assumptions — a gap on its own does not establish that the store caused it. Real figures are per store and per customer segment.
How to read this. This demonstrates the method, not a reported customer result.
Working in omni channel retail? Let’s talk.