What is dead stock?
Dead stock is inventory you hold but no longer sell: products with units on hand whose last sale is older than your dead-stock window — 90 days by default, configurable per organization — including products that have never sold at all. The dead-stock widget lists these products with the cash each one ties up, sorted highest first; SKUs with no confirmed cost have no known value to sort by, so they sort to the bottom rather than jumping the queue, and a note below the list says how many SKUs that is.
Formula
dead stock = quantity on hand > 0
AND (never sold, OR last sale older than the window)
Worked example
With a 90-day window, a SKU with 140 units on hand and a last sale 122 days ago is dead; at €11 confirmed unit cost it ties up €1,540. A seasonal store that sets its window to 180 days would not flag it. The window is a business judgment — the default suits steady assortments, and slow-cycle catalogs should widen it rather than treat every off-season SKU as dead.
How Saldo Metrics computes it
v_inventory_position takes the newest inventory snapshot per product and store,
computes each product's last sale date and units sold inside the window, and flags
is_dead_stock when stock is on hand and no sale falls inside the window. The
window comes from the org's setting (default 90 days), so the flag is
caller-dependent by design and never cached across orgs. Valuation uses the
product's best confirmed cost record; a product with no confirmed cost has
unknown cash tied up, not zero — the row is flagged missing_cost, shows
"—" rather than a value in the list, and sorts after every valued row
(NULLS LAST) instead of ahead of them. The list carries a coverage note below
it — "N of M dead-stock SKUs have no cost on file" — computed on SKU count, not
euros, because an uncosted SKU's cash value is unknown and there is no honest
total to turn into a percentage of money. Sales recency counts orders in any
status here; a cancelled order still proves the product moves.
Why it matters
Dead stock is a double loss: the capital is locked, and the shelf or warehouse space it occupies has carrying cost. It also decays — yesterday's dead stock rarely revives on its own. The list ordered by cash tied up is a markdown and clearance worklist: the first handful of valued rows usually hold most of the money, with the uncosted rows trailing at the bottom where they can't be mistaken for the biggest problem on the list.
Common mistakes
- Using one window for a mixed catalog. Evergreen and seasonal assortments need different windows; the org setting is a single dial, so read seasonal SKUs with judgment.
- Discounting dead stock below recovery without checking margin history. Some dead SKUs are better written off than sold at a loss that also costs shipping.
- Ignoring the uncosted rows. A dead-stock total that excludes 40 uncosted SKUs is a floor, not the number — the coverage note under the list says how many.
Where you see this in the app
The Dead Stock dashboard widget (per-product list) and the dead-stock-value alert metric.