EggAI · Range review forecasting · launches and delists
Replace the two guesses in a range scenario, new-product sales and delist transfer, with forecasts built from real shopper behaviour.
Amity · tested on held-out data from the retailer's loyalty card, 2026.
Every range scenario starts from current sales, takes away the delisted products, then adds two numbers nobody really knows: how much of the lost sales transfers to other products, and how much the new products will sell. Neither guess knows which customers buy the products involved.
Illustrative sales bridge of a typical range-optimisation scenario. Neither guess knows which customers buy the products involved.
We tested on real range changes from the retailer: product launches and delists, each with the real outcome known.
Test events fall between 2 Mar and 1 Jun 2026. Learning and test events cover the same months; they are kept apart by product and by shopper.
| Launch | Detail |
|---|---|
| Product | Colgate Total Enamel Strength 150 g |
| Category and launch | Toothpaste · 119 THB · launched 27 Apr 2026 · sold in 877 stores |
| Target list | 1,000 target shoppers, across 579 stores |
| Busiest store | Hypermarket · 15 target shoppers |
| What happened | 15 bought it within 8 weeks |
| Our forecast | 19.6 buyers |
| Delist | Detail |
|---|---|
| Product | Meiji Greek Style Yoghurt Mango 500 g |
| Category and delist | Yoghurt · 89 THB · delisted 18 May 2026 · was sold in 537 stores |
| Target list | 300 recent buyers, across 236 stores |
| Busiest store | Hypermarket · 8 buyers |
| What happened | 95 left the category within 8 weeks |
| Our forecast | 103.5 leavers |
Retailer's loyalty card 100k-household panel. Store = where the shopper bought the delisted product, or their home store for launches.
One forecast per shopper (a chance, e.g. 31%), added up per product (sections 07–08), per store group (05–06) or per format in THB (04).
From the 100k loyalty card households. A launch: 1,000 shoppers of the category. A delist: the product's recent buyers (up to 300).
12 facts from their last 8 weeks of receipts: trips, spend, discounts, category trips, spend and recency, the product's price.
Our model gives every shopper a chance: will they buy the new product, or leave the category? It learned from 1,446 past range changes. No retraining per product.
Sum the chances per store and format = expected buyers or leavers. × spend per buyer = THB, the bars in section 04.
| Meiji Greek Style Yoghurt Mango 500 g | Shopper A | Shopper B | Shopper C |
|---|---|---|---|
| Usual store | Hypermarket | Hypermarket | Mini super |
| Trips, last 8 weeks | 14 | 12 | 8 |
| Spend, last 8 weeks | 5,700 THB | 29,900 THB | 4,400 THB |
| Yoghurt trips | 9 | 3 | 1 |
| Yoghurt spend | 1,410 THB | 370 THB | 90 THB |
| Yoghurt products bought | 8 | 3 | 1 |
| Days since last yoghurt | 2 | 14 | 50 |
| Our forecast: leaves yoghurt | 3% | 31% | 75% |
| What happened (8 weeks) | stayed | stayed | left |
All 300 buyers added up: forecast 104 leave · actual 95
Real receipts from the retailer's 100k-household panel; values rounded, no customer IDs. The model learned from other products and other shoppers than the ones it forecasts.
Store-level forecasts for 19 real range changes against what actually happened. Each card shows the net change in sales (delisted products, transfer to other products, new launches) and how far each method missed it.
Delisted sales, actual -121.9k · Net change, actual -32.5k
Delisted sales, actual -34.3k · Net change, actual -9.8k
Delisted sales, actual -25.0k · Net change, actual +0.2k
Why the totals look small: they count only the 19 products that changed (11 launches, 8 delists, Jan–Jun 2026), over 8 weeks, for a sample: the 100k-household panel, 1,000 shoppers per launch and up to 300 buyers per delist. Scoring every customer gives real store totals; the error rates carry over. Transfer = the delisted product's sales from shoppers who stayed in the category. Tool rule = one flat transfer rate and the group-average adoption. GBDT = LightGBM on the same inputs, calibrated. Left out: a deli-counter roast chicken and a fabric-softener basket.
New-product sales in the 8 weeks after launch (THB), split by format and by store group. 11 real launches. Actual = what really sold.
| Store group | Actual | Our model | GBDT (standard ML) | Tool rule |
|---|---|---|---|---|
| Hypermarket · 228 stores | ||||
| Busiest 62 stores · 2,501 shoppers | 2.7k | 3.5k +30% | 4.9k +82% | 4.7k +72% |
| Other 166 stores · 2,523 shoppers | 4.2k | 3.7k -12% | 4.9k +16% | 4.7k +11% |
| Supermarket · 178 stores | ||||
| Busiest 46 stores · 741 shoppers | 0.6k | 1.1k +72% | 1.4k +121% | 1.4k +119% |
| Other 132 stores · 752 shoppers | 1.1k | 1.2k +10% | 1.4k +36% | 1.4k +32% |
| Mini supermarket · 1,645 stores | ||||
| Busiest 414 stores · 2,241 shoppers | 3.6k | 3.4k -5% | 4.2k +17% | 4.2k +17% |
| Other 1,231 stores · 2,242 shoppers | 2.7k | 3.4k +25% | 4.2k +55% | 4.2k +56% |
Busiest = the fewest stores holding half of the format's target shoppers. Shoppers counted at their home store. Tool rule = average adoption × spend per buyer of the other test launches. In buyer counts the three are closer (miss 36 / 61 / 40 buyers). Totals are small because they cover only the launched SKUs in a panel sample (see section 04).
Customers who left the category within 8 weeks of the delist, split by format and by store group. 8 real products cut. Actual = what really happened.
| Store group | Actual | Our model | GBDT (standard ML) | Tool rule |
|---|---|---|---|---|
| Hypermarket · 226 stores | ||||
| Busiest 67 stores · 688 shoppers | 242 | 223 -8% | 192 -21% | 188 -22% |
| Other 159 stores · 689 shoppers | 215 | 217 +1% | 189 -12% | 189 -12% |
| Supermarket · 150 stores | ||||
| Busiest 39 stores · 195 shoppers | 57 | 61 +6% | 54 -6% | 53 -7% |
| Other 111 stores · 199 shoppers | 61 | 64 +5% | 56 -7% | 55 -11% |
| Mini supermarket · 477 stores | ||||
| Busiest 184 stores · 292 shoppers | 80 | 70 -12% | 64 -19% | 82 +2% |
| Other 293 stores · 293 shoppers | 74 | 71 -4% | 67 -9% | 83 +12% |
Busiest = the fewest stores holding half of the format's buyers of the product. Shoppers counted where they bought it. Tool rule = one exit rate for every product (the average of the other test delists). In THB of sales walking out: miss ours 4.0k · GBDT 7.8k · tool 9.7k. Totals are small because they cover only the delisted SKUs in a panel sample (see section 04).
A second, larger test: 30 brand-new SKUs, Jan–Jun 2026, scored against the whole 100k panel.
70 earlier launches from the retailer, Feb–Oct 2025
30 new SKUs launched Jan–Jun 2026, each in 50+ stores
Every one of the 100k households scored for every launch, from their 8 weeks before
Real buyers of the exact SKU in the 8 weeks after: 281 in total, about 9 per launch
Why it matters: the tool rule and standard ML forecast 2–3× too many buyers (overstock). Ours runs ~40% low but steadily: one monthly level check fixes it.
A separate, larger test from sections 02–06: brand-new SKUs, the whole 100k panel. Average miss per launch: ours 7.7 buyers per 100k households, GBDT 16.7, logistic 14.1. All methods learned from the same 70 launches. Tool rule = average existing SKU in the same category × a factor learned from those 70 launches.
Real products the retailer cut in 2026. For each, the share of its recent buyers who left the category, against what really happened. Axis 0 – 60%.
Busiest store: Hypermarket · 4 buyers, 2 left · ours 1.7 · slider 1.2
Busiest store: Hypermarket · 8 buyers, 4 left · ours 3.1 · slider 2.2
Busiest store: Hypermarket · 6 buyers, 4 left · ours 2.7 · slider 1.5
Left = no purchase in the category in the 8 weeks after the cut. Slider = one value for every product, the average of the other test delists, all categories (25–30%). Same 8 delists as sections 04 and 06; busiest store = most buyers of the product. A store has only a handful of buyers, so single stores are noisy.
How to read this section. Ranking score: pick one real buyer and one non-buyer at random; how often does the model score the buyer higher? 0.5 = coin flip, 1.0 = perfect. Size error: how far the forecast number of buyers is from the real number.
So what: for picking who to target, standard ML is about as good. For how many will buy, the number a retailer plans stock and space with, ours has half the error (sections 04–08).
Ranking score = AUC, averaged per launch. A simple logistic model is close on newly ranged products (0.696) and ranks delist leavers slightly better than ours (0.733 vs 0.702).
Three real delist events, forecast of the sales that stay in the section (transfer) against what the retail analytic platform's own range tool predicted and what actually happened.
Actual transfer: 194,574 THB
| Model | Transfer predict (THB) | Miss (THB) | % miss | Ranking (AUC) |
|---|---|---|---|---|
| Retail analytic platform | 128,670 | −65,904 | −34% | — |
| EggAI-v0.1 Pretrained Model | 214,799 | +20,225 | +10% | 0.761 |
| EggAI-v0.1 (with our harness) | 202,515 | +7,940 | +4% | 0.771 |
| EggAI-v0.2 Pretrained Model with Thinking - Low | 205,949 | +11,375 | +6% | 0.749 |
| EggAI-v0.2 Pretrained Model with Thinking - High | 204,268 | +9,694 | +5% | 0.788 |
Delist · 4,120 loyalty card buyers · transfer measured 20 Apr – 14 Jun 2026. Transfer = sales of the delisted product kept because buyers still bought Dairy & Drinks at any of the retailer's stores in the 8 weeks after the cut (actual 61.9% of 314,502 THB). EggAI-v0.1 (with our harness): strict version, everything the model saw is dated before 20 Apr 2026. EggAI-v0.1 Pretrained Model and EggAI-v0.2 with Thinking learn from 8 other delist events, some measured after 20 Apr.
Delist · 5,439 loyalty card buyers · transfer measured 2 Mar – 26 Apr 2026
Actual transfer: 1,008,193 THB
| Model | Transfer predict (THB) | Miss (THB) | % miss | Ranking (AUC) |
|---|---|---|---|---|
| Retail analytic platform | 592,690 | −415,503 | −41% | — |
| EggAI-v0.1 (with our harness) | 877,040 | −131,153 | −13% | 0.724 |
| EggAI-v0.2 (with our harness) | 909,616 | −98,577 | −10% | 0.780 |
Within ±10% of actual is good, off by more than 20% is poor; highlighted = closest to actual. Retail analytic platform = transfer from the retailer's range tool. Transfer = sales of the delisted product kept because buyers still bought the same section at any of the retailer's stores in the 8 weeks after the cut. EggAI-v0.1 / v0.2 (with our harness): strict versions, everything the model saw is dated before the event date (learned from ~100 older delist events whose outcomes were known by then).
Delist · 4,800 loyalty card buyers · transfer measured 18 May – 12 Jul 2026
Actual transfer: 356,907 THB
| Model | Transfer predict (THB) | Miss (THB) | % miss | Ranking (AUC) |
|---|---|---|---|---|
| Retail analytic platform | 399,070 | +42,163 | +12% | — |
| EggAI-v0.1 (with our harness) | 370,991 | +14,084 | +4% | 0.729 |
| EggAI-v0.2 (with our harness) | 371,266 | +14,359 | +4% | 0.747 |
Within ±10% of actual is good, off by more than 20% is poor; highlighted = closest to actual. Retail analytic platform = transfer from the retailer's range tool. Transfer = sales of the delisted product kept because buyers still bought the same section at any of the retailer's stores in the 8 weeks after the cut. EggAI-v0.1 / v0.2 (with our harness): strict versions, everything the model saw is dated before the event date (learned from ~100 older delist events whose outcomes were known by then).
EggAI · Range review forecasting · 2026 · Amity