Workings · 02 · dead stock
Not everything that isn't selling is dead in the same way.
Discounting slow stock is the easiest thing in retail to do badly. Blanket percentages destroy margin on things that were about to sell anyway, and leave the genuinely dead stuff sitting exactly where it was. Here's the scoring that replaced the guesswork, and the floor that stops it losing money.
How much of a catalogue is actually dead
Live figures from my own store, read while writing this. Of every line that holds any stock at all, this is how it was moving.
| Movement | Lines | Share |
|---|---|---|
| Sold nothing in 180 days | 1,706 | 24% |
| Sold nothing in 90 days, but did in 180 | 1,201 | 17% |
| Sold something in the last 90 days | 4,125 | 59% |
| Lines holding stock | 7,032 | 100% |
Two things follow from that table. The first is that the dead pile is far bigger than anyone's instinct says — nobody looks at a shelf and thinks "two-fifths of this hasn't moved in three months".
The second is that you cannot treat those 2,907 lines as one thing. A line that sold nothing in six months is a different problem from one that sold nothing in three but was fine before that. Give both the same discount and you've overpaid on one and under-solved the other.
Scoring by how dead, not whether dead
The rule that replaced the guesswork sorts stock into tiers, each with its own discount depth. The inputs are boring on purpose: units sold in the window, units still on the shelf, and the ratio between them.
-
Nothing sold, and there's a pile of it
No sales in the window and more than a couple of units sitting there. This is the genuinely dead tier and it takes the deepest cut, because the alternative is holding it forever and paying to store it.
-
Barely moved, and won't clear at this rate
A handful sold, but sell-through so low that at the current pace the stock outlives the product. Middling discount — enough to change the outcome, not enough to give away something that still has a market.
-
Moving slowly, but moving
Selling, just not fast enough to justify the shelf. A light nudge. Most of these don't need much, and several would have sold anyway — which is exactly why a blanket percentage is so expensive.
-
Leave it alone
Everything else. The largest group by far, and the one a blunt sale quietly damages.
The floor under everything
Every tier is capped by what the stock cost. No line is ever discounted below its cost price plus a set margin, regardless of how dead the scoring says it is.
This matters more than the tiering does. A scoring model left to its own devices will cheerfully mark the deadest stock hardest, which is precisely the stock most likely to end up below cost — and selling at a loss to clear space is a decision a business owner should make deliberately, not one a spreadsheet should make on their behalf on a Tuesday.
Where the floor and the tier disagree, the floor wins and the line is flagged for a human to look at. Those flagged lines are usually the interesting ones: stock that isn't worth keeping and isn't worth discounting, which is a buying problem, not a pricing one.
Consumables that sell steadily in small numbers — paints, glues, the things people buy one of — score as slow movers on the raw numbers and should never be discounted. So they're excluded outright.
When I re-ran today's data across the plausible exclusion settings, the output moved from under four hundred lines to roughly 2,300. Same scoring, same stock, six times the answer. The model gets all the attention; the exclusion list decides the result. That's true of every model like this, and it's the part that has to be argued about with someone who knows the trade.
What it replaced, and what it produced
Before: a person going through categories deciding what looked tired, applying round-number percentages, and typing new prices in one line at a time. Two days of work, done maybe twice a year because nobody could face it more often. The lines nobody got to stayed at full price indefinitely.
After: the scoring runs against live sales and stock, the floor is applied, and the output is a file the website takes in one go — plus a working sheet showing the reasoning on every line, so the prices can be argued with before anything goes live. 986 lines repriced, in an afternoon.
It's the count of stock lines repriced in one particular run — a real number from a real afternoon, not a repeatable constant. Re-running the same rules against today's stock produces a different figure, because the stock is different and because the exclusion list has been tightened since.
What today's data does confirm is the scale: 986 is roughly a third of the lines currently sitting at zero sales for ninety days. It's a plausible slice of a real problem, not a headline number I'd ask you to take on trust.
Whether this is your job too
It transfers to anyone holding stock they've paid for. The questions are the same in a builders' merchant, a wholesaler or a parts business: how much of what you own isn't moving, how dead is each part of it, and what's the lowest price you can take without turning a slow-moving asset into a fast-moving loss.
If the honest answer at your place is "we do it by eye, about once a year, and we never finish", that's the same job. It's also usually one of the cheapest things on an audit's list to fix, because none of it needs new software — the sales history and the cost prices are already sitting in the system you've got.
Movement figures were read from the live store on the day of writing and will drift as stock sells. Supplier and product names are deliberately absent throughout.