This is a repost. Originally published on the Arvio blog: https://arvio.a.xyz/blog/shopify-inventory-management-audit. The canonical URL points back there.
Key takeaways
- Across 43 live Shopify storefronts read on 26 August 2026, the median store has 4.6% of its published products in a state where every variant is unavailable — 7.5% once you remove six stores whose zeros may be a setting rather than a fact.
- That gap between 4.6% and 7.5% is most of what you need to know about using either as a benchmark. One judgement call about six stores moves the headline by more than half.
- The useful output is the list, not the percentage — which products, so you can sort them into "coming back" and "not". Your Shopify admin gives you that list directly, and for your own store that is the shortest path.
- Your catalogue is readable by anyone, right now, without your permission. That is how we measured 43 stores we have no relationship with, and it is equally true of yours.
- One thing we were not looking for: of 474 stores whose owners posted them publicly asking for feedback, 244 no longer serve a catalogue at all — 57% of those who posted in early 2025, 19% of those who posted in the last two months.
The list is the useful part, not the percentage
Arvio reads your live catalogue and hands you the products a shopper cannot buy — then drafts what to do with each one, and waits for you to approve it.
Getting your list
If you have admin access, use the admin. Products → filter on availability. It is fewer steps than anything here and it hands you the same list.
Then do the thing the percentage cannot do for you: split the list into "coming back" and "not". A size that restocks next month should keep its URL and its search history. A product discontinued in 2024 should get a redirect to whatever replaced it, and then it can go. Nothing observable from outside a store distinguishes those two, which is why no benchmark can decide it and you can in about a minute per product.
The browser version below exists for one case: reading a store you cannot log into. That works on every Shopify storefront because the products endpoint is public — including yours.
const gone = []; let total = 0;
for (let page = 1; ; page++) {
const r = await (await fetch(`/products.json?limit=250&page=${page}`)).json();
if (!r.products.length) break; // stop on an EMPTY page, never on a short one
total += r.products.length;
for (const p of r.products)
if (p.variants.length && p.variants.every(v => v.available === false)) gone.push(p.handle);
await new Promise(done => setTimeout(done, 300)); // be polite to the store
}
console.log(`${gone.length} of ${total} published products are fully unavailable — ${(100 * gone.length / total).toFixed(1)}%`);
console.table(gone.map(h => ({ product: h, url: `/products/${h}` })));
Every line is a GET; there is no write path in it. Read it before you run it.
One trap if you write your own: stop paging on an empty page, never on "fewer than I asked for". That endpoint returns short pages with more behind them. Our first attempt got this wrong and read a 3,100-product store as 238 products — a 13x undercount with no error and no warning.
What 43 stores look like
| All 43 | Excluding 6 ambiguous zeros | |
|---|---|---|
| Bottom quarter | 0.2% | 1.5% |
| Median | 4.6% | 7.5% |
| Top quarter | 14.6% | 15.9% |
What the six are. Ten stores read as exactly zero. Six of them had no unavailable variant anywhere in the catalogue, which is also what a store looks like when it is set to keep selling past zero stock — from outside, a fully stocked store and a store that never reports anything as unavailable are the same picture. We cannot tell which, so the table shows both.
The sixteen largest catalogues, in size order:
| Store | Published | Unbuyable share |
|---|---|---|
| A | 5,000 ⚠ | 0.4% |
| B | 5,000 ⚠ | 9.0% |
| C | 3,636 | 3.5% |
| D | 2,693 | 44.8% |
| E | 2,676 | 1.5% |
| F | 2,375 | 3.6% |
| G | 1,503 | 0.9% |
| H | 983 | 17.4% |
| I | 960 | 0.0% |
| J | 910 | 2.3% |
| K | 901 | 5.9% |
| L | 618 | 0.6% |
| M | 407 | 0.2% |
| N | 377 | 15.9% |
| O | 311 | 16.4% |
| P | 310 | 12.9% |
⚠️ A and B stopped at our 5,000-product ceiling, so their share is computed on the first 5,000 products the endpoint returned. That endpoint returns products in a fixed order, not a random one, so what we missed is a systematic slice rather than a random sample of their catalogues — the bias has a direction and we do not know which. Store I's zero is not one of the six ambiguous ones; it has 66 unavailable variants, just no product where every variant is unavailable.
A number tells you nothing about which products to open
Arvio works the other way round: it names the products, proposes the change for each, and holds all of it until you say yes. You can undo anything it did.
Why you cannot compare this number between stores
With 43 stores, this measurement cannot tell you whether catalogue size matters — in either direction. Include the storefronts with fewer than ten published products and the rank correlation between size and share is +0.48 (95% interval roughly +0.24 to +0.65, n=59). Exclude them, as we do, and it is +0.06 (−0.27 to +0.36, n=43). The intervals overlap. Two defensible analyses of the same measurement, and neither is precise enough to support a claim — which is the honest reason not to publish a benchmark, rather than a finding about store size.
We exclude micro-catalogues because a store with four products can only report 0% or 25%. (A related question — whether to unpublish the ones that are out of stock — is a merchandising decision, not a measurement one.) That is a reasonable rule and it is also the rule that produces the answer, and both of those things are true at once.
What variant-heavy catalogues have in common
Stores whose products carry more variants report lower shares — rank correlation −0.33 (−0.61 to −0.01), which drops to −0.15 if you remove the five most variant-heavy stores. Fragile, in other words. But the pattern is legible without the statistic, in the stores' own product types.
The six most variant-heavy catalogues here sell t-shirt, embroidery, hoodie, gang sheet, women's sweater, lingerie, denim jeans. The six least sell booster box, seed bead, jewelry making kits, silverbestick. That is apparel and print-on-demand at one end and single-SKU goods at the other, and it explains itself: on an apparel product, one size selling out leaves the product perfectly buyable, so it never counts. Our metric requires every variant to be unavailable, and apparel catalogues rarely get there.
We are not claiming this is the whole story. The same catalogue also reads differently to a shopping assistant than it does to a shopper — what an assistant actually gets back from a Shopify catalogue is a separate measurement from this one. We could not test store age, price band, whether a store runs pre-orders, or whether a POS shares the same stock — none of those are visible from a storefront. What we can say is that the metric reads differently across catalogue types, which is a second reason a single cross-store number does not mean much.
Half the stores that asked for feedback are gone
This came out of building the sample rather than out of the measurement, and it is the most striking thing we found.
Our stores come from the Shopify Community's Store Feedback board, where merchants post their own URL asking strangers to look. We collected 720 topics posted between 15 January 2025 and 26 August 2026 and took the 474 store domains in them. On 26 August 2026, 244 of those 474 served no catalogue at all.
| Posted | Still serving | Not | Share gone |
|---|---|---|---|
| First half of 2025 | 97 | 128 | 57% |
| Second half of 2025 | 28 | 34 | 55% |
| First half of 2026 | 79 | 76 | 49% |
| Since July 2026 | 26 | 6 | 19% |
The gradient is the point: the overall 51% is a mixture of cohorts, not a rate. What we actually observed is that 57% of the stores that asked for help in early 2025 no longer serve a catalogue nineteen months later.
What "gone" does and does not mean. The 244 break down as 118 domains that did not resolve or connect, 56 returning 404, 31 returning HTTP 402, 18 serving something that was not JSON (a password page, or not a Shopify store), 9 returning 401, 4 returning 409, 3 returning 403, and 5 others. We did not verify what any individual case means. A domain that stops resolving may be a closed business or a rebrand onto a new domain; we cannot tell those apart, and we checked once, on one day, so a temporary failure looks identical to a permanent one.
Method
Sample. 43 live Shopify storefronts, read on 26 August 2026, drawn at random from the 230 domains above that still served a public catalogue. Everything here came from endpoints any browser can fetch.
The funnel. 720 board topics → 474 store domains → 230 still serving a catalogue → 60 drawn at random → 59 readable → 16 excluded for fewer than 10 published products → 43.
Whether it looks like you. Merchants who ask strangers for feedback skew newer and smaller — the median catalogue here is 130 products — and, as the section above shows, they skew toward stores that were struggling enough to ask. We are not naming the 43 stores, which means you can re-run our instrument but not our exact sample.
Definitions. A product counts when every variant carries available: false while the product is still returned by the public endpoint. A store selling past zero reports available: true with nothing in stock, so every figure here is a floor.
Snapshot. One reading, one day. We do not know whether any of these levels are stable.
FAQ
What is a normal share of a Shopify catalogue to have sold out?
There isn't a usable one. Our own median moves from 4.6% to 7.5% on a single judgement call about six stores, and the size relationship is too imprecise to group stores by. Treat these figures as a description of 43 stores, not a target.
How do I see all sold out products in Shopify?
Your admin's product filters — that is the shortest path for your own store. The browser paste above is for reading a store you cannot log into.
Should I unpublish products that are sold out?
Only if they are not coming back, and set up the redirect first — otherwise the URL starts returning a 404 to everyone who had it, including search engines. What happens to a sold-out product you leave alone is a separate measurement.
What does available: false mean in the products endpoint?
That Shopify will not sell that variant right now. It means "buyable", not "in stock" — a store set to keep selling past zero reports true with an empty shelf.
Why do variant-heavy catalogues show a lower share?
Because the metric asks for every variant to be unavailable, and on an apparel product one size selling out leaves the product buyable. The most variant-heavy stores in this sample sell t-shirts, hoodies and embroidery; the least sell booster boxes and beads.
Is my catalogue public?
Yes, and so is every other Shopify store's. That endpoint is open on every storefront — which is how we read 43 stores without asking anyone, and how anyone can read yours.
Published 26 August 2026 by Adot Technologies Inc, the team behind Arvio: AI Store Operator.
Arvio: AI Store Operator — install it on the Shopify App Store. It hands you the products, not the percentage.
Originally published at https://arvio.a.xyz/blog/shopify-inventory-management-audit. More Shopify bulk-editing writeups are on the Arvio blog.
Top comments (0)