Find Shopify products that haven't sold, and act on them
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.
Two separate problems here, and most articles only cover the first.
Finding them. There is no native report. The ones 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.
Acting on them. This is where everyone stops writing. Getting a list is not the job; marking things down is. Shopify Flow, the obvious candidate, cannot change a price and cannot create a discount — so the automation most merchants imagine does not exist natively at all.
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.
You cannot even tell how old the stock is
A related gap that catches people out. Shopify does not expose a date the stock arrived, or a last sold date, anywhere you can filter or report on.
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.
So if your rule is "anything that has been here twelve months", note that Shopify is not storing the fact you would need. You have to record it yourself from the day the stock lands.
The wall everyone hits second
Merchants who solve the finding half immediately run into the other one. 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.
Got the list and nowhere to put it? See what report-plus-action looks like as one thing →
Why the obvious automation does not work
Shopify Flow looks like the answer and is not, for two reasons that are worth stating plainly because no page publishes them.
There is no trigger for "has not sold in X days." A merchant trying to auto-archive products with no sales in 90 days put it exactly: "I can't figure out how to add the condition in Shopify flow to check sales." The thread ended unresolved. Flow's triggers cover inventory quantity and scheduled times — not sales recency.
And Flow cannot change a price or create a discount. It can tag a product, add it to a collection, publish or unpublish it, change its status, or delete it. Those are the actions. Repricing is not among them, and a merchant who tried to reach around it with a direct API call also ended up unresolved.
So the native ceiling is: Flow can tag and collect products by criteria that are not sales-based, and an automatic discount can then target that collection. The half you actually need — identifying what has not sold — cannot be automated natively at all.
Developer automation tools exist, and they are genuinely developer tools. One merchant installed a well-regarded one and removed it again: "I couldn't figure out how to write the code to create this flow."
What merchants actually asked for, and got told no
The clearest statement of the goal, from May 2025:
I basically want to figure out which products and variants haven't sold in the past 1, 2 and 3 months so I can then put discounts on them
— S_P33, 5 May 2025
And the clearest illustration of how the ask gets misheard — a merchant wanted a markdown ladder driven by how long something has sat, and Shopify staff recommended three scheduled-discount apps:
Thank you but these apps don't offer the solution I'm asking for. I'd like to set a rule on certain items where if it doesn't sell for a set period of time, the item will be further discounted.
— hwojner, 26 April 2023
Two years later, another merchant found that thread and added that his previous platform had done it: an item would automatically drop in price every day, week or month until it sold. His verdict was honest in both directions — "It worked very well to keep inventory moving (even if it killed profits and hurt on some things.)"
That caveat is worth carrying. An automatic markdown ladder will clear stock and it will give away margin on things that would have sold anyway.
The review periods merchants actually use
Nobody publishes this, and one merchant asked for it directly — "Do you have a recommended time on items that would be considered slow moving? 1 year? 5 years?… is there is a general rule?" — and never got an answer.
From merchants describing their own rules: 3 weeks for items already in a sale section, 45 days as a notification threshold, 1, 2 and 3 months as discount tiers, 90 days before auto-archiving, and 6 months before repricing. The range tells you these are business decisions rather than a standard — but if you needed a starting point, a first review somewhere between 45 and 90 days is where most of these cluster.
Your options, honestly
| Approach | Finds zero-sale items? | Can it act? | Cost |
|---|---|---|---|
| Native reports | No — excluded by design | No | Free |
| ABC analysis (grade C) | No — ranks products that did sell | No | Free, fixed 28-day window |
| Export + cross-reference | Yes | No | Free, and it is manual work every time |
| Reporting apps | Yes | No — they read, they do not write | Monthly fee |
| Shopify Flow | No trigger for it | Tag, collect, archive — not reprice | Free |
| Automation scripting tools | Yes, with code | Yes, with code | Monthly fee plus a developer |
⚠️ One thing to check on your own store: saving a custom report requires a higher plan tier than simply building one, and Shopify's analytics history begins 1 October 2023 — 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 building or buying automation for this. Apps can only read the last 60 days of orders without a separate approval from Shopify — a permission that has to be requested and granted by hand, even for a private app built just for your store. It follows that no tool 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. If your rule needs a long look-back, either accept a warm-up period or plan for that approval. Nobody selling in this space mentions it.
⚠️ And if you rely on Stocky for this, one merchant confirmed it does list zero-sale products — but Stocky is being retired after 31 August 2026, so that route is closing.
On Stocky and losing the one thing that finds these? See what replacing it looks like →
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 price to move without you touching it | Nothing native does this |
| 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 |
| You need the old price kept as a compare-at price | Not natively; an Italian merchant asked for exactly this in 2022 and got app suggestions |
A fourth option: make the report do something
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 means one thing watching how long each product has gone without selling, and acting when your threshold passes — marking it down by a percentage, moving it to a clearance collection, tagging it, hiding it — with the original price kept as the compare-at so the reduction shows properly. Your thresholds, your steps, and your exceptions for the lines that must never be discounted.
That is straightforward work. It is also exactly the kind of thing that stays unbuilt as a mass-market app, because every merchant's ladder is different — which is why the apps that do exist in this niche launched in the last six months and have almost no reviews.
Tell Shopivibe what you want your store to do — "when a product has not sold in 60 days, take 10% off and move it to clearance — but never these twelve lines" — and it works out how, builds it, and checks it against your own store's data before anything goes live. You see in your Shopify admin, in plain language, what is switched on and what it has done. It stays looked after; there is nothing for you to run.
Early access is open now, and the $49 plan is free for the whole of it.
Where this one stands today, plainly. Writing back to your store already works for tags, metafields, draft orders and redirects. A scheduled price change is the same kind of write and is next on the list rather than live — so this is one to tell us about now and have waiting, not one to switch on this afternoon.
Where it is not worth it: a small catalogue you know by heart, or a one-off clear-out. Export the list, discount it by hand, and move on.
Where it is: when the review has to happen every week, when the ladder has steps, and when forgetting costs more than the discount does. One merchant described the cost of finding out late — 500 pairs of footwear sitting for two months before anyone noticed. The discount was never the expensive part.
Checked against Shopify's documentation and the App Store on 29 July 2026.