New iPhone launch Macedonia

System

One launch, three numbers.

Retail asks, Logistics plans capacity, SDM forecasts demand, and all three collide.

Retail ask1,370 Supply cap1,050 Ask over cap320
Zoom in on SDM ->
scroll the journey

Focus

Zoom in: just SDM

Supply and Demand Management rations one capped supply across stores, once a model finds the honest demand behind each ask.

store ask1,370 honest demand1,180 hard cap1,050

Even honest demand tops the cap, so SDM must ration the 1,050.

The data

The three Macedonia stores.

Different sizes, different signals. Preorders lead demand, and a stockout hides the real demand.

Request vs preorders

launch week, 3 stores

preorders lead demand -> the earliest real signal per store

What the data can and cannot say

Preorders leadthey arrive before launch and predict demand
Sales != demanda stockout censors true demand
Spike, then decaydemand peaks in launch week, then falls

Legacy

Manual Excel misses the window.

Six to eight hours to refresh one country by hand, with a dozen countries to launch.

per country, per cycle 6 to 8h one planner, by hand
slow never backtested stale at cutoff

Cumulative manual hours

one planner, every country

past the cutoff: 9 of 12 countries (75%) still stale

Breaks at fleet scale

country × store × SKU
Macedonia: 3 stores exception, by hand the fleet

one spreadsheet, hundreds of cells

Stakes

What if the number is wrong?

Over and under are both costly, and at a launch they are not equal.

Two ways to miss the number

consequences only
Over
  • excess stock
  • tied capital
  • markdowns
  • units another country needs
Under
  • stockout in peak week
  • lost sales
  • customers to a competitor
  • unhappy stores

Excess stock redeploys (at a cost); a launch stockout is a sale gone.

Model

Beat the baseline or don't ship.

One global LightGBM quantile model across all stores and SKUs, benchmarked on WAPE against SeasonalNaive.

Baseline vs the model

WAPE, backtested
Why this model
Many features, nonlinearpreorders, calendar, price
Quantile objectivep10/p50/p90, three fits
Cross-learns thin storesBitola borrows the country
Fast at fleet scalescales to hundreds of cells

Not ARIMA/ETS (per-series, cold on a new launch) or deep nets (data-hungry, overkill).

Calendar

Seasonality, events, and dates.

Launch phase, holidays, paydays, and promos are known ahead, so they become features.

Feature calendar

weeks around launch

Weekly units, illustrative shape.

Competitor moves and weather stay risks, not features, at this horizon.

Source

Sourced from Snowflake, mind the traps.

That 12% only holds if the source is right.

One pull, three traps

planning schema
launch_signals.sqlMacedonia
-- grain: store x week, as-of run
select week, store, retail_request, preorders,
  sell_through, on_hand, eta, stockout_flag, asof_ts
from analytics.planning.iphone_launch_signals
where country = 'Macedonia';
01 Freshness
Data lags the decision
assert fresh within 2h
02 Censored
Sales ≠ demand at stockout
reconstruct from sell_through
03 Leakage
Known at forecast time only
only cols known at run_ts

Evaluate

Prove it, then measure it.

Rolling-origin backtest against the baseline, scored with WAPE.

Rolling-origin backtest

walk-forward, 4 folds
Train past Predict forward Slide, refit Average WAPE
Never random k-fold, it leaks the future

Why WAPE, not MAPE

same forecast, two readings
WAPE12%volume-weighted, honest
MAPE29%blows up on the 290-unit store
Band checks
bias +2.4% slight over coverage 80% band holds ~80% pinball scores p10/p50/p90
WAPE is scale-free; MAPE explodes on zero weeks, MAE cannot compare stores.

Payoff

More demand than phones.

The 1,050 commit splits across the three stores; the 320 ask over cap stays visible.

Country forecast vs cap

launch horizon

Store split

3 Macedonia stores

Monitor

Keep it honest, day after day.

Refresh, gate, watch drift, retrain on a trigger, then learn.

Drift watch, retrain trigger

input drift leads, error confirms

Daily gate

freshness live, accuracy on last close
Freshness 1.2h < 2h PASS
WAPE 12% < 14% PASS
|Bias| 2.4% < 5% PASS
Coverage 81% > 80% PASS
01Refreshsales, stock, preorders
02Forecastbaseline + AI, ~45m
03Gate4 checks, hold or escalate
04Learnsell-through, overrides
Learn feeds tomorrow