Sold out products still showing on Shopify: which of the two problems you have
Published September 3, 2026 by Adot Technologies Inc, the team behind Arvio: AI Store Operator. We read the public catalogue and the default collection listing on 30 live Shopify storefronts on September 3, 2026. Every measurement of those storefronts below comes from the 20 that returned a complete list; where this article gives numbers about the sampling frame itself — how many candidate domains there were, how many were dropped — those describe the frame, not the 20.
Two people type this phrase, and they have opposite problems.
One has a product sitting in a box in the back room, and the storefront says sold out. The other has products that really are gone, and they are still on the collection page, above the things a shopper could actually buy.
The fixes have nothing in common, so the first job is telling them apart. That takes one request.
Key takeaways
- If something you have in stock reads as sold out, look at locations before you look at your theme. Shopify's rule is inventory-level based, and an item can sit at a location that does not fulfil online orders while your online store still calls it out of stock.
- If they really are sold out, Shopify does not remove them from your collections for you. On the 20 stores where we could read the whole list, every sold-out product was still in
/collections/all: 211 of 211. - 42 of those sold-out products sat in the first 24 positions of the default collection, and 9 of the 20 stores had at least one that high. The earliest sat in slot 1.
- Catalogue size is the one thing that separated these stores — as a direction, not a rate. The 16 stores under 100 products had a median of 0.0% sold-out products on the shelf. The four stores over 100 had a median of 28.2% — four stores, so read that as a direction, not a rate.
- Shopify documents the fix, and documents the way it silently fails: an automated collection condition on inventory, which does nothing at all if the collection is set to match any condition instead of all.
Your collection page is showing customers things they cannot buy
Finding them costs nothing — the script further down does it, and you should run it either way. Deciding what each one should say afterwards is the part that takes an afternoon: Arvio reads your catalogue's text fields, drafts the changes and applies nothing you have not approved.
The check that tells you which problem you have
Your store publishes its catalogue as JSON, to anyone, with no app and no login. Open this in a browser tab:
https://yourstore.com/collections/all/products.json?limit=250
That returns 250 products at most. If your catalogue is bigger, add &page=2, &page=3 and so on until a page comes back empty — this is the same ceiling that made us throw out ten of our own thirty reads, and a truncated list looks exactly like a clean one.
Search that page for "available":false. Then:
- A product you believe is in stock comes back with
available: falseon every variant → problem 1. It is a stock or location setting, not a display bug. - Products you know are sold out are present in the list at all → problem 2. They are still on your shelf, and the list order is the order shoppers scroll.
Same request, piped through python3, prints the slot number and handle of each one:
python3 -c "
import json, time, urllib.request
store = 'yourstore.com' # <- your domain
slot = 0
for page in range(1, 21): # 20 pages = 5,000 products
url = 'https://%s/collections/all/products.json?limit=250&page=%d' % (store, page)
req = urllib.request.Request(url, headers={'User-Agent': 'shelf-check/1.0'})
products = json.load(urllib.request.urlopen(req))['products']
if not products:
break
for p in products:
slot += 1
v = p.get('variants') or []
if v and all(x.get('available') is False for x in v):
print(slot, p['handle'])
time.sleep(1)
print('read %d listed products' % slot)
"
The last line is the check on the check: if it reports fewer products than your collection holds, the pages ran out early and everything above it is a partial answer.
Slot 1 to 24 is roughly a first page: we could not find a documented platform default, and the first collection page on eight of these stores came back holding anywhere from 5 to 42 products, so treat 24 as our cut rather than as your theme's. That is the same read we ran against 30 storefronts; the numbers below come from the 20 whose lists came back complete.
Problem 1: it says sold out and you are sure you have stock
Shopify's definition is narrow, and both halves of it carry weight: "An item is out of stock when inventory is tracked and the inventory level is at zero or below." (Selling out of stock products) Two conditions, and both have to hold. So there are three places this goes wrong, in the order to check them.
Inventory tracking is on, and the number really is zero. The storefront is reporting your data correctly. Adjust the quantity, or let it sell anyway: the Continue selling when out of stock setting lives in the Inventory section of a product or variant, and Shopify only offers it when the Inventory tracked setting is on.
The stock is at a location that does not fulfil online orders. This is the one that wastes afternoons, and Shopify (Selling out of stock products) states the behaviour plainly: if an item is at a location that fulfils online orders with an inventory level of zero or below, and at another location that has stock but does not fulfil online orders, "then that item is still displayed as out of stock to customers on your online store." The quantity in your admin looks fine. The storefront is not wrong.
A dropshipping app location is missing shipping rates. Shopify's own note (Selling out of stock products) points here when products show out of stock while inventory is available: "If you're using a dropshipping app and your products display as out of stock even though inventory is available, then your app location might be missing shipping rates." Check the app's location before you touch the theme.
For the location case above, Shopify also states the fix in one sentence: "You need to add stock to your location that fulfills online orders to allow customers to purchase that product." That is the whole repair — it is a stock move, not a theme change, and no setting in your theme will substitute for it.
None of those three? Then the product is genuinely unavailable, and you are in problem 2.
Problem 2: they really are sold out, and they are still on the page
Here is what live stores do, rather than what the setting descriptions imply.
We read two public endpoints on each store: the catalogue at /products.json and the default collection at /collections/all. Both cap out at 250 rows, so a store whose list hits the cap has products we never saw, and we dropped those stores. That leaves 20 stores where both lists came back complete.
| Stores | Products listed | Sold out | Still listed in the collection | In the first 24 slots | |
|---|---|---|---|---|---|
| Complete reads | 20 | 920 | 211 | 211 | 42 |
| Hit the 250-row cap | 10 | excluded | excluded | excluded | excluded |
Every sold-out product was still on the shelf — all 211 of them. Across 20 stores, not one had been taken out of the default collection. Read the shape of that evidence before you carry it: only 10 of the 20 had any sold-out product to hide, so the other 10 neither support this nor contradict it, and two of those 10 account for 166 of the 211.
The totals hide the spread. The median store has 2.2% of its collection taken up by things nobody can buy, which is a rounding error. The worst share in the sample was 82 of 156 listed products sold out — 52.6%, more than half the shelf; the biggest pile by count was 84 sold-out products in a catalogue of 176. Ten of the 20 stores had any sold-out product listed at all, and in 9 of them a shopper meets one before scrolling: across those nine the earliest sat in slot 1 and the median first hit was slot 3. In the tenth, the first one sat in slot 31, past the first screen.
Whether this looks like you
Sixteen of these 20 stores carry fewer than 100 products, and their median sold-out share is 0.0%. We cannot see why from outside — a small catalogue may simply never have had much sitting in it. The four stores with 100 or more products have a median of 28.2% — and that median describes none of them. Their four values are 4.6%, 8.7%, 47.7% and 52.6%: two stores with a little and two with half the shelf, with nothing in between. The median sits in the gap.
Four stores is not a rate you should plan against, and 100 products is a cut point we chose after looking at the data, not before. So we moved it — with one thing said plainly: cutting at 75 selects the same four stores as cutting at 100, so that is not a second test. The cuts that do change the grouping are 50 (six stores, median 8.1%) and 150 (two stores, median 50.1%). The smaller side has a median of 0.0% at every one of them, and the direction holds every time; what moves is how much you can say about the larger side, which never gets above six stores. What that says is where to look: if your catalogue is small, run the command above and you will probably close this tab. If you carry hundreds of products, assume the shelf has gone stale until you have checked it.
What Shopify's help page says, and what we read
Shopify's own documentation describes the default listing this way: "By default, your store comes with a collection that displays all your in stock products at the URL your-store.myshopify.com/collections/all." (Hiding out of stock products)
Read that sentence as a merchant and you would not expect what we found. Both are on the record: that sentence is what the help page says, and the JSON above is what the endpoint returned. The Catalog collection is a Shopify-managed default, and it may mean something looser than a shopper would read into it. If that sentence is your model of your own storefront, open the JSON and look.
How to hide them, the way Shopify documents
The mechanism is a collection condition, and it is the same three steps for every collection:
- Turn on inventory tracking for the products. Without it there is no inventory level to test, and the condition below cannot fire.
- In the collection, add the condition
Inventory stockis greater than0. - Set the collection to match all conditions. This is the step that fails silently: Shopify's page on hiding out of stock products carries the note "This solution for hiding out of stock products won't work if you set Products must match to any condition." No error, no warning, and the collection keeps listing everything.
Two more things from that same page:
- The default Catalog page needs its own treatment. You take control of
/collections/allby overriding it with your own collection, then set that collection's automated conditions the same way. - It reverses itself when stock comes back. "Any out of stock products display in your collections again after you receive inventory." This is a display rule, not a decision about the product.
If you would rather it happen on a schedule than as a condition, Shopify Flow has a Publish and unpublish products based on inventory level template, which acts on the product rather than on the collection. That is a different outcome: a collection condition hides the product from a list, while unpublishing takes the product page down. Whether you want the second one is a real question with SEO consequences on both sides, and we worked through it separately in unpublishing out-of-stock products on Shopify.
Turning the condition on takes two minutes. Working through the catalogue behind it does not.
Arvio goes through your products one at a time. What it changes, what it leaves alone and what it got wrong on a real store, we wrote up separately in what Arvio actually does.
What this article does not know
- We have no admin access to any of these stores. So we cannot tell you whether a store shows sold-out products by accident or on purpose, and plenty of stores do it on purpose: a sold-out product page keeps the URL that already ranks, and it keeps collecting demand signal.
- We read the JSON list, not the rendered page. A theme can grey out or visually hide a product that is still present in the list. Everything above is about what the collection publishes, not about what pixels a shopper sees.
- Ten of the 30 stores hit the 250-row cap on the collection list and are excluded from every number here. Bigger catalogues are exactly where this problem concentrates, so what we measured is the smaller half of our own sample.
- "First 24 slots" is our cut, not a platform constant. We could not find a documented Shopify default;
shopify.devonly says a paginated list holds "between 1 and 250" items. When we counted what the first collection page actually returned on eight of these storefronts we got 5, 12, 16, 16, 16, 20, 24 and 42 products. So read "the first 24" as the first two dozen positions in the listing — for some themes that is more than one screen, for others less. - One read, one day. A collection is a live object; a store that looked clean on September 3 may not be clean next week.
How this was measured
Sample. The frame is built from store URLs their owners posted publicly on the Shopify Community asking for feedback: 720 topics, 474 distinct store domains, of which 230 still served a catalogue on August 26, 2026. From those 230 we drew 60 at random with a recorded seed (20260826), then asked the first 35 in alphabetical order; 30 answered, and 20 of those returned complete lists. Only the 230 to 60 step is random — the 35 is a prefix of that draw, so the seed reproduces the 60, not the 35.
The biggest bias is survivorship. Of the 474 candidate domains, 244 no longer served a catalogue at all. Stores that closed are missing from every number here, and a closed store is not a store that kept its shelf clean. The frame also skews newer and smaller than the Shopify population.
Endpoints, September 3, 2026. Per store: one GET /products.json?limit=250 and one GET /collections/all/products.json?limit=250, one request per second, with a user agent identifying our research crawler and carrying a contact address. No authentication, no app, nothing that is not public.
Sold-out definition. A product counts as sold out when it has variants and every variant reports available: false. Products with some variants available are not counted. We never see inventory quantities — available is what the storefront publishes.
Position. We take the collection order as returned and record the 1-based slot of each sold-out product. First screen is slots 1 to 24.
Exclusion rule. Both endpoints return at most 250 rows. Any store whose collection list came back at 250 rows is excluded from every denominator, because the sold-out products we found in its catalogue may simply be past the cut. That rule removes 10 of the 30 stores. It also removes an artefact: counted naively across all 30 stores, 163 sold-out products look as though they were kept out of the collection, and on the 20 complete reads that number is zero, store by store.
FAQ
Does Shopify hide sold-out products automatically?
No. Nothing in the default setup removes a sold-out product from a collection. Hiding it is a collection condition you add, an app, or a Flow workflow — and on the 20 stores we could read completely, every sold-out product we found was still listed.
Why does a product show as sold out when I have stock?
Because Shopify calls an item out of stock when inventory is tracked and the level is zero or below at the locations that fulfil your online orders. Stock at a location that does not fulfil online orders does not count, and Shopify says such an item is still displayed as out of stock on your online store.
Should I hide sold-out products or unpublish them?
Different outcomes. Hiding removes the product from a collection while its product page stays up. Unpublishing takes the page down, along with whatever that URL had earned. We went through that trade-off in unpublishing out-of-stock products.
Will the condition hide products I want to keep visible?
It hides everything at or below zero inventory, including things you are happy to keep listed for preorder. If you want those to stay purchasable, turn on Continue selling when out of stock for them, which keeps them buyable rather than merely visible.
How do I know it worked?
Re-run the command at the top of this article. It reads the same list a shopper's browser reads, so if a handle still prints, the product is still on the shelf.
Does any of this affect Google?
Only indirectly, and not through this file. What Google reads is your product pages and structured data, and a sold-out product publishes an availability value there too. That is a separate check, and we measured it separately in products missing from Google Shopping.
Arvio: AI Store Operator — install it on the Shopify App Store. The condition is one setting; the catalogue behind it is the work.
