Skip to main content
Card class: HeroCategory: Ecommerce Platform
OOS variants. Pair with the cross-channel ad-spend card to find the real revenue blockers.

At a glance

A live count of product variants whose Product.totalInventory (or any underlying InventoryLevel.available) is at zero or negative. The single ops red-flag for “we are losing sales right now.”
What it countsCOUNT(variants WHERE totalInventory <= 0 AND status = ACTIVE). Each variant is 1 regardless of how many SKUs the parent product has, a 5-size jumper out of stock in 3 sizes counts as 3.
Negative stockYes, included. Negative inventory in Shopify means oversold (orders accepted past the available count, common when Continue selling when out of stock is on). Negative-stock variants are MORE urgent than zero-stock ones because each new order deepens the backlog.
Draft / archived productsExcluded. Only Product.status = ACTIVE variants count, draft and archived products don’t matter operationally.
VAT / tax treatmentNot applicable (inventory metric, no money).
ShippingNot applicable (inventory metric).
DiscountsNot applicable (inventory metric).
RefundsNot applicable directly, but a refund that re-adds to inventory (Shopify’s Restock checkbox on the refund modal) will move a variant off this list.
Cancelled / voided ordersIf cancelled with restock = true, the variant returns to inventory and may drop off this list. Without restock, the inventory stays consumed.
CurrencyNot applicable (count of variants).
Multi-location storesAggregate. The card sums available across every active fulfillment location. A variant with 0 in London but 50 in Manchester is NOT on this list. To see per-location stockouts, drill into Shopify Admin → Products → Inventory.
Channels / sourcesAll channels affected. A variant on this list cannot be sold anywhere, Online Store, POS, marketplaces, B2B, all stop selling it (unless Continue selling is enabled, in which case POS and online still allow oversells).
Time windowRT (real-time, computed from the latest indexed inventory snapshot)
Alert trigger>0, the alert is tripped any time at least one ACTIVE variant has totalInventory <= 0. The threshold is configurable.
Rolesowner, operations

Calculation

Calculated automatically from your Shopify data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.

Worked example

A US apparel brand on Shopify Plus. Spring drop went live 04 Apr 26. The next morning, 12 Apr 26, the card reads 47 variants OOS.
Product (style)Variants totalOOS variantsNote
Linen shirt (5 sizes × 4 colours)2011Top-3 colours sold through in 24h, sizes M/L gone in all colours
Wide-leg trouser (5 sizes × 3 colours)158Black trouser sold through in 36h
Bucket hat (3 sizes × 2 colours)60Healthy stock
Tote bag (1 SKU)11Single SKU, 0 stock
Last-season clearance (12 styles)9627Liquidating intentionally
Total OOS variants (this card)47
Six things to notice:
  1. The headline (47) overstates the operational problem. 27 of those are clearance variants, deliberately running out so the brand can move into the new season. Filtering by status = ACTIVE AND productType != 'Clearance' would show 20 truly worrying variants. Vortex IQ Nerve Centre doesn’t auto-filter clearance today, that’s a manual judgement call when reading the list.
  2. Pair with revenue impact, not raw count. Of the 20 non-clearance OOS variants, only 4 sit in the top-50 by revenue from the last 30 days. Those 4 are the real money. Cross-reference Top Products by Revenue to find them.
  3. The cross-channel impact is the killer. If the brand is running Google Ads and Meta Ads on the linen shirt, every click is now landing on a sold-out PDP, paying CPC for zero conversion. This is exactly what Active Ads on Out-of-Stock SKUs catches and is the highest-ROI pause in the AI OS.
  4. Negative inventory is the urgent subset. If 3 of those 47 variants show NEGATIVE stock (oversold because Continue selling was on), they need attention TODAY: every new order deepens the customer-promise gap. Check Shopify Admin → Inventory → Available sorted ascending.
  5. POS oversells are silent. A POS sale at the till of the last 2 jumpers happens before the storefront updates. The OOS shows up here within minutes of webhook fire, but for those 2 customers the brand promise was already met. The card is a leading indicator for online sales, a lagging indicator for retail.
  6. The fix-time matters. Variants with a Shopify Inventory Incoming PO arriving in 5 days are temporarily OOS but recoverable. Variants with no Incoming row are permanent stockouts requiring a reorder. The card doesn’t expose Incoming today; check Shopify Admin → Inventory → Incoming to triage.

