Skip to main content
Free tool · Runs in your browser

Dead stock checker: how much of your Shopify stock has stopped selling?

Drop the product and order exports from your Shopify admin. In seconds you get a dead stock score, the money stuck at cost by how long it has gone without a sale, and every variant ranked by the cash it ties up, with a markdown that never goes under cost. It is the same code Store Diagnosis runs on a connected store.

  • Your files are read on this device, never uploaded
  • Customer columns are skipped as they are read
  • Free, no sign-up, no install

Check your stock

  • Products exportrequiredProducts › Export
  • Orders exportrequiredOrders › Export
  • Inventory exportoptionalProducts › Inventory › Export, for more than one location

Three exports, about two minutes

  1. ProductsProducts › Export › All products › CSV for Excel › Export products
    Gives each variant's price, cost per item and stock. Shopify emails you a download link.
  2. OrdersOrders › Export › All orders › CSV for Excel › Export orders
    Gives the date each variant last sold. Take every order, or at least the last 13 months.
  3. Inventory, if you stock more than one locationProducts › Inventory › Export › All locations › All states › All variants › Export inventory
    Gives units on hand at every location.

Every step, and what each file is used for: how to export. Why nothing leaves this page: how it stays private.

Sample store

351 variants in stock · 366 days of orders · as of 24 Sept 2026

Sample data: Store Diagnosis’s demo store, 84 products and a year of orders. Drop your own exports above to check your store.

$91,449.08 of the $374,283.08 in stock, 24%, has gone 90 days or more without a sale, or never sold. The largest single amount is Limited Edition Coach Jacket — XL: $12,920.00 at cost.

74out of 100

Dead stock score

100 means no money is stuck. Dead and never-sold stock counts in full, stale stock by half, slow stock by a quarter.

Money in stock$374.3Kat cost, 351 variants
Not selling$91.4K24% of your stock, 42 variants
A year or more$00 variants without a sale for 365+ days
Selling slowly$43.6Kmore than 180 days of stock, 39 variants

Stock at cost, by days without a sale

$374,283.08 in all · the money that is not selling is in orange

  • Selling $53.2K
  • New stock $2,600
  • Season ahead $183.4K
  • Selling slowly $43.6K

Not selling: $91,449.08

  • No sale in 90–179 days$10,673.2014 variants · 159 units
  • No sale in 180–364 days$77,439.9024 variants · 890 units
  • No sale in a year or more$0.000 variants · 0 units
  • Never sold$3,335.984 variants · 46 units

Every variant, most cash tied up first

Cash tied up is units on hand × cost per item. The markdown never prices under the floor.

