How to Find Dead Stock and Slow Movers With AI

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for How to Find Dead Stock and Slow Movers With AI.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for How to Find Dead Stock and Slow Movers With AI.

Export every stock line with quantity on hand, unit cost, last sale date and a year of sales, then have AI classify each line against written rules: no sale in twelve months is dead, over a year's cover is slow. Rank by cash tied up, weed out false alarms such as superseded codes, and pick one action per line.

The rules matter more than the tool. Ask an AI "which of my stock is dead?" with no definition and it will invent one, differently each time. Fix the thresholds first, make the AI calculate with code rather than estimate, and treat its list as a draft for a person who knows the products to challenge.

Follow me on Instagram@sagnikteaches

Decide the rules before AI sees the data

Days of cover is the measure that does most of the work: stock on hand divided by average daily sales over the last twelve months. A line with 60 units on hand that sells 30 a year has 730 days of cover. Here is a starting rule set you can adjust per category:

Connect on LinkedInSagnik Bhattacharya
ClassRuleWhat usually happens next
DeadStock on hand, no sale in the last 12 monthsClear, return or write down
SlowSold in the last 12 months, but more than 365 days of coverStop reordering, sell down
Watch180 to 365 days of cover, or sales down more than 50% on the previous yearReview before the next order
HealthyUnder 180 days of coverNo action
NewFirst received in the last 90 daysExclude until it has a sales history

Shorten the windows for anything that dates quickly (clothing, food, phone accessories, anything with a model year) and lengthen them for spares you deliberately hold. Write the rules down. Next year's review should use the same ones, or the comparison means nothing.

Subscribe on YouTube@codingliquids

The export: nine columns from your stock system

Most stock and accounting systems can produce these in one or two reports. Join them into one sheet with one row per item:

  1. Item code
  2. Description
  3. Category or product group
  4. Quantity on hand
  5. Unit cost (the cost you carry it at, not the selling price)
  6. Last sale date
  7. Units sold in the last 12 months
  8. Units sold in the previous 12 months
  9. First received date, and ideally the date of the last delivery

Two extra columns save time later if you can get them: the supplier, and any code that replaced this one (a "superseded by" or "alternative item" field). If your system has an inventory ageing or slow-moving report, export that too; its dates are more trustworthy than anything reconstructed from raw transactions.

The classification prompt, and what a first pass returns

Take an illustrative accountancy practice preparing year-end accounts for a client that wholesales electrical fittings: 1,240 stock lines, $412,000 at cost. The partner wants to know how much of that is realistically saleable before agreeing a stock provision (a reduction in the stock value to reflect items unlikely to sell at cost). The practice's manager uploads the joined export to a business AI plan and runs:

Attached is a stock export, one row per item_code. Year end is
31/03. Apply these rules exactly, calculating in Python:

days_cover = qty_on_hand / (units_sold_12m / 365)
  (if units_sold_12m is 0, days_cover = "no sales")

Class:
- NEW if first_received is within 90 days of year end
- DEAD if qty_on_hand > 0 and no sale in the 12 months to year end
- SLOW if days_cover > 365
- WATCH if days_cover 180-365, or units_sold_12m is less than
  half of units_sold_prior_12m
- HEALTHY otherwise

Add value_at_cost = qty_on_hand * unit_cost.
Give me: (1) a summary by class with line count and value,
(2) the DEAD and SLOW lines sorted by value, highest first,
(3) a check that the class totals add up to the total stock value.
Do not guess any missing figures; list rows with blanks separately.

An illustrative summary from the first pass:

ClassLinesValue at cost
Dead186$61,300
Slow212$73,500
Watch164$38,900
Healthy631$229,800
New47$8,500
Total1,240$412,000

The totals reconcile to the stock ledger, which is the first thing to check. If they don't, something was dropped or double counted in the join, and nothing else in the analysis can be trusted until you find it. The prompt's instruction to list blank rows separately matters too: in this file, 23 lines had no unit cost, and an AI told to "fill gaps sensibly" would have made up a cost for each.

Superseded codes, service spares and other false alarms

A first-pass dead list is never the final one. Walk it with someone who knows the products, starting with the most valuable lines. In the practice's review with the client's operations manager, 52 of the 186 "dead" lines turned out to be something else:

  • 31 lines ($9,200) were service spares. The client holds them because it promises trade customers that replacement parts will be available for five years. They sell rarely by design. These moved to a separate "held for service" class.
  • 14 lines ($4,100) had been superseded. The manufacturer changed part numbers, the client set up new codes, and new sales went on the new code while old stock stayed on the old one. Same physical item, so it is sellable; the fix is to merge the codes, not to write off the stock.
  • 7 lines ($3,200) were on an open quote for a large customer's refurbishment project.

