Sales velocity during stockouts: why your average lies and how to correct it
Units ÷ days counts sold-out days as zero demand, so best sellers measure mediocre. The in-stock-only correction, a worked example, and the worksheet to run it per SKU.
InventoryX is in development and not available today. ClearStock is the live Shopify app.
Sales velocity — units sold per day — is the input every inventory decision runs on, and the standard version of it is biased. Units sold ÷ days in the period treats each day a product was unavailable as a day of zero demand, when it was actually a day of unmeasurable demand. The bias has a direction and a target: it shrinks the measured velocity of whichever SKUs ran out, which are usually your best sellers, which makes them look average and get ordered like average products.
The correction is one line — divide by days the SKU was available to sell — and this article covers why it matters, a worked example, and the worksheet for applying it across a catalog.
The error in one paragraph
A product that sells 10 units on any day it's on the shelf records 0 units on every day it isn't. Those zeros aren't demand data; they're the absence of the ability to sell. Average them in with real demand days and the result is lower than the true rate, by roughly the share of the window the SKU spent unavailable. Nothing subtle is happening — the arithmetic is correct, the denominator is wrong.
Worked example
A mug, MUG-GRN-12, over 90 days:
- Units sold: 559
- Days available to sell: 79 (dark for 11, in two stretches)
- Price: $24; contribution margin after costs and fees: $9.40
| Version | Calculation | Velocity | Reorder point at 40-day p80 lead time + 50 buffer |
|---|---|---|---|
| Naive (calendar days) | 559 ÷ 90 | 6.21/day | 6.21 × 40 + 50 = 298 |
| Corrected (available days) | 559 ÷ 79 | 7.08/day | 7.08 × 40 + 50 = 333 |
Thirty-five units of trigger, erased by a denominator — about five days of selling. And the direction of the error is the dangerous one: you reorder later than demand justifies, then go dark again, and the next calculation is more poisoned because the window now contains more zeros.
The same corrected velocity changes the loss estimate if you price a stockout, and changes days of cover: 171 units on hand is 27.5 days at the naive rate and 24.2 at the corrected one, which is the difference between "still some runway" and "past the PO window."
Why the error concentrates on your best sellers
The bias isn't spread evenly across a catalog. It's rank-ordered against you:
- Fast sellers run out most often. High true demand reaches zero first and most frequently, so the SKUs that matter most accumulate the most zero days. The biggest corrections belong to the most important products.
- Dark days cluster at peaks. Stockouts don't happen in random weeks — they happen in the weeks demand was highest. So the missing data is disproportionately the high-demand days, and the average is depressed most where the true rate was above average.
- The distortion looks like a ranking. Sort a catalog by measured velocity and recently-dark products drift toward the middle, indistinguishable from genuinely average performers. They lose buying attention, shelf space, and promotion slots to products that were merely available.
This is the mechanism behind a familiar complaint among long-running stores: the products they're sure sell best keep ending up under-ordered. The standard reports never separate "sold nothing" from "had nothing to sell," so the intuition has nothing to point at.
The statistical name, and why it matters
Demand during unavailable periods is censored — unobservable because the item couldn't sell. Survival analysis and reliability engineering treat censored observations as missing data and exclude the unobservable period from the denominator; you don't record "no failure" for a machine that wasn't running. Inventory management has known the same thing for decades in academic treatments. Most practical tooling still doesn't apply it, which is why the correction is worth doing deliberately rather than assuming your software handles it.
If you use an inventory app, the question to ask is precise: when you compute velocity, do you divide by days the variant was available to sell? A tool that averages over the period passes the bias straight into its forecasts, reorder suggestions, and days-of-cover figures — and the more your key products run dark, the more wrong it is about the products where being wrong costs money.
The correction worksheet
One row per SKU, one window. Ninety days is a sane default; 30 for trending SKUs; the same window last year for seasonal ones.
| SKU | Units sold | Days available | Naive velocity | Corrected velocity | Gap | Trigger at 40-day lead + 50 buffer (naive → corrected) |
|---|---|---|---|---|---|---|
| MUG-GRN-12 | 559 | 79 | 6.21 | 7.08 | +14% | 298 → 333 |
| BOWL-SAND-01 | 402 | 88 | 4.47 | 4.57 | +2% | 229 → 233 |
| PLATE-WHT-04 | 188 | 55 | 2.09 | 3.42 | +64% | 134 → 187 |
| VASE-BLU-09 | 96 | 90 | 1.07 | 1.07 | 0% | 93 → 93 |
Read the gap column, not the velocity column. A SKU with no dark days shows 0% and needs no attention. A SKU at +64% spent more than a third of the window unavailable — that's not a measurement nuisance, that's a product that has been failing to be in stock for two months, and its entire buying history is built on a rate two-thirds of reality.
The practical priority order is: largest gaps first, then highest revenue. Those are the SKUs where every downstream number — trigger, order quantity, cover, loss estimate — has been wrong in the same direction for months.
Getting days-available without lying to yourself
The correction is easy; the denominator is the work. Three approaches, in increasing order of effort:
Count backwards from snapshots. Export inventory quantity for all variants weekly (Shopify's inventory CSV export does this per location). The files become a dated record: a variant at zero on two consecutive snapshots was unavailable for at least that interval. Six months of Monday exports is a coarse but usable ledger.
Reconstruct from order gaps. If a SKU took no orders for 12 consecutive days and its normal cadence is daily, it was almost certainly unavailable. This works for fast movers and fails for anything lumpy, so use it only as a cross-check.
Keep a dark-day log. One column in the buying sheet: dates the SKU was at zero. Maintaining it takes a minute per incident and gives you an exact denominator. It also tends to reduce future dark days, for the mundane reason that writing them down makes them visible.
Whichever route you take, define "available" as sellable-at-the-location-that-fulfills. A SKU with 40 units stranded at a location excluded from online fulfillment was unavailable to your web customers, and that's what the velocity is measuring.
Where the correction feeds in
Four decisions consume velocity, and all four inherit whatever bias it carries:
- Reorder point — the trigger is velocity × lead time. Understated velocity, later trigger. (The formula, worked.)
- Order quantity — the order-up-to calculation multiplies velocity by days to cover, so the shortfall compounds with the trigger's.
- Days of cover — same division inverted: understated velocity makes stock look like it lasts longer than it does.
- Stockout cost — the loss estimate is dark days × velocity × price, so understated velocity understates the cost of the very problem that caused it. (The method.)
One more consequence worth planning for: correcting velocity raises your calculated inventory requirement, sometimes substantially, on the SKUs with the largest gaps. That's not the correction inventing demand — it's revealing demand you were already failing to serve. Budget for it as a real number rather than treating the change as a spreadsheet artifact.
For clarity on where we sit: this correction is the foundation of what InventoryX is being built around — in-stock-only demand as the first calculation, with everything downstream of it derived from that. It's in development, not a live app, and nothing in this article depends on it: the worksheet above is the whole method, and a spreadsheet gets you the same answer.
Common questions
How do you calculate sales velocity correctly? Units sold divided by days the product was available to sell. A SKU selling 559 units over 90 days with 11 dark days has a velocity of 559 ÷ 79 = 7.08 per day, not 559 ÷ 90 = 6.21. Use the corrected figure for reorder points, order quantities, and cover.
What is censored demand? Demand you couldn't observe because the product wasn't available. Statisticians treat the unavailable period as censored data and exclude it from the denominator rather than recording a zero. In practice: dark days are missing data, not zero-demand days.
Does Shopify compute velocity this way? Shopify reports units sold per variant over a period; it doesn't track days-unavailable per variant or correct velocity for them as of November 2026. The correction is yours to apply — from inventory snapshots, an order-gap reconstruction, or a maintained dark-day log.
Do stockouts really change the average that much? By roughly the dark share of the window. Eleven dark days in ninety is a 12% understatement; a SKU unavailable a third of the window reads two-thirds of its true rate. Because dark days cluster in high-demand weeks, the practical distortion is usually worse than the simple share suggests.
How do stockouts affect a forecast? They bias it down and unevenly, and a forecast inherits the bias rather than fixing it. Best sellers accumulate the most zero days, so their true demand is flattened to something average; lower measured demand produces lower order quantities, which produces the next stockout.
Next step
Run the worksheet on your ten highest-revenue SKUs. Sort by the gap column, and for anything above 10%, rebuild the reorder point on the corrected velocity before your next PO — the trigger has been too low for as long as the dark days have been accumulating.