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 whoseProduct.totalInventory(or any underlyingInventoryLevel.available) is at zero or negative. The single ops red-flag for “we are losing sales right now.”
| What it counts | COUNT(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 stock | Yes, 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 products | Excluded. Only Product.status = ACTIVE variants count, draft and archived products don’t matter operationally. |
| VAT / tax treatment | Not applicable (inventory metric, no money). |
| Shipping | Not applicable (inventory metric). |
| Discounts | Not applicable (inventory metric). |
| Refunds | Not 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 orders | If cancelled with restock = true, the variant returns to inventory and may drop off this list. Without restock, the inventory stays consumed. |
| Currency | Not applicable (count of variants). |
| Multi-location stores | Aggregate. 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 / sources | All 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 window | RT (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. |
| Roles | owner, 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 total | OOS variants | Note |
|---|---|---|---|
| Linen shirt (5 sizes × 4 colours) | 20 | 11 | Top-3 colours sold through in 24h, sizes M/L gone in all colours |
| Wide-leg trouser (5 sizes × 3 colours) | 15 | 8 | Black trouser sold through in 36h |
| Bucket hat (3 sizes × 2 colours) | 6 | 0 | Healthy stock |
| Tote bag (1 SKU) | 1 | 1 | Single SKU, 0 stock |
| Last-season clearance (12 styles) | 96 | 27 | Liquidating intentionally |
| Total OOS variants (this card) | 47 |
- 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. - 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.
- 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.
- 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.
- 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.
- 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:| Card | Why pair it with Inventory Alerts |
|---|---|
| Active Ads on Out-of-Stock SKUs | The 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 Revenue | Filters 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 Sales | Shows which non-OOS variants are heading toward stockout. Catch them before this card alerts. |
| Fulfillment Rate | Stockouts are the #1 cause of fulfillment-rate drops. A spike here predicts a fulfillment dip in 3 to 7 days. |
| Cancellation Rate | When OOS lasts more than a week, customers cancel rather than wait. Persistent OOS + rising cancellations is a backlog-induced churn signal. |
| Catalogue Drift vs Amazon | Cross-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 Distribution | The 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.
| Reason | Direction | Why |
|---|---|---|
| Sync lag | Either, transient | Inventory 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 filter | Theirs higher | Shopify’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 aggregation | Theirs looks higher per-location | Shopify 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-OOS | No effect on count | Continue 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 SKUs | Either | Shopify 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. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
shopify_xc_ads_on_oos | Subset of this card with active ad spend | An OOS variant that has no ads on it is on this card but not on the cross-channel one. |
amazon_ads.amazon_oos_skus | Independent inventory truth | Amazon 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_keywords | Subset, ad keywords pointing at OOS variants | Same 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 sumsAvailable 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:
- Open the OOS list. Sort by units sold last 30 days (highest velocity first).
- For top-velocity OOS: pause Google Ads and Meta Ads on that SKU immediately, see Active Ads on Out-of-Stock SKUs.
- For negative-stock variants: contact customer-service to email affected customers proactively with restock ETA.
- 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.
- For long-tail OOS without ads: deprioritise. Not every OOS is worth fixing; some are intentional sell-through.
- 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.