Field guide 15

How to Find Dead Stock in Shopify in 7 Steps

A seven-step method for finding dead stock in a Shopify store using the product export, the inventory CSV, and the inventory reports Shopify lets you date, with a worked example that runs 1,840 variants down to twenty priced lines.

Finding dead stock in Shopify takes seven steps, and the last one is the only one that produces a dollar figure. You set a no-sale window, confirm cost per item, export the product and inventory CSVs, then pull a year of sales. Shopify ranks what sold, so the zero-sale list gets built by subtraction.

Key Takeaways

  • Dead stock is inventory with no verified sales history over the measured window, and Shopify has no report that lists it directly.
  • Shopify's ABC product analysis grades variants on the last 28 days of revenue, and that window can't be adjusted, per Shopify's documentation.
  • Shopify's Products by percentage sold report includes only variants that sold at least once during the selected period.
  • Shopify reports profit only for products and variants that had cost recorded at the time they were sold.
  • Shopify's inventory CSV export carries on-hand units by location with no cost column, so dollar figures need the product export too.
  • U.S. retailers held $832.4 billion in inventories in May 2026 at an inventories-to-sales ratio of 1.25, per the U.S. Census Bureau.
  • Where production launch status and workspace eligibility permit, Cash Margin Partners connects to Shopify read-only and never writes to the store's account; compatible item-level uploads remain available after column review.

Shopify Tells You What Sold. It Doesn't Tell You What's Stuck.

Shopify's inventory reports rank movement. Dead stock, which is inventory with no verified sales history over the measured window, generates no movement to rank.

Every Shopify store has a back room. Sometimes it's a stockroom behind a sales floor, sometimes a spare bedroom with shelving. Either way, it's where cash goes to sit down and stop moving.

The ABC product analysis report grades each variant by the share of revenue it contributed over the last 28 days. A grades cover the products making up 80% of revenue, B grades the next 15%, and C grades the last 5%.

A C grade still means revenue. A variant that sold nothing over those 28 days contributed none. It has no share of the 80/15/5 split to occupy.

Shopify states the same limit outright in a second report. Products by percentage sold returns only variants that sold at least once during the selected period.

The third one closes the loop. Inventory remaining per product divides ending quantity by the average quantity sold per day over the last 28 days. Anything that stopped selling puts a zero in that denominator.

The reports built to rank slow movers filter out the items that already stopped. That's the gap this method fills.

You can size the pile through the free CMP workspace after a successful supported import with sufficient history and cost evidence. Direct Shopify availability depends on production launch status and workspace eligibility; compatible item-level uploads remain available after column review. Cash-at-risk is the dollar value of inventory the model forecasts won't sell inside the window.

What You Need Before You Start

This method runs on the standard Shopify admin and a spreadsheet. Shopify states that "Shopify Analytics' main features are available to merchants on any Shopify subscription plan." Staff accounts need the Analytics permission switched on to open reports.

  • Shopify admin access with permission to export products and open the reports section.
  • Cost per item recorded on the variants you plan to price, or a willingness to backfill it in step two.
  • A measurement window with a start date and an end date, written down before you begin.
  • A spreadsheet with a lookup function, which is the only piece of software this method adds.
  • Roughly 45 to 90 minutes, depending on catalog size.

Multi-location stores need one extra file. Shopify's product CSV carries an Inventory quantity column that "applies only to Shopify stores that have a single location." The inventory CSV in step four does the real work there.

The 7 Steps to Find Dead Stock in Shopify

Step 1. Set the window and the two thresholds before you open a single report

Two numbers define dead stock in your store: days with no sale, and minimum units on hand. Fix both in writing before any data appears on screen. A threshold chosen after you see the answer drifts toward the answer you wanted.

Twelve months and one unit is the default worth starting from. A year covers one full seasonal cycle, so a Christmas item that sold last December stays off the list.

Shorten the window to 90 or 180 days for fast-turning consumables. Stretch it to 24 months for furniture and high-ticket goods where a two-turn year is ordinary.

Worked figure: a 1,100-square-foot home goods and gift store sets the window at 365 days ending July 31, 2026. The unit floor is 1. If your window and your inventory turnover calculation use different date ranges, the two numbers won't reconcile later.

Step 2. Confirm cost per item is filled in on the variants you plan to price

Every dollar figure here comes from the Cost per item field. A blank there becomes a zero in your total, and Shopify documents the dependency twice.

