A real store's orders, read by our engine.
A real online retailer published every order it took from December 2009 to December 2011, for anyone to study: about £9.8M a year, 5,852 customers, 4,902 products. We gave the orders to our engine, unmodified, and asked it to call what came next using only what came before. Then we opened what happened.
Repeat orders from its customers, the next 26 weeks
- Called
- 7,671
- Happened
- 7,865
2.5% more than called. The engine chose its own cut-off, by a rule written before this study.
Regular customers it named as slipping away
- Named
- 498
- Never came back
- 274
They had spent £318,525 the year before. Of the regulars it didn't name, 80% came back.
Peak-season units of its 200 best sellers, called a month ahead
- Called
- 542,981
- Sold
- 538,415
September to November. 0.8% apart over the quarter; a single month missed by up to 13.9%.
FilmThe store study, told as a film in the founder's voice, will play here.
- 01The store
- 02The engine's own cut-off
- 03The customers slipping away
- 04The peak
- 05Where it missed
It called the next 26 weeks of repeat orders. They came in 2.5% more than called.
Who chose the date. The engine fits its repeat-purchase model on the first three quarters of a store's calendar and calls the last quarter, a rule written into it before this study. Here that put the cut-off at June 7, 2011. We did not move it.
What it is used for. On a client, this call sets what a new customer is worth, and so how much an advertisement can afford to win one. Its best tenth of customers, ranked at the cut-off, placed 43% of the repeat orders that followed.
It named 498 regulars as slipping. 274 never ordered again.
Named in June. Of the 498 it named, 274 (55%) never came back. Of the 1,946 it did not name, 386 (20%) never did.
What they were worth. The 498 had spent £494,622 in the year before the cut-off; the 274 who were lost, £318,525. Named months ahead, that is the money a store can still act on.
It called the peak a month at a time. Over the quarter, 0.8% apart.
| Month | Called on | Called | Sold | Sold against called | Products inside their 80% range |
|---|---|---|---|---|---|
| September 2011 | August 31, 2011 | 144,190 | 161,804 | +12.2% | 130 of 200 |
| October 2011 | September 30, 2011 | 184,451 | 158,807 | −13.9% | 132 of 200 |
| November 2011 | October 31, 2011 | 214,340 | 217,804 | +1.6% | 113 of 200 |
| The quarter | 542,981 | 538,415 | −0.8% |
Where it was right. The quarter's total, 542,981 units called against 538,415 sold. Product by product, it beat "the same month last year" in 3 of 3 months.
Where it missed. A single month was off by up to 13.9%. Against "the same as last month" it was closer in only 1 of 3 months. And each product's 80% range held the real number for 56% to 66% of products, not 80%: the ranges were too narrow, and we say so.
We did not publish a price finding. This store sells wholesale as well as retail, so its price per unit falls as an order grows; an elasticity read from its average prices would measure that discount, not demand.
The data, the method, and what this study cannot show
- The data: "Online Retail II", every order line a UK online retailer took from December 2009 to December 2011, 1,037,081 lines in 39,516 orders, published by the UCI Machine Learning Repository under CC BY 4.0 (Chen, D., 2012, doi:10.24432/C5CG6D). The store is not named in it and is not a client.
- Cleaning: cancelled orders, zero-priced lines and lines that are not products (postage, fees, adjustments) are left out. Customers are the ones the data numbers, 87% of sales; 86% of sales went to the UK.
- Call 1 and Call 2: the engine's repeat-purchase model (models/clv.py, BG/NBD), unmodified, one order a customer a day.
- Call 3: the engine's demand forecast (models/forecast.py, with its seasonality), unmodified; each month's call used the 200 best sellers by sales to date.
- The script: engine/scripts/store_case_study.py writes data/store-study.json; the page prints nothing it does not compute.
- What this cannot show: profit. The data has no costs, no advertising and no stock levels, so every call here is about customers and units, never about margin, and none of it is a result for anyone.
Your mental model is linear. Your costs are a staircase.
A P&L is an average. It tells you what fulfilment cost across everything you shipped. It cannot tell you that one SKU sits an ounce past an edge, because the cheaper version of it never shipped.
A cliff only shows up as a counterfactual: what the same unit would cost an ounce lighter, or a cent cheaper. No report anyone sells contains one, so your tools, your agency and your bookkeeper all miss the same leak at once.
On Amazon, the steps are imposed on you. The fee card moves at every weight band, every price band and every size tier, and a unit one ounce past an edge pays the whole step.
On Shopify, you built them. The parcel you pack meets the carrier's pound line, the compare-at you set is a discount on every order, and the free-shipping line is a step you drew yourself.
Your agency is paid on spend.
Your software is paid to report.
We're paid on proof.
Less than an ounce past the edge. Paid on every unit.
A car-care brand · one listing · Automotive
$6,400 to $19,200 a year, paid on one step of Amazon's fee staircase.estimate
Its best-selling paint scratch remover lists an item weight of 8.8 ounces. Above 8, every unit pays $0.26 more to fulfil, $0.28 from October 15, on an estimated 3,500 units a month.
FilmThe case study, told as a film in five beats, will play here.
- 01The staircase
- 02Where this listing sits
- 03The counterfactual
- 04Ten thousand months
- 05The cliff
Each faint line is one simulated year of profit. The band holds eight years in ten, the bad end included.
At day 271, Amazon's aged-inventory surcharge goes from $1.50 to $5.45 a cubic foot. Each band shows what 1,000 of these units cost to store a month at that age.
We picked this listing because it had a finding. Of 1,856 Amazon brands we've modeled from public pages, 1,473 showed nothing worth fixing. We say so.
Method, assumptions, and what public data can't see
- Read from the listing's public page on September 3, 2026: price band, item weight, dimensions (large standard size) and sales rank (top 100 in Automotive). Priced on September 30, 2026.
- Fees: Amazon's published 2026 US fulfilment schedules, January 15 to October 14 and October 15 to January 14, plus the 3.5% fuel and logistics surcharge; a 12% referral fee.
- The item weight is a floor. Amazon bills the packed weight, so the unit sits at least this far past the edge.
- Volume: about 3,500 units a month from the public sales rank, a curve that can be wrong by half or double; simulated that wide. This one listing: an estimated $0.5M to $1.6M a year in sales.
- Landed cost: assumed at 25% of price, drifting 10% either way each month. No public page shows it.
- Simulation: 10,000 years of twelve months from October 2026, each month on the card in force. Year-end profit: P10 $230,000, median $402,000, P90 $687,000.
- Storage and aged-inventory rates: Amazon's schedule effective January 15, 2026.
- What public data can't see: advertising, returns, the real landed cost, the packed weight, and how long each unit has sat.
Rather run it yourself first? Every step of this case study is taught free: The Fee Staircase course →
Selling on Shopify? This listing is an Amazon one, because Amazon's pages are public. Your store's steps are in your own exports, and two free courses run on them today: The Price Curve and Capital & Cash.