Replenishment systems systematically under-order the products that sell best. Not through poor implementation, but through an assumption buried in the arithmetic — one that inventory theory identified fifty years ago and most software still ignores.
Every replenishment system in commercial use rests on a single calculation: how fast does this product sell? Everything downstream — when to reorder, how much to buy, what to clear, what to discontinue — inherits whatever that number says. It is worth being precise about how it is usually computed, because the conventional answer contains a flaw that grows more damaging the more products you carry.
The conventional answer is units sold divided by days elapsed. It is not obviously wrong. It is wrong in a specific way, for a specific class of products, and that class turns out to be the most valuable one you own.
The mathematics of when and how much to order is older than operations research as a discipline. In February 1913 a production engineer named Ford Whitman Harris published a short article in Factory, The Magazine of Management working out the lot size that balances the cost of setting up a production run against the cost of holding what it produces.[1] The result is the economic order quantity, still taught in every operations textbook, still the first formula anyone learns.
Harris was solving a deterministic problem: known demand, known costs, find the optimum. Real demand is not known, and the theory that followed spent decades dealing with that. In 1951 Arrow, Harris and Marschak set out the problem of optimal inventory policy under uncertainty in Econometrica,[2] and the 1958 Stanford volume by Arrow, Karlin and Scarf established much of the machinery still in use.[3] In 1960 Herbert Scarf proved that under quite general conditions the optimal policy takes a simple form: when stock falls to a level s, order up to a level S.[4]
That result is why nearly every replenishment system, including this one, looks broadly the same. There is a trigger and there is a target:
The review period matters and is frequently omitted in practice. An order has to last until the next order arrives, not merely until this one does. A buyer ordering monthly with a two-week lead time needs today's delivery to cover thirty days of demand, not fourteen. Systems that size to lead time alone leave a predictable gap at the end of every cycle, and the gap is usually blamed on demand rather than on arithmetic.
None of this is controversial. The theory is a century old, well understood and largely settled. Which raises an obvious question: if the ordering policy is a solved problem, why do catalogues keep running out of their best products?
Because every formula above takes demand rate as an input. The theory tells you what to do with the number. It does not tell you how to get it.
The classical models were built with a particular kind of inventory in mind: a manufacturer holding a few hundred part numbers, each consumed steadily, each with enough sales history to estimate a rate with confidence. Demand is treated as a random variable with a stable mean, and the interesting question is how much buffer to hold against its variance.
A modern accessories catalogue does not look like that. Consider one we can describe precisely: roughly 226,000 SKUs of phone and watch accessories — cases, straps, screen protectors, chargers — sold across thirteen European markets. Its sales distribution over a ninety-day window looks like this:
| Units sold in 90 days | Share of SKUs | Share of units shipped |
|---|---|---|
| None | 77% | 0% |
| 1–3 units | 21% | 70% |
| 4 or more | 2% | 30% |
Read that second row again. The products selling one, two or three units in a quarter are not a fringe to be managed by exception — they ship the majority of the units. This is the long tail in its literal sense, and it breaks the assumptions of the classical model in three ways at once.
The sample is tiny. Estimating a rate from three observations is fragile in a way that estimating it from three hundred is not. Any method that smooths history needs history to smooth.
Demand is intermittent, not merely variable. The classical model assumes demand occurs every period and varies in size. Here most periods have no demand at all, and the interesting variation lies in the gaps between sales as much as in their size.
Stock is thin. A product held one or two units deep is unavailable for a substantial fraction of any period simply because it sells out and waits for the next delivery. This third point turns out to be decisive, and we will return to it.
The forecasting literature took intermittency seriously long before retail software did. In 1972 J. D. Croston published a method in Operational Research Quarterly that remains the standard reference.[5] His insight was that applying exponential smoothing directly to a series full of zeros produces poor estimates and, worse, revises the forecast downward on every zero period — precisely when nothing has been learned.
Croston's method decomposes demand into two separate series: the size of each demand event, and the interval between events. Each is smoothed independently and the forecast rate is their ratio. It updates only when a demand occurs. It is elegant, it is implemented in SAP and in most serious forecasting packages, and it is demonstrably better than exponential smoothing for sporadic series.
The subsequent literature refined it considerably. Syntetos and Boylan identified a bias in the original estimator and proposed a correction now known as the Syntetos–Boylan Approximation.[6] Teunter, Syntetos and Babai later proposed updating the probability of demand rather than the inter-arrival interval, which handles obsolescence better — a product that stops selling entirely is otherwise slow to be recognised as dead.[7] Willemain and colleagues tested Croston's method against exponential smoothing on industrial data and found it superior.[8]
So the tools exist, they are mature, and they are available. And they do not solve the problem this paper is about — for a reason that has nothing to do with their quality.
Every method in this family estimates demand from observed sales. If the sales record does not faithfully represent demand, a better estimator produces a better estimate of the wrong thing.
When a product is out of stock, the sales record for that period reads zero. But zero sales and zero demand are not the same event, and no amount of statistical sophistication applied to the sales series can separate them, because the information is not there to recover.
Statisticians call this censored data. An observation is censored when you know it falls above or below some threshold but not its actual value. Sales during a stockout are censored from above: demand was at least the number of units you had, and you have no idea how much more. Treating that figure as demand understates it — always, and by an unknown amount.
This is not a new observation. Conrad addressed the estimation of demand from sales data in 1976.[9] Nahmias worked through demand estimation in lost-sales systems in 1994.[10] Agrawal and Smith developed methods for estimating negative binomial demand in retail with unobservable lost sales in 1996.[11] There is a substantial literature beyond these: Bayesian updating under censoring,[12] nonparametric approaches, and work on stockout-based substitution where demand does not vanish but transfers to another product.[13] Anderson, Fitzsimons and Simester examined the costs of stockouts directly.[14]
The theory, in other words, has known about this for half a century. What is striking is the gap between that literature and the software people actually buy. Replenishment systems overwhelmingly compute a rate from shipped units and elapsed days, and the correction — where it exists at all — takes the form of a manual override field.
The methods that best handle sporadic demand are the ones most damaged by censoring, because a stockout is indistinguishable from a gap between customers.
Croston's method deserves specific attention here, because its failure mode is instructive rather than merely unfortunate. The method works by measuring intervals between demand events. A product unavailable for forty days produces a forty-day interval containing no demand, which the method reads as evidence of sporadic demand and folds into its estimate of the inter-arrival time. The interval estimate lengthens. The forecast rate falls.
The result is perverse: a product is reclassified as intermittent because it sold out, and it sold out because it was popular. The better the product, the stronger the effect. Nothing is malfunctioning — the method is doing exactly what it was designed to do, with data that misrepresents what happened.
The architectural conclusion follows directly. Censoring should be corrected before the choice of forecasting method, not after. It is a data problem, not a modelling problem. Correct it, and Croston's method, the Syntetos–Boylan approximation, a Poisson model or a plain moving average all perform better on the corrected series than any of them do on the raw one.
Censoring in a replenishment system is not a one-off measurement error. It compounds, because the system's output determines its next input.
Follow a single product through two cycles. It holds two units. Both sell in the first week. For the remaining eighty-three days of the quarter it has nothing to sell and records nothing. At the review point the system computes 2 ÷ 90 = 0.022 units per day, concludes the product is nearly dormant, and either declines to reorder or orders a single unit. The next quarter produces the same record. The quarter after that confirms it. The product is now, as far as the system is concerned, a slow mover — and the evidence for that conclusion was generated by the conclusion itself.
Now consider what a human buyer sees: a product that sells out immediately every time it arrives. These two views of the same product are not merely different, they are opposite. The buyer's instinct is right and the system's arithmetic is wrong, which is why experienced buyers override replenishment systems, and why those overrides cluster on exactly the products the system misreads worst.
At a few thousand SKUs this is a manageable irritation. At two hundred thousand it is not a workload but an impossibility — and the errors left uncorrected are, by construction, concentrated in the fastest-selling products.
The correction Stockmind applies is conceptually simple and deliberately unclever. Rather than inferring lost demand from a model, it measures the one quantity that makes the sales record interpretable: how many days the product was actually available to sell. We call that figure its ShelfDays.
A product in stock for the whole ninety-day window has 90 ShelfDays and its velocity is unchanged from the conventional calculation. A product in stock for fourteen of those days has 14 ShelfDays, and its measured rate is roughly six times higher than the calendar figure. Nothing about the sales data changes; only the denominator does.
The obstacle has always been that warehouse systems record current stock, not a continuous history of it. But most expose historical balances on request. Stockmind samples them: it asks the warehouse management system what every article's stock level was on a series of past dates spread across the window, and counts, for each SKU, how many of those snapshots showed stock on hand.
Sampling rather than reconstructing has a practical advantage: it needs no movement history, no transaction log and no assumptions about how receipts and picks interleave. A snapshot is an unambiguous fact about a past date — and past dates do not change, which also means each snapshot can be extracted once and reused indefinitely.
Three guards apply, each addressing a way the measurement could mislead:
A simpler approach suggests itself: if a product currently has zero stock, assume it has been empty since its last sale. Stockmind used exactly this before measurement was available, and it is meaningfully better than nothing. But it can only detect products that are empty at the moment of calculation.
The products it misses are the ones that matter most: those that sold out on day ten, were restocked on day fifty, and are in stock today. Inference sees a healthy product with ninety days of availability. Measurement sees fifty. These are the fastest-moving items in any catalogue — they are the ones that empty out between deliveries — and they are precisely the population inference cannot reach.
Once velocity is measured against availability, several further corrections become worth applying. Each is standard inventory practice; what changes is that the underlying rate is now trustworthy enough to build on.
A returned unit is not demand. It leaves the warehouse, comes back, and returns to stock — so counting it as a sale overstates the rate at which the product moves and simultaneously double-counts a unit already on the shelf. Both errors push the same way: toward ordering more of something that is coming back.
The correction needs no additional data. A return is recorded against the order line the unit left on, so the same pass that counts despatches can count returns, and velocity is computed from the difference. The per-product return rate that falls out of this is useful in its own right, since a high one usually points at something fixable in how the product is presented rather than at the product itself.
An accessories catalogue is organised around the devices its products fit, and that is the level at which buying decisions are actually made — you do not decide to stock one strap, you decide whether a watch generation is worth carrying. Stockmind groups products using the compatibility class recorded in the warehouse system, which also groups correctly across categories: a phone's cases, screen protectors and chargers share a device but not a product code.
Two details matter here. A product that fits several devices belongs to all of them, so its sales are either divided between them or counted in full against each, stated explicitly rather than silently assigned to whichever happens to be listed first. And not every class is a device — labels such as "Universal" or a screen size are groupings, identified by the breadth of unrelated products carrying them, and excluded from device attribution.
Judgements about which ranges are worth extending are made against the catalogue's own distribution rather than fixed thresholds. A range in the top quarter for demand per SKU, with most of the range selling, is a candidate for widening; one in the bottom quarter carrying many products is over-extended. Quartiles rather than constants, so the conclusion does not drift as the catalogue changes.
A flat average over ninety days treats a product rising from five units a month to fifteen identically to one falling from fifteen to five. For a catalogue tied to device generations — where accessories for a newly launched handset ramp while the previous generation decays — that is not an edge case but the normal shape of the business.
Stockmind compares the most recent thirty days against the full window and blends them. The recent window is itself availability-adjusted, without which a product that spent last month out of stock would appear to be collapsing. Confidence in the recent signal scales with its volume:
One unit of recent evidence earns a quarter of the available weight; eighteen units earn most of it. A single fortunate week cannot move an order.
Classical safety stock scales with the standard deviation of demand over the lead time. In practice most systems apply a flat number of days to every product, which over-buffers the predictable and under-protects the erratic.
Stockmind computes a coefficient of variation across three sub-periods and scales the buffer accordingly — roughly half for steady demand, up to two and a half times for volatile. The detail that matters is that the sub-period figures are rates, not raw quantities: a period with no availability is excluded rather than counted as a collapse in demand. Without that, censoring would re-enter through the back door and every stocked-out product would be classified as erratic.
Open purchase orders are usually subtracted from the reorder requirement, which is correct only if they arrive in time to matter. Stock landing in sixty days does nothing for a product that will be empty in twelve. Stockmind counts inbound stock as cover only when its expected arrival falls within the lead time plus safety window, and reports the remainder separately.
The method was developed against, and is in production use on, the accessories catalogue described in section 2. When measured availability was first applied across all 226,000 SKUs, the effect on computed velocity was as follows.
That last figure deserves emphasis. Fewer than one product in fifteen was available for the whole measurement period. For the remaining fourteen, conventional velocity was computed against a denominator that included days the product could not possibly have sold anything.
A concrete case from the same catalogue. A nylon watch strap for a current-generation Garmin device sold twenty units in ninety days:
| Denominator | Velocity | System's verdict | |
|---|---|---|---|
| Calendar days | 90 | 0.22/day | Slow mover — no reorder triggered |
| ShelfDays | 14 | 1.43/day | Top seller — order 37 units |
Both figures derive from the same twenty units of sales. The difference lies entirely in what the denominator claims about the world. And the direction of the error is not random: it always understates, and it understates most severely the products that sell fastest.
A method that is candid about its limits is easier to trust than one that is not, and several of these limits are material.
A product launched three weeks ago has nothing to measure. Croston's method needs demand events to smooth; a Poisson model needs observations to fit a rate; ShelfDays needs sales to divide. Stockmind measures from launch rather than from an arbitrary window start, so a short history is not mistaken for weak demand — but it does not forecast a product that has never sold. What it offers instead is context from products that have: the historical variant mix across colourways, and how the equivalent range performed for the previous device generation. That is a basis for a buying decision, not a forecast, and describing it as one would be dishonest.
The method extrapolates recent, availability-corrected behaviour. It does not model an annual cycle, so it will not anticipate a Christmas peak from a summer measurement. A seasonal decomposition would be a genuine addition and is not present.
When a product is unavailable, some demand transfers to a substitute rather than disappearing — an effect studied directly in the literature.[13] Stockmind reports whether sibling variants held stock during a stockout, which distinguishes a soft loss from a total one, but it does not model the transfer quantitatively.
Demand is measured net of returns, which removes the systematic overstatement that reading units shipped would produce. What remains is a timing effect: a return may be recorded weeks after the despatch it cancels, so the most recent portion of any window understates the eventual rate. The distortion is modest across ninety days and largest for a product that has only just begun selling, where almost none of its returns have yet arrived.
Availability is sampled, not observed continuously. A stockout shorter than the interval between snapshots can be missed. Daily sampling is the default, which resolves availability to roughly half a day; coarser intervals run faster but leave a proportionally larger error in the denominator, which matters most for exactly the thin-stock products the correction exists to serve.
A product available for two days that sold one unit implies a rate of forty-five a quarter. Some floor on the denominator is therefore necessary, and any floor is a judgement rather than a derivation. Rather than defend a constant, the effect is measurable: the catalogue can be recomputed at several floors and the results compared.
On the catalogue described here, the answer was clarifying. Roughly one per cent of selling products measured below the fourteen-day floor, and removing the guard entirely changed three reorder decisions out of some fourteen thousand. The largest correction any product would receive without a floor was about thirteenfold, not the far larger figures a thinner-measured catalogue would produce.
Two conclusions follow. The guard's exact value barely matters here, which is the most reassuring possible finding about an arbitrary constant. And the maximum correction quoted anywhere is bounded by that constant rather than observed — a distinction worth stating, since a ceiling reported as a measurement would overstate what the method demonstrates.
The picture changes after a product launch. A range added last week has only a few days of availability however well it sells, so the guard does real work for a period after new stock arrives and less at other times.
Every figure here is arithmetic on historical data. Supplier behaviour, promotions, pricing changes and competitor activity sit outside the model. The output informs a buying decision; it does not make one.
A note on implementation, because the distance between a method and a working system is mostly engineering, and at this scale the engineering is not incidental.
Measuring availability for 226,000 SKUs means retrieving and parsing historical stock snapshots that run to tens of megabytes each. Done naively this exhausts memory on any shared host. Stockmind streams each snapshot to disk and scans it in chunks, holding a few megabytes regardless of catalogue size, and caches the extracted result permanently — a past date's stock balances cannot change, so each snapshot is extracted exactly once. Sample dates align to a fixed calendar grid so successive runs share most of their dates; at daily resolution a re-measurement reuses every snapshot but the new ones, which is what makes daily sampling affordable to maintain even though the first run is slow.
The same discipline applies to the reports. Rows are stored one per line with column names declared once rather than repeated on every record, and each report streams the file rather than loading it. Computed answers are cached against a fingerprint of everything they depend on, so a report is recomputed when the data or the settings change and not otherwise.
None of this is interesting in itself. It matters only because a method that cannot run across the whole catalogue is not a method — it is a demonstration.
The ordering policy has been a solved problem since roughly 1960. The estimation problem underneath it has been documented since the 1970s. Neither is a discovery, and this paper claims no theoretical novelty.
What it claims is narrower and, we think, more useful: that a well-known measurement bias remains largely uncorrected in the software people actually use; that it is worst precisely where catalogues are longest and margins thinnest; and that it can be corrected directly by measuring availability rather than modelling around its absence.
The correction is not subtle in its effects. On a live catalogue it revised the velocity of 82% of selling products, with the largest corrections concentrated in the best sellers. Those products had been under-ordered, had run out, and had produced sales records that justified under-ordering them again.
A product that sells out is not telling you it is slow. It is telling you that you did not have enough of it. Whether your system can hear the difference is a question of what it measures.
Connect your warehouse system and Stockmind will report what share of your selling products currently have understated velocity — and which ones.
Request an availability audit →