Shopify's profit reports state: "Profit is reported only for products and variants that had cost recorded at the time they were sold." The Month-end inventory value report totals only products with a cost per item value assigned.

Check it two ways. Open Month-end inventory value and compare its variant count against your catalog. Or run the product export first and sort the Cost per item column for blanks.

Worked figure: the gift store finds 212 of 1,840 active variants with a blank cost field. Most trace back to one vendor added by bulk import in 2024.

Operator Tip: Backfill cost on the biggest piles first

Sort your blank-cost variants by on-hand units and fill the top 50 before you fill anything else. Those lines hold the most dollars, and 50 entries takes about twenty minutes.

Backfilling cost today corrects value reporting going forward. Orders already placed keep whatever cost was recorded at the time of sale, so historical profit reporting stays as it was.

Step 3. Export the full product catalog, because it's the only file that carries cost

Go to Products in the Shopify admin, click Export, and choose All products. Shopify offers four scopes: the current page of products, all products, products you have selected, and products matching your search and filters.

The Shopify product CSV includes a Cost per item column. Shopify defines it as "How much it costs you to make or acquire the product or variant." The file also includes an Inventory quantity column for single-location stores.

Worked figure: the gift store's export lands as a 1,840-row file. Rename the tab "catalog" and leave it untouched, because every later step reads from it.

Step 4. Export the inventory CSV to get on-hand units by location

The Shopify inventory CSV carries Handle, Title, SKU, Location, Bin name, Incoming, Unavailable, Committed, Available, and On hand columns. Available is the count you can sell right now.

That file has no cost column. Joining it to the catalog export on SKU turns a unit count into a dollar figure. That's the step most spreadsheets skip.

Single-location stores can lean on the Inventory quantity column already in the product export and skip this file. Two-location stores need it, because a SKU dead at one address may be selling at the other.

Worked figure: the gift store runs one location, so it uses the product export's Inventory quantity column and moves on.

Step 5. Pull a year of sales from the two inventory reports Shopify lets you date

Two of Shopify's dateable inventory reports belong in this method. Inventory sold daily by product shows the average number of items sold per day by product variant across the period you select.

Products by sell-through rate shows sell-through, the share of units received that sold in a period. Shopify calculates it as total quantity sold divided by total quantity sold plus total quantity still in inventory.

Set both to your window from step one and export each to CSV. The ABC product analysis report runs on a fixed 28-day window that can't be adjusted. That rules it out as the sales side.

Worked figure: across 365 days, 1,213 of the gift store's variants appear in the Inventory sold daily by product export. The other 627 never show up.

Step 6. Build the zero-sales list by subtraction

Look up every SKU from your dated sales export against the catalog tab. Any SKU returning no match sold zero units inside the window, and that no-match set is your raw dead stock list.

Filter the result on units. SKUs with zero sales and zero on hand are discontinued lines that already left the building. Move them to a separate tab so they stop inflating your count.

Worked figure: 627 zero-sale variants drop to 418 once the store filters for at least one unit on hand. The 209 removed were sold out or written off years ago.

Key Insight: This is the step Shopify won't do for you

No Shopify report performs the subtraction in step six, because every inventory report starts from variants that generated activity. A catalog export minus a dated sales export is the only way to produce a zero-sale list inside the native admin.

Anyone selling you a Shopify dead stock report is running this same subtraction somewhere behind the interface.

Step 7. Multiply on-hand units by cost, sort descending, and cut the list at twenty lines

Add one column: on-hand units times cost per item. Sum it, and that total is the cash your store already spent that has produced nothing for a year.

Sort the column high to low and draw a line under row twenty. A 418-line list gets no decisions attached to it, while a twenty-line list gets worked through in a single afternoon.

Attach one disposition to each of the twenty: markdown, bundle, vendor return, or liquidation. Write the choice in a column beside the dollar figure so the sheet becomes a work order.

Worked figure: the gift store's 418 dead variants hold 2,946 units worth $63,400 at cost. The top twenty lines alone account for $28,900 of that.

A Worked Example, End to End: 1,840 Variants Down to Twenty Lines

Take the same 1,100-square-foot home goods and gift store, running one Shopify location with $6,800 in monthly rent. This is an illustrative example rather than a named client, and the arithmetic is the point.

