How to spot slow-moving inventory before it becomes dead stock
iotoms team · October 19, 2026 · 5 min read
A janitorial and foodservice supplies distributor running one warehouse and around sixty accounts looked, on paper, like a business with no inventory problem. Turnover for the year came in close to five times — right in the range anyone would call healthy for that category. The owner used that number in a bank conversation that spring to argue the business was being run tight. Nobody pushed back on it, because nobody had a reason to.
The number was true and it was also hiding the problem. It was a blend of a few hundred fast-moving SKUs — paper towels, trash liners, hand soap, the stuff that turned over every two or three weeks without anyone thinking about it — averaged against a long tail of a few hundred more that hadn't moved in months. The fast movers dragged the average up high enough that the slow ones never showed. A single turnover figure for the whole warehouse was doing exactly what averages do: erasing the variation that actually mattered.
The warehouse was already telling a different story
The signs were there before anyone looked at a report. A rack in the back corner hadn't been touched in a pallet-jack cycle count in over two months. A supplier rep mentioned, almost as small talk, that the distributor was still carrying a case pack size that supplier had discontinued replacing eight months earlier. A picker, filling an order, mentioned that a certain floor-care chemical always needed its box wiped down before it went out because it had been sitting long enough to collect dust.
None of that showed up in the turnover ratio because none of it was big enough on its own. It took a warehouse manager pulling a report sorted by last-sale date — not by revenue, not by category, just by how long it had been since each SKU last left the building — to see it as one picture instead of a dozen unrelated anecdotes. About 40 SKUs, roughly 8% of the catalog by item count, hadn't sold in over ninety days. By dollar value tied up at cost, it was closer to 15% of total inventory. None of it was flagged anywhere, because nothing in the system was built to flag it — the purchasing team reordered against static minimums set a year earlier, and a SKU that had quietly stopped selling kept getting replenished right alongside the ones that hadn't.
What it was actually costing
The direct cost was obvious once someone added it up: cash sitting in cases that weren't moving, in a warehouse with finite shelf space, instead of being available to buy the inventory that actually turned. The less obvious cost was the one that kept compounding. Slow stock doesn't just sit still — several of those SKUs were perishable or seasonal enough that sitting still meant degrading. A floor finish with a shelf life, a seasonal cleaning product tied to a promotion that had already run, a case pack a supplier had stopped honoring returns on because too much time had passed since the invoice. Every month the gap stayed invisible, the options for recovering any of that cost narrowed — a vendor return window closes, a rebate period ends, a product's shelf life runs out, and a line that could have gone back to the supplier for a credit becomes a write-off instead.
The turning point wasn't a new policy. It was switching the question the business asked. Instead of "is our inventory turnover healthy," the warehouse manager started asking "which SKUs, individually, haven't earned their shelf space in ninety days" — a question a blended ratio can never answer, because by construction it's designed to average the answer away.
Catching it at the SKU level, not the warehouse level
Fixing it meant running the inventory the same way the problem had actually shown up: item by item, with aging and velocity visible together instead of folded into one number. Every SKU got a simple classification — moving, slowing, or stalled — based on days since last sale and the rate of sale against its own history, not against a category average. Reorder points stopped being static; a SKU drifting toward "stalled" automatically stopped generating purchase suggestions instead of quietly refilling itself. And the classification got checked against vendor terms before it got checked against anything else, because a SKU caught at sixty days with an open ninety-day return window is a different problem than the same SKU caught after the window closed.
What to actually do about slow-moving stock
- Rank by last-sale date and sell-through rate, not revenue or category. A high-dollar SKU can look fine on a revenue report while quietly aging in the warehouse.
- Check vendor return and rebate windows before the stock goes stale, not after. The highest-recovery option is usually sending it back — but only while the terms still allow it.
- Stop reordering against static minimums. A reorder point that doesn't react to actual sell-through will keep replenishing a SKU that has already stopped selling.
- Model a markdown before running one. A clearance applied without checking margin impact can move the stock and wreck the price perception on everything around it.
- Track slow stock as its own number, monthly. "Percent of inventory value untouched in 90 days" is a metric a blended turnover ratio will never surface on its own.
- Don't liquidate reflexively. A SKU with no recent sales isn't automatically dead — check whether it's a timing problem, a pricing problem, or an actual discontinued-demand problem before writing it off.
iotoms tracks sell-through and days-since-last-sale at the SKU level as a standard report, not a blended turnover figure buried in the accounting close, so a slow mover surfaces by item while there's still a vendor return window or a markdown option left — instead of showing up eight months later as a write-off nobody saw coming.