Shopify's "Hide Out of Stock Products" Feature Doesn't Hide Them From Google

By Milan Dhameliya · · 8 min read

Shopify's built-in "hide out of stock products" trick only removes a product from one collection's grid — the page itself stays Active, stays in the sitemap, and stays exactly as indexable as it was in stock. Across the 56 stores in our free scanner's corpus, 18% have products that are completely sold out and still published this way. Here's what actually removes a page from Google (it isn't Draft, and it isn't the collection condition everyone reaches for first), the admin filter that finds every one of them in bulk, and the GraphQL mutation that does it at scale.

Shopify's own "hide out of stock products" trick — the collection condition that says Inventory stock is greater than 0 — only removes a product from that one collection's grid. It doesn't touch the product page itself, which stays Active, stays in your sitemap, and stays exactly as crawlable and indexable as it was when it was in stock. If you set this up expecting Google to stop showing a sold-out product, it hasn't happened, and nothing in Shopify's admin tells you that.

We checked how common this actually is. Across the 56 live Shopify stores in our free scanner's corpus, an average of 18% of scanned products are completely sold out — every variant unavailable, zero purchasable options — and still published. Not slow-moving stock, not "low inventory." Zero ways to buy it, and still a live, indexed page.

What we're actually counting

Our scanner flags a product as dead inventory when it has at least one variant and every variant on it is unavailable for purchase — not "quantity is low," not "hasn't sold in a while," but literally nothing on the page a customer could add to a cart. That's a narrower bar than most inventory-hygiene advice uses, and deliberately so: we're not tracking sales velocity (the scanner reads what's on the storefront right now, not order history), so we don't claim to know how long a product has been sitting like this. We only claim what's checkable from the page itself — is there a way to buy this, yes or no — and 18% of the catalog we've scanned answers no while still being Active and therefore still being crawled, indexed, and linked from collections, search, and your sitemap.

That number is worth sitting with for a second. It means close to one in five product URLs a Shopify store is asking Google to keep crawling are pages that cannot convert a single visitor, no matter how well they rank.

Why "hide out of stock products" doesn't fix this

The feature most merchants reach for first is Shopify's documented method for hiding out-of-stock products: turn on inventory tracking, open a collection's settings, and add the condition Inventory stock is greater than 0 with Match all conditions selected. It works exactly as described — the product stops appearing in that collection's grid.

What it doesn't do is unpublish anything. The product's own page is untouched: same URL, same Active status, same eligibility for Google's crawler, same entry in sitemap.xml. A shopper who lands on it from a saved link, a different collection you forgot to apply the condition to, or a Google search result finds exactly the sold-out page you thought you'd hidden. This is the single most common gap we see: merchants set up the collection condition, watch the product disappear from the grid they were looking at, and reasonably assume the SEO problem is solved. It isn't a fix for indexing at all — it's a display filter for one page type.

That matters more than it looks like on a small catalog, because Google is explicit that low-value URLs cost you crawl capacity: "If many of these URLs are duplicates, or you don't want them crawled for some other reason (removed, unimportant, and so on), this wastes a lot of Google crawling time on your site." A page that can never convert is about as low-value as a URL gets, and the collection-condition trick leaves every one of them exactly as crawlable as your best-selling product.

What actually removes a page from the index

Three product statuses behave differently here, and only two of them change what Google sees:

The choice between the two isn't cosmetic. If a product is coming back — a seasonal item, something waiting on a supplier — Unlisted keeps the URL alive for anyone who already has it while taking the page out of Google's rotation, and you flip it back to Active the moment stock returns, with no new URL and no lost backlinks. If it's genuinely discontinued, set it to Draft and 301-redirect the old URL to the closest in-stock alternative or its parent collection under Online Store > Navigation > URL Redirects, so whatever ranking or backlinks that page earned transfer forward instead of dead-ending in a 404.

Finding all of them without checking products one at a time

Shopify doesn't ship a dedicated "dead inventory" report, but the product list's own filtering handles this in about thirty seconds. From Products, open the filter panel, add an Inventory filter, and set the quantity to 0. That surfaces every product with zero units across all locations combined. Click Save, name it something like "Zero inventory," and click Create view — Shopify keeps saved views updated automatically, so it becomes a permanent tab you can check weekly instead of a filter you rebuild from scratch each time. This catches products with tracked inventory sitting at zero; for products where a variant is marked unavailable without inventory tracking on (a manual override, or a variant deliberately disabled), spot-check those separately, since they won't show up in a pure quantity filter.

Once you have the list, the decision is the same for every row: does this come back, or doesn't it. Anything ambiguous is worth treating as "coming back" and set to Unlisted rather than deleted outright — a wrongly-redirected product that later gets restocked is a worse outcome than a temporarily unindexed one.

Doing this at scale, instead of one product at a time

Toggling status by hand works for a dozen products. For a catalog where the zero-inventory view returns hundreds of rows, or where you want restocks to flip a product back to Active automatically instead of remembering to do it, the productUpdate mutation on the Admin GraphQL API (2025-10 and later) takes status: UNLISTED directly as a first-class value, not a workaround built on publications:

mutation {
  productUpdate(product: {
    id: "gid://shopify/Product/1234567890"
    status: UNLISTED
  }) {
    product { id status }
    userErrors { field message }
  }
}

Pair that with a scheduled script (or a Shopify Flow workflow triggered on inventory changes) that queries for totalInventory: 0 products via productVariants and calls this mutation in bulk, then reverses it — back to ACTIVE — the moment inventory is greater than zero again. That's the version of this fix that doesn't need anyone to remember to run a filter every week.

Who should skip this entirely: if your out-of-stock items are back in stock within hours because they're drop-shipped or restocked same-day, the churn of unlisting and relisting costs more operational overhead than the crawl waste it prevents — leave them Active and let the "hide from collections" condition handle the storefront-facing side. This is worth doing when a sold-out product realistically stays that way for a week or longer, not for every momentary stockout on a fast-moving SKU.

The rest of the corpus, for context

Dead inventory is one of four catalog-hygiene patterns we track across every store our free scanner audits, aggregated and never tied to a named store. In the same batch: 38% had at least one duplicated product description, 41% had physical products with no shipping weight set, and 19% had product images missing alt text. Dead inventory and duplicate descriptions are the two most common issues by a clear margin, and they share a cause: neither produces a visible error anywhere in Shopify's admin. The product page previews fine, loads fine, and looks correct to whoever last opened it. The only symptom is a search result that converts nothing, which nobody checks for unless they go looking.

Where this fits with the rest of your catalog

Sold-out-but-indexed pages are exactly the kind of gap our free store scanner checks for automatically — the same tool behind our earlier scan of Allbirds and Gymshark, alongside the duplicate-description, weight, and alt-text patterns from this corpus. If your zero-inventory filter turns up a handful of seasonal products, that's routine housekeeping you can clear in an afternoon. If it turns up hundreds, or the same suppliers keep reappearing on the list, that's usually a sourcing or import-process problem rather than something to fix product by product — that's the kind of Shopify catalog work we do directly, and reaching out costs nothing to find out which one you're looking at.

Sources reviewed