StageCountWhat produced it
Active variants in catalog export1,840Products, Export, All products
Variants with a blank Cost per item212Sorted the cost column for blanks
Variants with at least one sale in 365 days1,213Inventory sold daily by product, dated
Zero-sale variants627Catalog minus dated sales export
Zero-sale variants still holding units418Filtered for on hand of 1 or more
Units held by those variants2,946On-hand column, summed
Value at cost$63,400Units times cost per item
Value in the top twenty lines$28,900Sorted descending, cut at row twenty

The $28,900 concentrated in twenty lines equals more than four months of that store's rent. Six of the twenty trace back to a single ceramics vendor bought deep in spring 2025 at a quantity discount.

The owner sent four lines back to that vendor for credit against fall goods. Seven became gift sets at a blended markdown, and nine moved to a second sales channel. The 212 blank-cost variants went on a separate tab, counted in units, priced later.

Size your own version of that $28,900 today

The free diagnostic reads the same Shopify fields this manual method pulls: product, inventory, cost, and order history. It returns a cash-at-risk figure per SKU without a spreadsheet, a credit card, or a trial clock.

Open the free CMP workspace and use an eligible production Shopify connection or compatible item-level upload. Review the result after the import succeeds with sufficient history and cost evidence.

Key Data Point: The national inventory position, May 2026

U.S. retailers held $832.4 billion in inventories at the end of May 2026, per the U.S. Census Bureau. The inventories-to-sales ratio stood at 1.25.

Clothing and clothing accessory stores ran at 2.11 that month, per Census data published by the St. Louis Fed. That works out to about two months of sales sitting in stock.

Common Mistakes at Each Step

Six of these seven mistakes produce a number that looks right and reads wrong. The seventh produces no number at all.

StepThe mistakeWhat it does to your answer
1Picking the window after seeing the dataThresholds slide until the pile looks acceptable
2Ignoring blank cost fieldsBlanks total as zero and shrink the pile silently
3Exporting the current page instead of all productsFifty rows of a 1,840-row catalog
4Using the product export at a multi-location storeInventory quantity covers single-location stores only
5Reaching for ABC product analysis as the sales sideA fixed 28-day window graded on revenue contribution
6Counting zero-sale SKUs with zero units on handDiscontinued lines inflate the count with no cash behind them
7Working all 418 lines at onceThe list gets abandoned before any of it converts

One more sits outside the steps. Running this once and calling it done turns a repeatable diagnostic into a one-time cleanup. Next spring's buy rebuilds the pile.

How to Check Your Work

Four checks catch nearly every error this method can produce, and all four take under fifteen minutes combined.

Check 1: Reconcile total units against the Shopify inventory page

Sum the on-hand column across your full export and compare it to the total on Shopify's inventory page. A gap larger than a percent or two means the export ran mid-sync. It can also mean the location filter missed a location.

Check 2: Reconcile total value against Month-end inventory value

Multiply units by cost across the whole catalog and compare that sum to Shopify's Month-end inventory value report. Shopify's report totals only products with a cost per item value assigned. Your figure should sit above Shopify's by roughly the value of the blank-cost lines.

Check 3: Physically count five of your top twenty lines

Walk to the shelf and count five of the twenty biggest dollar lines by hand. Two miscounts out of five means the underlying inventory record has drifted, and the dead stock list is downstream of that problem.

Check 4: Confirm the number changed a decision

A dead stock list that produced no markdown, no vendor call, and no listing was a data exercise. The output of step seven is a set of disposition decisions with dollar figures attached. Keep the sheet open until each of the top twenty has one.

Where the Spreadsheet Method Stops Paying

The seven steps above work, and they cost nothing beyond your time. They also expire the moment the next order arrives. The answer describes one window that closed the day you ran it.

Cash Margin Partners is an inventory cash-recovery practice for independent, owner-operated retailers. CMP shows them exactly how much cash is trapped in unsold inventory and gives them a prioritized plan to get it back.

Where production launch status and workspace eligibility permit, CMP reads supported Shopify catalog, inventory, and sales fields through a read-only Shopify connection, plus unit cost when Shopify exposes it. Compatible item-level uploads remain available after column review, and CMP never writes to a retailer's account.

Read-only means what it says. Markdowns, price changes, and inventory adjustments stay with the owner, and the connection detail covers token encryption and the scopes Shopify grants.

The Cash Margin Partners product and workspace are free, with no credit card and no time limit. After a successful supported import with sufficient history and cost evidence, it can produce a cash-at-risk figure and rank eligible recovery candidates while holding new or incomplete items as Data Incomplete. Forecasting requires a recent successful supported live connection with sufficient usable evidence.

