Case study 03 · Demand signal & external data
Two problems that look unrelated. One: the items you stock out of teach the forecast to buy less of them. Two: in a seasonal category, the variables that move demand are measured publicly, weeks before the orders arrive — and almost nobody wires them in.
A forecast is only as honest as the history it learns from, and most demand history has a systematic hole in it that nobody accounts for. Fix that hole and you improve every downstream number. Then, separately, stop treating the outside world as unknowable — a surprising amount of it is published weekly, for free, ahead of the demand it explains.
Here's the mechanic. A customer wants an item. It's out of stock. Depending on how the order gets taken, one of two things happens: the line is never entered at all, or it's entered and immediately zeroed. Either way, the demand history for that item, that week, that customer records a number lower than the truth — often zero.
The forecast then learns from that history. It sees weak demand and recommends carrying less. You stock out again, record another suppressed number, and recommend less again. This is censored demand, and it is a self-reinforcing loop that quietly starves your best-selling items in favor of items that were always available and therefore always fully recorded.
The items you're worst at are the ones your forecast is most confident you don't need.
It also corrupts the service metric in the same direction. If the shortfall never reaches an order line, your fill rate never sees it — so the number improves precisely because you failed. A company can drive reported service up by being reliably out of stock on the same items long enough for people to stop asking.
There's no clever statistical repair for data you never captured. The fix is upstream, in how orders get taken: enter the customer's full intended order, then cancel the unfillable lines with a reason code. Now the demand exists in the history, the shortfall is attributable, and both the forecast and the fill rate see what actually happened.
The standard objection is that it puts extra keystrokes on a customer service rep, and that the cancelled lines will confuse the forecasting system downstream. The first is real and small. The second used to be a valid architectural objection — and at this company it had stopped being true, because the forecasting platform now consumed order-line history through extracts rather than net shipments. The old objection had outlived the constraint that produced it, which is worth checking any time someone tells you a workflow can't change.
We piloted it with a single key account and a single willing planner, deliberately. Process changes that touch order entry either prove themselves on a small surface or die in a committee.
The category was seasonal and weather-driven, which everyone knew and nobody had operationalized. "It was a cold spring" is a post-hoc explanation offered in a February review meeting. The same information exists as degree-day data, published continuously, weeks ahead of the orders it explains.
Three external series were wired into the demand model:
The methodological point is the one I'd defend hardest: the lead-lag was measured, not assumed. It's easy to declare that permits lead demand by a quarter. It's more useful to scan the actual relationship across a range of lags and let the data say which series moves first and by how many weeks — for your regions, your product groups, your customers. Sometimes the answer is "not at all," and knowing that is worth as much as a strong signal, because it stops a plausible story from becoming a planning assumption.
The analytical layer built for this ran STL decomposition to separate trend from seasonality, correlation matrices across internal and external series, lead-lag scans, anomaly detection at three sigma, cohort retention and k-means account segmentation — with a natural-language query layer over the whole dataset so a planner could ask a question without writing SQL.
Censored demand is universal. Any business that ever runs out of something has it, and almost none of them correct for it. The fix is always a process fix at the point of capture, and it's always cheap relative to what it recovers — which makes it one of the first things I look for in a diagnostic.
The external signals are category-specific and the specific three here won't be yours. What transfers is the discipline: identify the handful of published series that plausibly drive your category, wire them into the same nightly pipeline as your internal data so they arrive without anyone touching them, measure the lag empirically, and then keep only the ones that survive measurement. Most won't. The two or three that do stop being interesting charts and start being early warning.
Next step
If the answer is "demand for those is soft," it's worth checking whether that's true or whether it's the loop.