Sibling cards merchants should reference together

The OOS count is the trigger. The decision-quality cards are these:
CardWhy pair it with Inventory Alerts
Active Ads on Out-of-Stock SKUsThe highest-ROI cross-channel pair. Every minute spent on an OOS variant in a live ad is wasted CPC. Pause first, fix second.
Top Products by RevenueFilters the OOS list down to the variants that actually matter. A clearance-sleeve OOS doesn’t deserve attention; a top-10 OOS does.
Stock vs SalesShows which non-OOS variants are heading toward stockout. Catch them before this card alerts.
Fulfillment RateStockouts are the #1 cause of fulfillment-rate drops. A spike here predicts a fulfillment dip in 3 to 7 days.
Cancellation RateWhen OOS lasts more than a week, customers cancel rather than wait. Persistent OOS + rising cancellations is a backlog-induced churn signal.
Catalogue Drift vs AmazonCross-channel risk: an OOS on Shopify while still active on Amazon means inventory mis-sync, customer paying on Amazon for stock that doesn’t exist. Compliance and brand-trust risk.
Inventory DistributionThe fat-tail view of stock levels. Pair to see what’s at-risk vs comfortable.
Revenue at Risk (live incident)When OOS drives a revenue drop and a Datadog / NewRelic incident is also open, this card surfaces the £/min impact.

Reconciling against the vendor’s own dashboard

Where to look in Shopify Admin: Products → Inventory → filter Available: 0 or less. The count of matching rows should match this card to within sync-lag tolerance (5 to 15 minutes). Filter additionally by Status: Active to match the card’s active-only definition. Other Shopify Admin views that look like the same number but aren’t:
  • Reports → Sell-through rate: a velocity metric (units sold / units stocked over period), not a current OOS count. Useful for forecasting OOS, not for diagnosing now.
  • Products → All products → Out of stock filter: counts PRODUCTS with at least one OOS variant. This card counts VARIANTS. A 10-variant product with 1 OOS variant counts as 1 product in Shopify’s filter and 1 variant here, the numbers diverge as multi-variant products dominate.
  • Apps like Stocky / Inventory Planner: these include Incoming and Available together to show net position. This card shows current Available only, ignoring the next PO arriving.
  • Home → “Low stock” widget: a separate threshold (typically <5 units), not zero. Read this as a leading indicator before items hit OOS.
Why our number may legitimately differ from Shopify Admin:
ReasonDirectionWhy
Sync lagEither, transientInventory webhooks fire within seconds but the OpenSearch index can lag by 5 to 15 minutes during heavy write periods. A POS rush at the till can show items as OOS in Admin before the card catches up, or vice versa.
Active-only filterTheirs higherShopify’s Inventory → Available 0 or less filter includes draft and archived products by default. This card filters to status = ACTIVE. Match by toggling the Active only filter in Admin.
Multi-location aggregationTheirs looks higher per-locationShopify shows OOS per location by default. This card aggregates across all active locations. A variant with 0 in London and 50 in Manchester appears OOS in London Admin view but is NOT on this card.
Continue-selling-when-OOSNo effect on countContinue selling when out of stock settings affect whether customers can buy past zero, not whether the variant appears as OOS. Negative-stock variants still count on this card.
Bundle / mirror SKUsEitherShopify Bundles and apps like Bundle Pro can show OOS misleadingly when the component is OOS but the bundle has its own inventory record. Treat bundle SKUs with care; the card may double-count.
Cross-connector reconciliation: Inventory state is Shopify-internal. The closest cross-connector signal is in the cross-channel cards Vortex IQ derives from this:
CardExpected relationshipWhat causes legitimate divergence
shopify_xc_ads_on_oosSubset of this card with active ad spendAn OOS variant that has no ads on it is on this card but not on the cross-channel one.
amazon_ads.amazon_oos_skusIndependent inventory truthAmazon ASINs may show in-stock on Amazon while Shopify shows OOS, indicating inventory mis-sync between channels (a real problem, see Catalogue Drift).
google_ads.google_oos_keywordsSubset, ad keywords pointing at OOS variantsSame logic as the Meta / TikTok pair, the OOS surface here drives the spend-waste signal cross-channel.