#VariantAgeUnitsCash tied upLast saleDays of stockMarkdownFloor
1Limited Edition Coach Jacket — XLCJ25-XL180–364 days76$12,920.005 Mar 2026203 days agoNo salein 90 days40% off$204.00$178.50cost + 5%
2Limited Edition Coach Jacket — LCJ25-L180–364 days65$11,050.006 Feb 2026230 days agoNo salein 90 days40% off$204.00$178.50cost + 5%
3Hand-Woven Wool Rug, 5×8 — NaturalWR66-NATSlow27$7,398.0014 Sept 202610 days ago270daysHold the pricestop reordering$287.70cost + 5%
4Waxed Field Jacket — Olive / XSWFJ7-OLI-XS180–364 days57$6,874.2012 Feb 2026224 days agoNo salein 90 days40% off$160.80$126.63cost + 5%
5Limited Edition Coach Jacket — SCJ25-S180–364 days37$6,290.007 Mar 2026201 days agoNo salein 90 days40% off$204.00$178.50cost + 5%
6Limited Edition Coach Jacket — XSCJ25-XS180–364 days35$5,950.0022 Dec 2025276 days agoNo salein 90 days45% off$187.00$178.50cost + 5%
7Leather Weekender — TanLW27-TANSlow33$5,282.6418 Sept 20266 days ago330daysHold the pricestop reordering$168.09cost + 5%
8Limited Edition Coach Jacket — MCJ25-M180–364 days30$5,100.004 Mar 2026204 days agoNo salein 90 days40% off$204.00$178.50cost + 5%
9Leather ToteLT-BR180–364 days40$4,400.0021 Dec 2025277 days agoNo salein 90 days45% off$136.95$115.50cost + 5%
10Pleated Wide Trouser — Charcoal / 38PWT13-CHA-38180–364 days68$4,025.6019 Jan 2026248 days agoNo salein 90 days40% off$88.80$62.16cost + 5%
11Pleated Wide Trouser — Charcoal / 30PWT13-CHA-30180–364 days62$3,670.407 Mar 2026201 days agoNo salein 90 days40% off$88.80$62.16cost + 5%
12Merino Crew Sweater — Charcoal / XSMC4-CHA-XS90–179 days54$3,196.8011 Apr 2026166 days agoNo salein 90 days25% off$111.00$62.16cost + 5%
13Waxed Field Jacket — Black / XSWFJ7-BLA-XSSlow25$3,015.0010 Sept 202614 days ago2,250daysHold the pricestop reordering$126.63cost + 5%
14Enamel Casserole — CreamEP62-CRE180–364 days44$2,930.406 Mar 2026202 days agoNo salein 90 days40% off$88.80$69.93cost + 5%
15Enamel MugEM-WHSlow200$2,200.0016 Sept 20268 days ago1,800daysHold the pricestop reordering$11.55cost + 5%
16Pleated Wide Trouser — Charcoal / 32PWT13-CHA-32180–364 days37$2,190.407 Feb 2026229 days agoNo salein 90 days40% off$88.80$62.16cost + 5%
17Pleated Wide Trouser — Charcoal / 34PWT13-CHA-34180–364 days36$2,131.205 Jan 2026262 days agoNo salein 90 days40% off$88.80$62.16cost + 5%
18Wool ScarfWS-GRSlow80$2,080.0025 Aug 202630 days ago10+ yearsHold the pricestop reordering$27.30cost + 5%
19Pleated Wide Trouser — Charcoal / 36PWT13-CHA-36180–364 days35$2,072.006 Feb 2026230 days agoNo salein 90 days40% off$88.80$62.16cost + 5%
20Wool BlanketWB-CH90–179 days22$1,936.0016 May 2026131 days agoNo salein 90 days25% off$141.75$92.40cost + 5%
21Cable Knit Sweater — Cream / XLCK6-CRE-XLSlow24$1,879.681 Sept 202623 days ago432daysHold the pricestop reordering$82.24cost + 5%
22Puffer Vest — Olive / XLPV23-OLI-XLSlow22$1,801.3625 Aug 202630 days ago990daysHold the pricestop reordering$85.98cost + 5%
23Travel Umbrella — NavyTU44-NAV180–364 days76$1,763.2022 Feb 2026214 days agoNo salein 90 days40% off$34.80$24.36cost + 5%
24Ceramic VaseCV-0190–179 days30$1,620.001 Jun 2026115 days agoNo salein 90 days25% off$96.75$56.70cost + 5%
25Silk Scarf, Limited EditionSS-LEcost estimatedNever sold18$1,431.00Neverin these ordersNo salein 90 days35% off$103.35$83.48cost + 5%

What this is based on

  • Unit cost is not set on 31 stocked variants. Capital figures for those use an assumed 50% gross margin. Set cost per item in Shopify for exact numbers.
  • 1 variant was stocked less than 30 days ago and is too new to judge.
  • 64 variants sold well last year in the months now ahead, so they are treated as seasonal stock waiting for their season, not as dead stock. They are judged again once the season has passed.
  • A Shopify product export has no "date added", so a variant that never sold is listed as never sold however recently you added it. Store Diagnosis reads that date and leaves stock under 30 days old alone.

products: 356 rows, 25 columns, 0.04 MB · inventory: 356 rows, 19 columns, 0.03 MB · orders: 10,929 rows, 13 columns, 0.93 MB

16 columns were skipped while reading and never stored, including Email, Billing Name, Shipping Name, Shipping City.

In brief

  • Dead stock is stock that has stopped turning into sales. Measured at cost, it is cash you have already paid out and will not see again until it sells.
  • The checker sorts every variant with stock by days since its last sale: under 90 days, 90 to 179, 180 to 364, a year or more, or never sold. Stock that still sells, but too slowly to clear in 180 days, counts as slow.
  • It values each variant at units on hand × cost per item, ranks them by that cash, and suggests a markdown that never prices under cost plus 5%.
  • It runs Store Diagnosis's own dead-stock code in your browser. Your files are not uploaded, and the page's security policy does not let them be.

How the checker decides

Every variant with stock goes into exactly one group, from the date of its last sale in your orders. The groups and their names are the ones Mufatech Clearance uses for "How old is your stock", and the money in them adds up to the money in stock to the cent.

GroupRuleSuggested first move
Never soldIn stock, and not in a single order in your export35% off, then check the listing
A year or moreLast sale 365 days ago or more40% off plus 5 points for each extra quarter unsold, up to 55%
180–364 daysLast sale 180 to 364 days agoAbout 40% off, stop reordering
90–179 daysLast sale 90 to 179 days agoAbout 25% off
Selling slowlyStill selling, with more than 180 days of stock at the pace of the last 90 daysKeep the price, stop reordering
Season aheadSold well last year in the 90 days now ahead, and still sells a little now (needs a year of orders)Wait for its season
New stockFirst sale less than 30 days agoNothing yet
SellingEverything elseNothing