Cost pressure gives this work a deadline. In the Federal Reserve's 2026 Report on Employer Firms, 77% of small firms named rising costs as a financial challenge. Among firms seeking financing, 56% did so to meet operating expenses.

That survey drew 6,525 responses from firms with 1 to 499 employees. Money already spent on ceramics that stopped selling is money a store owns and can convert back without borrowing anything.

Start Here: Four Moves You Can Make Today

  1. Write your window and unit floor on paper before you open Shopify. Twelve months and one unit if you have no reason to pick otherwise.
  2. Run Products, Export, All products, and sort the Cost per item column for blanks. This takes four minutes and tells you whether step seven will produce a real number.
  3. Open Inventory sold daily by product, set the range to the last 365 days, and export it. That file is half of the subtraction.
  4. Run the free calculator for a directional questionnaire-based benchmark. Use the connected workspace or your spreadsheet—not the benchmark—as the SKU-level source of truth.

Frequently Asked Questions

Does Shopify have a dead stock report?

Shopify has no report named dead stock and no report that lists zero-sale variants directly. The closest built-in reports are ABC product analysis, Products by percentage sold, and Products by sell-through rate. All three rank variants that generated sales.

Shopify documents that Products by percentage sold includes only variants sold at least once during the selected period. A zero-sale list has to be built by subtracting the sellers from a full catalog export.

How long does inventory have to sit before it counts as dead stock in a Shopify store?

Dead stock is inventory with no verified sales history over the measured window. The window is a choice the owner makes rather than a fixed industry number. Twelve months covers a full seasonal cycle and works as a default for apparel, gift, and home goods.

Fast-turning consumables justify a shorter window of 90 to 180 days, and furniture or high-ticket categories justify longer. Write the number down before you open a report so the answer doesn't move while you work.

Why doesn't my slow-moving inventory show up in Shopify's ABC product analysis?

Shopify's ABC product analysis grades each variant by the percentage of revenue it contributed over the last 28 days. That timeframe can't be adjusted.

A C grade means a variant landed in the bottom 5% of revenue, so a C-graded product still sold something. A variant with no sales in the 28-day window contributed no revenue and has no share of the 80/15/5 split to occupy.

Do I need a higher Shopify plan to see inventory reports?

Shopify states that "Shopify Analytics' main features are available to merchants on any Shopify subscription plan." Staff accounts need the Analytics permission enabled to open reports and dashboards.

The product export and the inventory CSV export are part of the standard admin. Neither one is a reporting add-on.

What should I do if the cost per item field is blank on half my Shopify products?

Backfill cost per item on the variants holding the most units first, because those lines carry the most dollars. Shopify reports profit only for products and variants that had cost recorded at the time they were sold. Backfilling today fixes forward-looking value reporting rather than past orders.

Run the zero-sale list anyway and keep the blank-cost SKUs on a separate tab, counted in units. Price them once cost is entered.

What is the difference between dead stock and slow-moving inventory?

Dead stock is inventory with no verified sales history over the measured window. Slow-moving inventory is inventory that still sells, but below the rate that justifies the shelf space and the cash it holds.

The two need different exits. Dead stock usually leaves through liquidation or a vendor return, and slow movers often respond to a markdown or a bundle. Our guide to excess inventory covers both categories and the costs each carries.

Can Cash Margin Partners change anything inside my Shopify store?

No. Where available for an eligible production workspace, the Cash Margin Partners Shopify connection is read-only, and CMP never writes to a retailer's Shopify account.

After a successful supported import with sufficient evidence, CMP reads Shopify catalog, inventory, and sales data, plus unit cost when Shopify exposes it, to produce the eligible-SKU analysis. New or incomplete items remain Data Incomplete. Every markdown, price change, and inventory adjustment stays in the owner's hands.

Run It Before the Next Order Ships

The 627 zero-sale variants in the example store took four seasons to accumulate and one afternoon to find. Nothing about that arithmetic changes while you wait, except the number of months the same cash has been holding still.

Set your window, export the catalog, and run the subtraction. Or create a free CMP workspace and use an eligible production Shopify connection or compatible item-level upload, then review the result after a successful import with sufficient evidence. Check the other nine signs your cash is trapped in inventory against your own store.

Put the thinking to work

See what your inventory is doing to your cash.

Customer supportGuides with human follow-up

CMP privacy controls

Cookie preferences

Optional technology stays off unless you choose it. You can change your mind here at any time.