How to find every product that went out of stock in Shopify (and how long it stayed dark)
Shopify has no native out of stock report as of November 2026. Reconstruct which SKUs went dark, for how long, and what it cost — with exports and math.
InventoryX is in development and not available today. ClearStock is the live Shopify app.
Short answer: as of November 2026, Shopify has no native report that lists which products went out of stock, when, or for how long — so you reconstruct it from three sources you already have: periodic stock snapshots, order history, and CSV exports. Each method alone gives you a rough answer; combined, they get you to a per-SKU count of dark days that's accurate enough to size reorders and estimate what the empty shelves cost you. This article is the reconstruction manual. (For what the admin does report natively, the inventory reports overview lists it; this piece picks up where that one stops.)
Why the admin doesn't remember dark days
Shopify's inventory system tracks a live balance: available, committed, incoming, per location. It changes constantly and doesn't keep a per-SKU, per-day ledger of when that balance crossed zero. The Help Center notes that every adjustment is recorded so you know when and why a quantity changed ("Inventory and locations," Shopify Help Center, accessed November 2026) — which helps you audit a single suspicious SKU, but doesn't scale to "which of my 400 SKUs went dark last quarter, and how many days each."
That gap is the reason the same question keeps resurfacing in merchant forums: people want the ledger, the admin shows them a balance. The reconstruction below builds the ledger from things Shopify does store — quantities at moments you choose to capture, and orders, which it stores exhaustively.
Method 1: snapshots plus order history (the workhorse)
The core idea: capture stock levels on a fixed schedule, and let order data tighten the boundaries that snapshots leave fuzzy.
Step 1 — set up the snapshot. In the admin's Products view, save a filtered view for inventory at or below zero (saved low-stock views are exactly what the native admin supports, as of October 2026 — there's no built-in email alert on top of them). Every Monday morning, export or transcribe the list: SKU, available quantity, date. One row per SKU per week is all you need. A weekly rhythm bounds every dark period to within seven days.
Step 2 — bound the dark window. Say your enamel pins line has one hero design, PIN-OWL-03. Your Monday snapshots read:
| Snapshot date | Available quantity |
|---|---|
| Nov 3 | 42 |
| Nov 10 | 0 |
| Nov 17 | 0 |
| Nov 24 | 60 (restock received) |
The snapshot tells you the SKU was dark somewhere between 7 and 14 days. Best guess without more data: the midpoint, about 10.5 days.
Step 3 — tighten with orders. Pull the variant's daily sales from your order history (Shopify's order export or a reports export gives you orders per variant per day; the inventory CSV guide covers the export formats). Find the last order before the gap and the first order after the restock. If PIN-OWL-03 sold on November 8 and sold again on November 19, then it was selling with stock on the 8th and selling again on the 19th — so it went dark around November 9 and stayed dark through November 18. Call it 11 dark days (November 9–19), versus the 10.5 the snapshots alone would have guessed.
The assumption doing work here: a SKU selling near-daily goes dark within a day of hitting zero, because the day's demand has nowhere to go. For anything with steady daily sales, that assumption holds well enough for planning.
Method 2: order-history inference (when you skipped snapshots)
If you never captured snapshots, order history alone still reconstructs most of the story for fast movers: the run of zero-sale days between a last sale and a next sale marks a probable dark window, because steady sellers don't take multi-day silences. For PIN-OWL-03, a 10-day silence between an order on November 8 and an order on November 19 is the same 11-day answer, recovered after the fact.
Know the failure mode before you trust it: slow sellers have legitimate zero-sale days. Your hiking socks in the off-season can sit dark-free for a week simply because nobody bought any — order-history inference would report dark days that never happened. So gate the method: apply it only to SKUs with near-daily sales in the weeks before the silence, or use it to bound windows you then sanity-check against what you know (restock arrivals, promo dates). For the tail of your catalog, snapshots are the honest source; for the top of the catalog, orders are often more precise than snapshots.
Method 3: the daily snapshot diff (the archive play)
The most accurate version of Method 1 is simply taking snapshots more often. Export the inventory CSV daily (the full export format — every column and its quirks — is documented in the inventory CSV guide), keep each file date-stamped in a folder, and diff consecutive days: any SKU whose available quantity went positive-to-zero has a known dark start date; zero-to-positive is a known restock date. Daily diffing reduces your uncertainty from ±3.5 days to ±0.5, with no more effort than scheduling one recurring export.
The trade-off is storage and a little discipline: daily exports accumulate, and diffing 400 SKUs × 90 days by hand is spreadsheet work — a few pivots and a helper column. What it still can't do is recover history you didn't capture; the archive only pays back going forward. Start it this week even if you also use Methods 1–2 to reconstruct the past.
From dark days to a reorder decision
A dark-day count is only useful if it changes what you buy. The bridge is demand during the dark window, which you estimate — conservatively, and always labeled estimated — from the SKU's own in-stock velocity before the gap:
- PIN-OWL-03 sold 6.8/day while in stock. Eleven dark days × 6.8 ≈ 75 units of estimated demand with nowhere to go (estimated, not measured — some of those shoppers never come back, which is the whole problem with measuring lost sales from dark periods).
- Rank SKUs by that estimated figure and the top of the list is your reorder priority — the SKUs where a longer lead time or a bigger buffer costs the least and saves the most.
One correction matters here: velocity measured across a period containing dark days is understated, because the SKU wasn't selling on the days it couldn't. Use the in-stock-only rate — pre-gap days with stock — or correct for it explicitly; the velocity-correction guide explains why uncorrected numbers quietly shrink your reorders. And for what those dark days cost in full — refunds of demand you never see, not just the missed units — the out-of-stock cost breakdown does the loss math.
Choosing a method
| Method | Effort | What you get | Blind spot |
|---|---|---|---|
| Weekly snapshot + orders | Low, recurring | Dark windows bounded to ~±1 day for steady sellers | Tail SKUs with sparse sales |
| Order-history inference | Lowest, retroactive | Probable dark windows for fast movers, reconstructable for the past | False darks on slow movers |
| Daily snapshot diff | Medium, recurring | Known start/end dates within a day, whole catalog | Nothing recovered before you start |
None of these is a report; all of them approximate one well enough to act on. The point of the exercise isn't archival tidiness — it's turning "I think we ran out of pins in November" into "11 days, about 75 units estimated, order 75 more next cycle."
This is also the honest place to say what we build: the reconstruction above is exactly the ledger InventoryX (in development) maintains automatically — a per-SKU count of out-of-stock days with estimated lost revenue attached, computed read-only from your store data. The DIY version works and is free; the trade is your Monday mornings. Either way, the ledger is the input your buying decisions have been missing.
Common questions
Does Shopify have an out of stock report? Not as of November 2026 — the admin has no native report listing which products went out of stock, when, or for how long. You can reconstruct it from periodic stock snapshots combined with order history, or maintain a rolling snapshot archive and diff it. The reports that do exist natively are cataloged in the inventory reports overview.
How do I see how long a product was out of stock? Bound the window with dated stock snapshots (a weekly saved-view export), then tighten it with the SKU's order history: the last sale before the silence marks the run-out, the first sale after marks recovery. For a near-daily seller, that gives you dark days to within a day — the worked enamel-pins example above shows the arithmetic.
Can I get out-of-stock history per variant? Yes, if you reconstruct at the variant level: filter exports by variant rather than product, since a product can stay "in stock" overall while its best-selling size or color runs empty. Snapshot exports include per-variant available quantities, and order exports break sales down to the variant — the same math applies one level down.
Why can't I just use order history alone? Because absence of orders isn't proof of absence of stock for anything that doesn't sell daily — a slow SKU shows the same pattern dark or not. Order history is reliable for steady sellers and unreliable for the tail. Pair it with snapshots, or accept error bars on anything slower than a few sales a week.
What do I do with the dark-days list once I have it? Rank it by estimated demand lost — dark days × in-stock velocity — and treat the top as your reorder priority list: these SKUs justify bigger buffers, earlier order-by dates, or closer suppliers. Recheck monthly; SKUs that go dark repeatedly are the ones your current reorder points are failing.
Next step
Set up the Monday snapshot this week: one saved view, one recurring export, one folder. Then run order-history inference backward over your last quarter for the ten SKUs you suspect most — last sale, first sale, days between — and convert each into estimated lost units using in-stock-only velocity. In an hour you'll have the dark-day ledger Shopify doesn't give you, and next Monday's buying decisions get an input they've never had.