Thresholds are Store Diagnosis's defaults. "Not selling" in the report is the four orange groups at the top; "stuck" adds slow stock.

  • Cash tied up is units on hand × cost per item. Where cost per item is empty, the checker assumes a 50% margin, marks the row "cost estimated" and says how many it guessed.
  • The dead stock score is 100 − 100 × (never sold + 180 days or more + half of 90–179 days + a quarter of slow) ÷ all stock at cost. 100 means no money is stuck.
  • The markdown is rounded down to a 5% step and never prices a unit under its floor, cost plus 5%. If the floor leaves less than 5% of room, it suggests a bundle with a steady seller, or clearing the stock another way, instead of a discount.
  • Days of stock is units on hand ÷ the daily pace of the last 90 days, counted over the days the variant could actually sell. "No sale in 90 days" means there is no pace to divide by.

For the same products, stock and orders, the figures are the ones Store Diagnosis shows: the checker is its dead-stock engine, bundled for the browser, and the page's tests run both on Diagnosis's demo store and compare every variant to the cent. One difference is the file format's: a product export has no "date added", so a variant with no sale at all is listed as never sold even if you added it last week. Store Diagnosis reads that date from your store and leaves stock under 30 days old alone.

How to export the files from Shopify

You need to be the store owner or a staff member who can export products and orders. Large exports are emailed to you rather than downloaded, so keep your inbox open.13

  1. Products export. In your Shopify admin go to Products and click Export. Choose All products and CSV file for Excel, Numbers, or another spreadsheet program, then Export products. For all products Shopify emails the file to you.1 The checker reads the handle, title, SKU, options, price, Cost per item, Inventory quantity and status. Fill in cost per item first if you can: it is "how much it costs you to make or acquire the product or variant", and without it every figure is an estimate.2
  2. Orders export. Go to Orders, click Export, choose All orders (or Orders by date covering at least the last 13 months), pick the CSV format and click Export orders, not "Export transaction histories". More than 50 orders are emailed to you; a very large store can wait an hour or more.3 The checker reads the order number, date, status, currency and each line item's quantity, name, price and SKU. The export also holds your customers' emails, names, addresses and phone numbers;3 the checker skips those columns as it reads.
  3. Inventory export (optional). The products file's inventory quantity is meant for stores with one location.2 With more than one, go to Products › Inventory, click Export, choose All locations, All states, All variants and the CSV format, then Export inventory.4 The checker adds up On hand across locations, which is what Store Diagnosis counts; with the "Available" layout it adds up the location columns.
  4. Drop the files above. All at once is fine: the checker reads each file's header to tell which is which. A 50 MB orders file takes a few seconds; the page stays usable while it reads.

Export every order

A variant whose last sale is older than your orders file looks as if it never sold. An export of the last 90 days turns everything that sold 100 days ago into "never sold". Take all orders, or at least 13 months, which also lets the checker spot seasonal stock.

Why nothing is uploaded, and how you can check

An orders export is a list of your customers. It should not go to a website to answer a question about stock, so the checker is built so that it cannot:

  • The files are read in this tab. The checker hands them to a Web Worker, a background script of this page, which reads each file in 1 MB pieces straight from your disk. Only the summary you see comes back to the page.
  • Customer columns are never kept. In the orders file the reader keeps nine columns: order number, date, cancelled date, financial status, currency, and the line item's quantity, name, price and SKU. Every other cell, including email, billing and shipping names and addresses, phone numbers and notes, is skipped as it is parsed and never stored. The report lists the columns it skipped.
  • The page is not allowed to send your data anywhere. Its Content Security Policy permits connections to one address only, Cloudflare's cookieless page-view counter, and our code never calls it; the worker that reads your files is served with a policy that permits no connections at all.6 Browsers enforce these rules themselves.
  • The download is made here. The results CSV is built in memory and saved by your browser.

To check for yourself, open your browser's developer tools on the Network tab, then drop your files. The only new request is the checker's own code, engine.js, fetched once, and nothing is sent after it. Its source, and the page's app.js, contain no network call at all. Close the tab and the data is gone.

Do it by hand in a spreadsheet