Known limitations / merchant FAQs

Why does my count keep climbing even though I’m restocking? Restocks add inventory to incoming POs in Shopify, but the Available count only updates when the PO is received (the warehouse marks units in). If the count keeps climbing while you have £30k of stock in transit, you’re seeing the gap between Incoming and Available. To see the net position, look at Shopify Admin → Inventory → Incoming alongside this card. Does negative stock count? Yes, and it’s the urgent subset. Negative inventory means you’ve oversold, customers paid for stock that doesn’t exist. This happens when Continue selling when out of stock is on for a variant. Each new order deepens the negative count and the customer-promise gap. Treat negative-stock variants as the highest priority on the list. Why does my POS not appear to update inventory in real-time? It does, the issue is usually that Shopify webhook delivery has lag (5 to 60s) and the OpenSearch index in Vortex IQ has its own ingest lag (5 to 15 min). For ops triage, always reconcile against Shopify Admin → Products → Inventory directly during a live incident. This card is a 5-minute-lagged view, not a real-time POS dashboard. My multi-location store, how does this card aggregate? The card sums Available across all active fulfillment locations. A variant that has 0 in London and 50 in Manchester is NOT on this card because the global Available is 50. To see per-location stockouts, use Shopify Admin → Settings → Locations → Inventory at this location. Per-location OOS cards are on the roadmap. Do bundle SKUs work correctly? Mostly yes, with caveats. Native Shopify Bundles tie inventory to component SKUs, so the bundle Available is the limiting component’s Available. Apps like Bundle Pro / SimpleBundles often create a virtual SKU with its own inventory record, which can show Available=100 even when the component is OOS. Treat bundle SKUs with care, the card may misreport. Why do I see archived products on the list? You shouldn’t. The card filters to Product.status = ACTIVE. If you’re seeing archived products, either Shopify hasn’t propagated the status change to the index yet (sync lag), or the product is DRAFT not ARCHIVED and DRAFT was inadvertently included in your workspace’s filter config. Open a Vortex IQ support ticket and reference the affected SKU. Does this include digital products and gift cards? Digital products typically have inventory tracking off (tracksInventory = false) and will NOT appear on this list regardless of “stock”. Gift cards in Shopify are issued as a SKU type with effectively infinite inventory and similarly won’t appear. So the card is implicitly physical-goods only. The card alerts >0. Is that the right threshold for me? For most merchants, yes, any active OOS is a problem. But brands with a long-tail catalogue (5,000+ active variants) often have a structural 5 to 10% OOS background level for low-velocity items they’re letting run out intentionally. For those brands, the threshold should be reset to OOS-of-top-50-by-revenue or OOS-with-active-ads. Configurable per workspace in Nerve Centre → Alerts. Action playbook when this card alerts:
  1. Open the OOS list. Sort by units sold last 30 days (highest velocity first).
  2. For top-velocity OOS: pause Google Ads and Meta Ads on that SKU immediately, see Active Ads on Out-of-Stock SKUs.
  3. For negative-stock variants: contact customer-service to email affected customers proactively with restock ETA.
  4. For top-revenue OOS without an Incoming PO: place an emergency reorder. The financial cost of expedited shipping is almost always less than the revenue lost.
  5. For long-tail OOS without ads: deprioritise. Not every OOS is worth fixing; some are intentional sell-through.
  6. Review Continue selling when out of stock settings, decide policy per SKU. Generally: enable for back-orderable items with clear customer comms, disable for must-ship-immediately items.

Tracked live in Vortex IQ Nerve Centre

Products with Zero/Negative Stock is one of hundreds of KPI pulses Vortex IQ tracks across Shopify and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.