Finding the Shopify products that have never sold at all
Shopify's inventory reports only include products that have sold at least once — so the products you are looking for are precisely the ones the report leaves out. Shopify staff confirmed there is no report for this in 2024, and merchants have been asking since 2018.
There is no native report for this, and the reason is structural rather than an oversight. The reports that look right — sell-through rate, percentage sold, inventory remaining — all count only products that have sold at least once, so a product with zero sales simply is not in the list. The honest native route is an export and a cross-reference, and it has a specific snag worth knowing before you start.
If what you want is for the price to move once something has sat too long, that is a separate problem with separate answers — this page is about getting the list.
Shopify staff have confirmed there is no report
The clearest statement came in an official inventory session in September 2024, when a merchant asked whether sales reports could show products with zero movement:
Sales Reports: To identify products with no sales, you can utilize the 'Sell-Through Rate by Product' or the 'Average Inventory Sold per Day' metrics. […] Please note that there isn't a specific report available to highlight products with no inventory movements.
— Shopify staff, 11 September 2024
Note what happens there: two proxy metrics are offered, and then the gap is conceded. Both of those metrics have the same flaw, and a merchant had already documented it a year earlier — the sell-through report "excludes certain variants that haven't sold any units."
Another put the structural point in one line:
These reports only include products that have at one point been part of an order.
— hannakopo, 31 January 2023
That is the whole problem. The reports are built around sales, and you are looking for the absence of sales.
The oldest description of this is from 2018, and it also names the trap in the workaround:
I've noticed that when generating reports, Shopify doesn't return items that have 0 sales. The only way to find these items is to export your inventory and sales and cross reference. With a store of 1000+ products, and 2000+ variants, this is a nightmare. The product export and sales export have different names too, so running a VLOOKUP isn't effective.
— Greg_Middle, 15 October 2018
Seven years later, in May 2025, a merchant asked the same question and was told to go and search the App Store.
Two free tricks that half-work
Worth trying before you buy anything, and worth understanding why each stops where it does.
Sort a sales report ascending. A merchant found that the sales-by-product report accepts a sort parameter directly in the address bar, ordering by net quantity from the bottom up. His verdict was "actually this nails it" — and for finding your worst sellers it does. It will not show you products with zero sales, because they are not in the report at all. Useful for the tail, useless for the truly untouched.
The storefront best-selling sort has the same shape and one extra flaw. A collection sorted by best selling ranks by all-time orders, so the dusty items drift to the end — but the sort cannot be reversed, so you are scrolling to the last page to find them, and again, never-sold items are ranked arbitrarily rather than shown as a group.
The pattern is consistent: everything Shopify gives you ranks products by sales, and the ones you want have none to rank by.
And you cannot filter by stock age either. Shopify keeps no arrival date on the stock itself and there is no last-sold date to filter on; what exists is the date a delivery was received, which a custom report can show as "Shipment received at". That is one date per delivery rather than per unit, so a product restocked last week reads as new even if last year's units are still at the back of the shelf. A merchant asked for exactly this in September 2022 and described the ideal:
Hence it's been sat on the shelf now and not sold for 6 months, so I need to reduce the price or add to the sales collection. An alert would be the perfect solution so I'm notified after a set amount of days or months that, that specific item has been sat in the inventory for 'X amount of days' and has not sold but a report would work too.
— BenStone, 29 September 2022
Two other merchants added themselves to that thread over the following two years — "I have the same need, did you ever find out how to do this?" — and the only answer came from a reporting vendor. Another merchant with 350 products trying to work out inventory age was eventually told to export it and use a date formula in a spreadsheet.
The wall everyone hits second
Merchants who solve the finding half immediately run into the other one, and two quotes prove it better than any explanation.
A merchant who had the report and wanted it to do something:
Reports are nice. But you can't automatically add them to a collection or give them a tag. Without doing something like export, edit, import. Is there another way?
— DutchMudMen, 6 November 2023
And a merchant who had bought a reporting app, got his list of never-sold products, and could not push the result back:
We're having difficulties feeding the data back to Shopify to delete all these products.
— LothaireBordeau, 26 March 2025
The reply came from the reporting vendor themselves, and it is admirably straight: they receive data from Shopify, and they do not send it back. A reporting app gives you a list, not an outcome. If your plan was "buy the report, then act on it", that is the sentence to plan around — and Shopify Flow does not close it either: its triggers cover inventory quantity and scheduled times, not sales recency, so there is nothing to start a workflow on.
Got the list and nowhere to put it? Describe what should happen to them and we build it →
Your options, honestly
| Approach | Finds zero-sale items? | What you get | Cost |
|---|---|---|---|
| Native reports | No — excluded by design | — | Free |
| ABC analysis (grade C) | No — ranks products that did sell | A ranking | Free, fixed 28-day window |
| Export + cross-reference | Yes | A spreadsheet, every time | Free, and it is manual work |
| Reporting apps | Yes | A view, not an outcome | Monthly fee |
| Shopify Flow | No trigger for it | Tags and collections, by non-sales criteria | Free |
| Automation scripting tools | Yes, with code | Whatever you write | Monthly fee plus a developer |
One merchant installed a well-regarded one of those and removed it again: "I couldn't figure out how to write the code to create this flow." They are genuinely developer tools.
One thing that is not a plan question any more: Shopify says you can "save your changes as custom data explorations, regardless of your Shopify subscription", so a saved report is available on every plan. The limit that does bite is history — "Historical data for inventory-based metrics go back only to October 1, 2023" — so if you are looking for something that last sold before then, the data is not there to find.
And a limit that catches out anyone buying automation for this. An App Store app can only read the last 60 days of orders without a separate approval Shopify grants by hand, requested in the Partner Dashboard. It follows that no tool without that approval can prove on day one that something has not sold in six months; it can only start watching from the day it is installed and know for certain after that. Nobody selling in this space mentions it. (A custom app you build for your own store is outside this: Shopify grants those the scope automatically.)
And if you rely on Stocky for this, one merchant confirmed it does list zero-sale products — but Stocky is no longer available as of 31 August 2026, so that route has closed.
On Stocky and losing the one thing that finds these? Describe what Stocky did for you and we rebuild it →
Which route is yours
| Your situation | Route |
|---|---|
| A few hundred products, reviewed occasionally | Export and cross-reference; it is free and it works |
| You want the list regularly but will act by hand | A reporting app |
| You want the list to keep itself, and to act | Nothing native does this — see below |
| You want products archived or hidden automatically | Flow can do this half — but not the finding half |
| Thousands of products across many suppliers | The manual route stops scaling; this is where it is worth building |
A fourth option: the list that keeps itself
Every route above splits the job in two — something that finds, and something else that acts, with a spreadsheet in between. That gap is the whole problem, and it is why merchants who buy a reporting app end up back where they started.
Closing it is one rule: something watches how long each product has gone without selling, and when your threshold passes it tags the product. If your store has a collection that gathers products by that tag, the collection is the list — open it any time, and it is current rather than as current as your last export. The same rule can email you the week's arrivals on that list instead, if you would rather be told than go and look.
Describe it in your own words — "anything that has not sold in 90 days, tag it 'review' and tell me on Mondays, but never these twelve lines" — and it is built for your store against your own data. You see in your Shopify admin, in plain language, what is switched on and what it has done.
Stock that has not moved since before you connected us — the shirt added three years ago and never touched since — is the pile this is for, and it needs one thing said out loud. Your store tells us about a product when it is created, edited, sold, or its stock moves, so a shirt nobody has touched in three years is not something it mentions on its own: your existing products are loaded for you as part of the build. Say that your clear-out is exactly that pile when you describe it, and it is covered from the rule's first run rather than from the next time somebody touches a shirt.
The clock still runs forwards. The 60-day order limit above binds this too: "has not sold in 90 days" is a promise kept from day 91, and the number you are shown never counts a period nobody was watching.
And if you want the price to move as well as the tag, that is the ladder on the markdown page — same rule, one more step, and a switch you press before any price changes. That page also carries the thresholds merchants actually use, if what you need is a number to start from rather than a mechanism.
Where it is not worth it: a small catalogue you know by heart, or a one-off clear-out. Export the list, act on it by hand, and move on. Where it is: a catalogue big enough that you cannot hold it in your head, and a review that has to happen on a rhythm — where the thing that costs you is nobody noticing for two months. One merchant described exactly that: 500 pairs of footwear sitting before anyone looked.
A person here takes it on straight away and has it working in your store within 24 hours.
Shopivibe solves the problem in your store and keeps what it adds maintained, including when Shopify changes something underneath. Shopivibe is free during early access, with 3,500 credits included. Credits beyond the included 3,500 cost $0.06 each.
Want the dead-stock list to keep itself? Describe the list you want and how often →
Checked against Shopify's documentation and the App Store on 13 October 2026.