That leaves 134 genuinely dead lines worth $44,800. Ask AI to help find the superseded codes before the meeting: give it the descriptions and ask for pairs of items with near-identical descriptions where one has recent sales and the other has none. It won't be perfect, but it turns a two-hour hunt into a ten-minute check.

The opposite error exists too: phantom stock. A line showing 40 units that are no longer on the shelf is dead stock that doesn't exist. Before valuing the dead list, count a sample physically. For this client, the team counted the 20 most valuable dead lines; three had fewer units than the system showed, which moved the dead total down by another $1,150. If phantom stock turns up often, the stock records need attention first, and a faster stocktake routine with a phone scanner is the place to start.

One action per line: return, sell, bundle, discount or write down

Once the list is clean, give every dead and slow line one next action. AI is good at producing a first allocation if you give it the options and the rules:

ActionWhen it fitsWhat AI can do
Return to supplierStill in the supplier's current range, packaging intact, return terms allow it (often with a restocking fee)Group lines by supplier, draft the return request
Offer to past buyersCustomers who bought it in the last three yearsMatch lines to past buyers from the sales ledger, draft a short offer
BundleA slow line that pairs naturally with a fast moverSuggest pairings from order history (items often bought together)
Discount ladderSaleable but overpriced for current demandPropose a stepped plan, for example 20% off for 30 days, then 40%
Clearance buyerLarge quantity, low chance of selling through normal channelsList lines in the format surplus buyers ask for
Write down or scrapDamaged, expired, obsolete or worth less than the cost of selling itCalculate values for the accountant's adjustment
KeepService spares, open quotes, seasonal lines with a sales patternRecord the reason so it isn't flagged again next year

A quick sum shows why the order of actions matters. A return with a 15% restocking fee recovers $85 of every $100 at cost. A 40% discount recovers $60 before selling costs. A clearance buyer might pay $15 to $25. Returns first, then sales to people who have bought before, then discounts, then clearance, is usually the order that recovers the most cash. Check your supplier terms for return windows, though; they are often short.

Slow lines raise a different question: discount now or wait? Holding stock isn't free. Once storage space, insurance, handling, damage and the cash tied up are counted, a common rule of thumb puts the annual cost somewhere between a fifth and a third of the stock's value; work out your own figure if you can. Take a slow line worth $5,000 at cost with three years of cover. At 25% a year, holding it until it sells at full price costs roughly $3,750 over those three years, and it may date in the meantime. Cutting the price so the line clears within a quarter, even at 30% off the usual selling price, usually leaves you better off and frees the shelf for something that sells. Ask the AI to run this comparison for each slow line using your own holding-cost percentage, and sort by the difference.

Putting a value on it for the year-end accounts

Most accounting frameworks carry stock at the lower of cost and net realisable value: what you can realistically sell it for, less the costs of selling it. Dead and slow lines are where those two figures part company, and that difference becomes the provision.

In the illustrative review, the partner judged that the 134 dead lines would realise about 25% of cost through clearance, and that stock held beyond twelve months' cover on the slow lines ($41,000 of the $73,500) would realise about 70%. The AI did the arithmetic in code:

  • Dead: $44,800 − $1,150 phantom stock = $43,650 × 75% = $32,740 provision
  • Slow, excess over 12 months' cover: $41,000 × 30% = $12,300 provision
  • Total provision: $45,040, about 11% of the stock value

The percentages are judgement calls for the accountant and the owner; the AI only calculates and documents them. Keep the classification file, the list of false alarms and the reasons with the working papers. Next year the same rules can be run again and compared, and anyone reviewing the accounts can see exactly how the figure was reached. If a business sale is on the horizon, this file is also one of the first things a buyer's adviser will ask for.

Letting AI draft the clearance emails

With the actions assigned, the writing is the quick part. Give the AI the grouped lines and a clear brief:

Draft a short email to [supplier] asking whether they will accept
a return of the lines below for credit. Mention that the stock is
unused and in original packaging, ask for their restocking fee
and return process, and ask for a reply within 10 days. Plain,
friendly, trade tone. No more than 120 words. Lines:
[item code, description, quantity, our original order date]

An illustrative draft that comes back:

