Pull 90 days of sales for a product and the math looks easy. It sold 180 units, so it sells 2 a day. You can order against that number and move on.
Except the product was out of stock for 30 of those 90 days. On the days it actually sat on the shelf, it sold 3 a day. The forecast is understated by a third before anyone opens a spreadsheet, but nothing in the report looks wrong.
The cause is simple: A stockout day records zero sales, and most forecasting math treats that zero as a fact about demand. The zero is really a fact about supply.
What a zero on the sales report actually means
Sales history doesn’t measure what customers wanted to buy. It measures what they were able to buy. Statisticians call this censored demand, and you can forget the term as long as you keep the idea: a zero on the ledger can mean nobody wanted the product, or it can mean nobody could get it. The spreadsheet shows the same zero either way.
A zero on the sales report can mean nobody wanted it, or nobody could buy it. The spreadsheet shows the same zero either way.
Multi-location merchants feel this harder than anyone. A product can look healthy at the company level while one location runs dry for weeks. The aggregate report stays green. Meanwhile that location’s sales history is quietly filling up with zeros that have nothing to do with demand.
There’s a second distortion hiding in the same event. When shoppers hit an empty shelf, some buy a similar product instead, which pads the substitute’s history with demand it didn’t really earn. Many don’t substitute at all. Daniel Corsten and Thomas Gruen studied more than 600 retail outlets and found stockouts cost far more than retailers assume; they titled the writeup “Stock-outs cause walkouts” for a reason. One empty shelf corrupts two products’ data at once.
The doom loop: how one stockout causes the next
Here’s the mechanism, step by step:
- A product stocks out at your busy location.
- Zero-sale days pile up and drag down its average.
- The forecast for that location shrinks.
- Less stock gets allocated or transferred there next cycle.
- It stocks out faster than before. Repeat.
Each pass through the loop makes the data more wrong, and the data is what everyone trusts. Nobody decided to starve the busy location. The numbers did it on their own.
The cruel part is which products this hits. The better something sells, the more often it stocks out, so the more its history understates it. Slow movers never sell out, which means their forecasts stay clean. You end up most wrong about the products that matter most.
Your winners are systematically under-forecast. Your slow movers are forecast almost perfectly.
How to spot a distorted forecast
You don’t need new software to diagnose this. An hour with your own data will do it:
- Pick your five best sellers and count their out-of-stock days per location over the last 90 days. More than a handful, and the flat average is lying to you.
- Compare the sell-through rate on in-stock days against the overall average. The gap between those two numbers is the distortion, measured.
- Watch for a product whose forecast keeps falling while customers keep asking about it. That contradiction is the classic symptom.
- Check location-level numbers, not company totals. The distortion lives at the location level, and totals smooth it over.
One caution while you’re in there: don’t “fix” a distorted forecast by overriding it with gut feel across the board. The goal is to find which numbers are poisoned, then correct those specifically.
Correcting for it
The manual fix is straightforward. Divide units sold by in-stock days rather than calendar days, per product, per location. A product that sold 180 units across 60 available days sells 3 a day, and that’s the number worth ordering and transferring against. It pairs with the weighted-history approach we covered in the forecasting guide: recency weighting fixes which sales matter most, and availability correction fixes which days count at all.
The more durable fix is upstream. Every stockout day you prevent is a zero that never enters your history, so next quarter’s forecast starts honest. That’s the job BeeBalanced was built for. It shows stock and forecasted sales for every product at every location, over a forecast period you set yourself, and sorting the table by depletion surfaces which products will run out soonest. From there it generates draft transfers in Shopify, or a CSV if you’d rather review in a spreadsheet first, so stock reaches the busy location before the zeros start.
The loop runs in reverse just as well. Fewer stockouts produce cleaner data, cleaner data produces better forecasts, and better forecasts prevent the next stockout.
The takeaway
Forecast accuracy problems usually get blamed on the model. More often the model is fine and the inputs are dishonest, because a third of the “demand” it learned from never had a chance to happen.
Honest inputs beat a fancier model.
Count only the days a product could actually sell. Forecast per location, not in aggregate. And move stock before the zeros pile up, whether you do that with a spreadsheet or let a 14-day trial of BeeBalanced do the counting for you.