The checker saves the work, but the method is simple enough to do yourself with the same two exports:

  1. In the products export, keep the rows with stock above zero and add a column for cash tied up = inventory quantity × cost per item.
  2. In the orders export, leave out cancelled orders, then find the latest Created at for each Lineitem SKU. A pivot table with SKU as rows and the maximum of Created at as the value does it.
  3. Look up each product row's SKU in that pivot and add days since last sale = today − last sale. No match means it never sold in the file.
  4. Group the rows into 90–179 days, 180–364 days, a year or more and never sold, total the cash in each, and sort the whole list by cash tied up, largest first.
  5. For each row at the top, the floor is cost × 1.05, and the deepest markdown it allows is 1 − floor ÷ price. Start at 25% for 90–179 days and 40% for 180 days or more, never deeper than the floor allows. The markdown calculator adds card fees, shipping, returns and VAT to the floor.

The dead stock guide covers the Shopify reports that help, the formulas and the pitfalls, such as variants without a SKU, which order exports cannot match.

Every night, automatically: Store Diagnosis

Exports go out of date the day after you make them. Store Diagnosis is our free, read-only Shopify app, live on the Shopify App Store. It runs this same dead-stock engine on your store every night, from live stock, cost and every order, with each product's real date added, so new stock is never called dead. Each finding shows the arithmetic, the markdown and the steps to do it in your admin. It never changes a price.

Store Diagnosis, free and read-only.

  • Dead, stale and slow stock valued at cost, every night
  • A markdown that stays above cost
  • Best-sellers about to run out
  • Discounts and refunds that cost margin

Mark it down safely: Mufatech Clearance

Mufatech Clearance is the app that changes the prices. It takes the stuck stock this checker finds, marks it down step by step as it ages, previews every change, blocks any price under your floor, and puts back exactly the prices it changed when a sale ends. It is coming to the Shopify App Store and cannot be installed yet. When it is listed it will have a Free plan for up to 3 campaigns and 200 variants, Pro at $3.99 a month, and Plus at $7.99 a month.

Frequently asked questions

Are my files uploaded anywhere?

No. The files are read by a script running in your browser tab, and the page's security policy does not allow it to send them anywhere: the page may connect only to Cloudflare's cookieless page-view counter, which our code never calls, and the worker that reads your files may not connect at all. Customer columns in the orders file are skipped as they are read. You can watch the Network tab in your browser's developer tools while it runs.

Which Shopify exports do I need?

The products export (Products › Export) and the orders export (Orders › Export), both as CSV. Add the inventory export (Products › Inventory › Export) if you stock more than one location. Export all orders, or at least the last 13 months, so every variant's last sale is in the file.

Why does a product I added last week show as never sold?

A Shopify product export has no date added, so the checker cannot tell a new product from an old one that never sold. Products that have sold are dated from their first sale, and those first sold less than 30 days ago are left alone. Store Diagnosis reads the real date from your store and does not have this gap.

How is the dead stock score worked out?

It is 100 minus the share of your stock at cost that is stuck, weighted by how stuck it is: stock that never sold or has not sold for 180 days or more counts in full, 90 to 179 days counts by half, and slow stock by a quarter. 100 means nothing is stuck. It is the dead-stock score Store Diagnosis shows.

How is the suggested markdown worked out?

It starts at 25% for stock without a sale in 90 to 179 days, 35% for stock that never sold and 40% for 180 days or more, adding 5 points for each further 90 days unsold, up to 15 points more and never above 60%. It is rounded down to a 5% step and never prices under the floor, cost plus 5%. If the floor leaves less than 5% of room, the checker suggests a bundle or another way to clear the stock.

Will it handle a big orders file?

Yes. Files are read in 1 MB pieces, and only the columns the checker needs are kept, so a 50 MB orders export is read in a few seconds on a laptop without the page freezing.

Sources

  1. Shopify Help Center. Exporting products: Products › Export, the choice of products and file type, and when the file is emailed rather than downloaded, checked 10 Oct 2026. vendor-published
  2. Shopify Help Center. Using CSV files to import and export products: the product CSV columns, including Cost per item and Inventory quantity, which applies to stores with a single location, checked 10 Oct 2026. vendor-published
  3. Shopify Help Center. Exporting orders: Orders › Export, emailed exports above 50 orders, and the order CSV columns, including Email, Phone and the billing and shipping name and address columns, checked 10 Oct 2026. vendor-published
  4. Shopify Help Center. Inventory CSV files: Products › Inventory › Export, the All states and Available layouts and their columns, checked 10 Oct 2026. vendor-published
  5. Mufatech Studio. How accurate Store Diagnosis is: the demo store with known answers that this checker's tests also use. first-party
  6. MDN Web Docs. CSP: connect-src: the directive that restricts the URLs a page's scripts can load with fetch, XMLHttpRequest, WebSocket, EventSource and sendBeacon. reference