Hi [first name], we're reviewing our stock and have some unused lines from your range that we'd like to return for credit if you can take them. All are in original packaging, and the order dates are listed below. Could you let us know whether you can accept them, what restocking fee applies, and how you'd like them sent back? A reply by 14 April would help us plan. Thanks, Jo

What to fix before sending: the AI wrote "some unused lines" but the attachment listed 38 lines worth $6,900, so say so; a supplier takes a specific, sized request more seriously. Check that every line is still in that supplier's current range; returns of discontinued lines are usually refused, and the AI has no way of knowing which ones those are.

For past buyers, the useful prompt matches slow lines to customers who bought them, then drafts a short personal note to each: "You ordered 20 of these last spring; we have 45 left and can offer them at 25% off until the end of the month." Keep those to your own account managers to send, not a mass email.

Two more shelves: obsolete spares and branded kit

Dead stock doesn't only build up in shops and wholesalers. Two other situations follow the same method with different rules.

Spares for equipment you no longer use. An illustrative engineering consultancy that installs site monitoring switched to a new data-logger model two years ago. Its spares shelf still holds batteries, connectors and mounting kits for the old model, around $7,800 at cost, and the classification flags every one as dead. The action isn't a discount; it's asking the manufacturer about trade-in, offering the kit to other firms still running the old model, or writing it down. The rule to add: when a piece of equipment is retired, its spares are reviewed the same month.

Branded or customer-specific stock. An illustrative recruitment agency held 140 hi-vis vests printed with one client's logo, bought for a contract that ended. They can't be issued to anyone else, so they're dead the day the contract ends, not twelve months later. Add a rule: stock tied to a single customer is reviewed when that customer's contract ends, and where possible, the contract says who pays for leftover branded kit.

A monthly slow-mover alert so it doesn't build up again

A once-a-year purge treats the symptom. The cause is usually reordering without looking at cover. Three habits stop the pile growing back:

  1. Run the same classification monthly on the same export and save each month's result. Anything moving from Healthy to Watch goes to the person who places orders. For reordering, see how calculated reorder points stop fast lines being overbought.
  2. Block reorders on Watch and Slow lines without a named person's approval. Most systems can't enforce this, but a monthly email listing those lines, sent before the buying day, does most of the work.
  3. Look at margins alongside movement. A slow line with a thin margin is a far worse use of shelf space than a slow line with a fat one. Checking margins product by product gives you the second half of that picture.

A monthly prompt that keeps the review to fifteen minutes:

Compare this month's classification with last month's (both
attached). List: (1) lines that moved into WATCH, SLOW or DEAD,
with value; (2) lines on WATCH or SLOW that were reordered this
month, with the order quantity; (3) the total value in each class
now versus last month. Keep it to one table per list.

List (2) is the one to act on. A line on the Watch list that was reordered anyway usually means the buyer didn't see the alert or didn't trust it, and both are fixable.

Four checks before the dead stock list drives any decision

Before the list drives any write-down, clearance or supplier conversation, run four checks:

  • Totals reconcile to the stock ledger value for the same date.
  • Five known fast movers come out as Healthy. If one comes out Dead, the sales join has failed for that code.
  • A hand calculation of days of cover for three lines matches the AI's figure.
  • The physical sample of the most valuable dead lines has been counted.

If all four pass, the list is sound enough to act on. For more on reading sales exports with AI and what to check in the answers, see what to upload and check when AI analyses your sales spreadsheet.

Dead stock questions that come up at review time

How long before stock counts as dead?

Twelve months without a sale is the usual line for general stock, but shorten it for fashion, food, tech accessories and anything with a model year, where six months can be enough. Lengthen it for genuine spares you promise to hold for customers. Set the rule per category and write it down so the classification is repeatable next year.

Can I just delete dead stock from the system?

Not without a record. Physically disposing of stock, returning it or writing it down all need an adjustment that your accountant can trace, with a date, quantity, value and reason. Deleting item records can also break sales history. Mark lines as discontinued instead, and let the stock adjustment carry the accounting.

Is AI better than my stock system's ageing report?

Use both. The built-in report gives reliable dates and quantities. AI adds the judgement layer: combining the report with sales history, spotting superseded codes, sorting lines into actions and drafting the emails. If your system has a good ageing report, feed its export to the AI rather than rebuilding it from raw transactions.

Further reads

Sources: inventory valuation principles (lower of cost and net realisable value) as applied under the main accounting frameworks. All business figures are illustrative.

Want your slow-mover review run properly every month?

On a 1:1 call we'll look at what your stock system can export, set classification rules that fit your products, and build a monthly routine that flags slow lines before they go dead.

Book a 1:1 call with me