> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vortexiq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Products with Zero/Negative Stock, Shopify

> OOS variants. Pair with the cross-platform ad-spend card to find the real revenue blockers. How to read it, why it matters, and how to act on it.

**Metrics type:** [Key Metrics](/nerve-centre/overview#metrics-types-explained)  •  **Category:** [Ecommerce Platform](/nerve-centre/connectors#connectors-by-type)

> OOS variants. Pair with the cross-platform 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 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**       |                                                                  |

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](/nerve-centre/kpi-cards/shopify/top-products-by-revenue) to find them.
3. **The cross-platform 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](/nerve-centre/kpi-cards/shopify/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:

| Card                                                                                               | Why pair it with Inventory Alerts                                                                                                                                                      |
| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Active Ads on Out-of-Stock SKUs](/nerve-centre/kpi-cards/shopify/active-ads-on-out-of-stock-skus) | The highest-ROI cross-platform pair. Every minute spent on an OOS variant in a live ad is wasted CPC. Pause first, fix second.                                                         |
| [Top Products by Revenue](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/stock-vs-sales-velocity)                          | Shows which non-OOS variants are heading toward stockout. Catch them before this card alerts.                                                                                          |
| [Fulfillment Rate](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/catalogue-drift-vs-amazon)             | Cross-platform 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](/nerve-centre/kpi-cards/shopify/inventory-distribution)                   | The fat-tail view of stock levels. Pair to see what's at-risk vs comfortable.                                                                                                          |
| [Revenue at Risk (live incident)](/nerve-centre/kpi-cards/shopify/revenue-at-risk)                 | 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](https://admin.shopify.com/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:**

| 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.                       |

**Cross-connector reconciliation:**

Inventory state is Shopify-internal. The closest cross-connector signal is in the cross-platform cards Vortex IQ derives from this:

| Card                                                                                       | Expected relationship                        | What causes legitimate divergence                                                                                                                                                                                    |
| ------------------------------------------------------------------------------------------ | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`shopify_xc_ads_on_oos`](/nerve-centre/kpi-cards/shopify/active-ads-on-out-of-stock-skus) | 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-platform one.                                                                                                                              |
| [`amazon_ads.amazon_oos_skus`](/nerve-centre/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](/nerve-centre/kpi-cards/shopify/catalogue-drift-vs-amazon)). |
| [`google_ads.google_oos_keywords`](/nerve-centre/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-platform.                                                                                                             |

***

<details>
  <summary><em>Same-metric documentation cross-reference (for agencies running multiple platforms)</em></summary>

  The same definition of OOS variant count lives on other commerce platforms. This is **not a reconciliation**, your Shopify store doesn't have a parallel store on BigCommerce or Adobe Commerce to compare numbers against. These cross-links exist so agencies running multi-platform client books can navigate between identical metrics across the docs.

  * [`bigcommerce.inventory_alerts`](/nerve-centre/kpi-cards/bigcommerce/products-with-zero-negative-stock)
  * [`adobe_commerce.inventory_alerts`](/nerve-centre/adobe_commerce/inventory_alerts)
</details>

## 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](/nerve-centre/kpi-cards/shopify/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](https://app.vortexiq.ai/login) or [book a demo](https://www.vortexiq.ai/contact-us) to see this metric running on your own data.
