Products with stock_status=outofstock OR stock_quantity<=0. Source-of-truth feeding the ads_on_oos cross-channel kill-shot.
At a glance
Real-time count of WooCommerce products that are currently out of stock. The ground-truth feeding the Ads on OOS cross-channel kill-shot.
| What it counts | COUNT(products WHERE stock_status = 'outofstock') OR (manage_stock = true AND stock_quantity <= 0). Includes both manually-flagged OOS items and inventory-managed items that hit zero. |
| REST API endpoint | GET /wp-json/wc/v3/products?stock_status=outofstock and GET /wp-json/wc/v3/products?in_stock=false. Field used: stock_status (enum: instock, outofstock, onbackorder) and stock_quantity (integer). |
| VAT / tax / shipping / discounts | Not applicable, this is a product-state count. |
| Refunds / cancelled / failed orders | Not applicable. |
| Variations | Each product variation (color, size) is counted separately if it tracks stock independently. A parent product with 5 variations where 2 are OOS counts as 2 OOS items, not 1 OOS product. |
onbackorder status | NOT counted as OOS. WC treats backorder-allowed as still purchasable. Some merchants want backorders flagged; that is a separate roadmap card. |
| Currency | Currency-agnostic (count). |
| Channels / sources | The product is OOS or it is not, regardless of channel. But if the merchant uses a marketplace plugin (Amazon, eBay) that maintains its own inventory pool, this card reflects only the Woo-side stock. Marketplace-side OOS is invisible here. |
| Self-hosted vs managed-Woo | Same definition. Self-hosted Woo with object-cache misconfiguration can show stale OOS counts (cached for hours). Managed-Woo typically uses Redis/Memcached correctly. |
| Time window | RT (real-time, polled every 10-15 minutes from the REST API) |
| Alert trigger | >0 (any OOS SKU still listed and not hidden), driven by sentiment_key: out_of_stock_count |
| Roles | owner, operations, marketing |
Calculation
Calculated automatically from your WooCommerce 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 homewares brand on Pressable managed-Woo with 1,840 active products, ~6,200 variations across colour and size. Inventory polled every 10 minutes.| Item bucket | Count | Note |
|---|---|---|
Simple products with stock_status = outofstock | 84 | Manually flagged or hit zero |
Variations with stock_quantity <= 0 (inventory-managed) | 312 | Specific size/colour combos sold out |
Products on backorder (allowed) | 27 | NOT counted as OOS |
Products with manage_stock = false and OOS flag manual | 19 | Counted |
| Total OOS (this card) | 415 |
- Variations dominate the count. 312 of 415 OOS items are variations (specific size/colour) rather than entire products. The full SKU may still be sellable in other variants. The Ads on OOS card joins this against ad-active SKUs to flag the high-impact subset.
- Self-hosted server with object cache misconfiguration shows stale counts. A previous host this brand used cached
wc_get_product_stock_statusfor 6 hours. The OOS count showed 380 in the morning, jumped to 415 at lunchtime (cache expired) and dropped to 350 by evening (warehouse restocked but cache showed pre-restock data for hours). Pressable Redis configuration eliminated the lag. - Plugin-induced data shape variance: WooCommerce Subscriptions. Subscription products do not normally track stock, but some merchants enable inventory management on them. Subscriptions plugin then reduces stock on each renewal, which can drive a subscription product to OOS even though it is intangible. Watch for
_subscription_renewalorders alongside Customer Churn.
Sibling cards merchants should reference together
| Card | Why pair it with Out of Stock |
|---|---|
| WC Low Stock | The leading indicator. Catches the runway before OOS hits. |
| WC Stock Value | The dollar view of inventory. Pair to see whether OOS is concentrated on high-revenue SKUs. |
| WC Ads on OOS | The cross-channel kill-shot. Joins this card against active Google Ads / Facebook Ads to find spend wasted on unbuyable inventory. |
| WC Top Products | Tells you whether OOS items are revenue-leaders (urgent restock) or long-tail (low priority). |
| BC Inventory Distribution | Cross-platform peer for agencies. |
| Shopify Inventory Alerts | SaaS-platform peer. |
Reconciling against the vendor’s own dashboard
Where to look in WooCommerce Admin: WP Admin → Products → Filter by Stock status: Out of stock. Counts simple products only. For the variation-level count, use WP Admin → WooCommerce → Reports → Stock → Out of stock. Why our number may legitimately differ from WooCommerce Admin:| Reason | Direction of divergence |
|---|---|
| Object cache lag. WC caches stock status; if Redis / Memcached is misconfigured, WP Admin shows stale data while the REST API (which Vortex IQ uses) reads fresh. | Either |
| Self-hosted server uptime. Indexer runs every 10-15 min; brief outages mean values can be 15-30 min stale. | Self-resolves |
Plugin-version compatibility. Some inventory plugins (Stock Synchronisation, ATUM) maintain a separate stock store. The Vortex IQ engine reads wp_postmeta._stock_status, plugin-store state may not match. | Either |
Backorder treatment. WP Admin “Out of stock” filter is also keyed off _stock_status; this card matches when both are on the canonical field. | Should match |
| Currency plugin behaviour. Not relevant; inventory is currency-independent. | n/a |
| Card | Expected relationship |
|---|---|
| Marketplace plugins (Amazon Connector, eBay Connector) maintain their own inventory pools | This card reflects Woo-side stock only. The same SKU may be in-stock on Amazon but OOS on Woo if pools are not synced. |
google_ads.gads_disapproved_products | Google Merchant Center disapproves products listed as OOS in the feed. A high count here often shows up in Merchant Center 24-48 hours later. |
Known limitations / merchant FAQs
Self-hosted vs managed-Woo, why does it matter for OOS? Object cache misconfiguration on self-hosted Woo can show stale stock for hours. Managed-Woo hosts almost always run Redis or Memcached correctly. If your OOS count appears to “jump” rather than drift, suspect cache. Status-filter selection, why excludeonbackorder?
Backorder-allowed products are still purchasable, just delayed. Treating them as OOS would over-flag and noise the alert. If your business model relies heavily on backorders (e.g. furniture), use the Low Stock card instead.
Refund-object accounting, does it affect OOS?
No. Refunds restore stock if manage_stock = true and _restock_refunded_items is enabled (a 2024+ default). The OOS state updates accordingly within minutes.
Plugin-induced data shape variance, what plugins might affect this?
- ATUM Inventory Management stores stock in a custom table; we read the WC core meta fallback.
- Stock Synchronisation for WooCommerce can sync stock from another Woo install on a delay; the OOS count drifts during sync.
- Google Listings & Ads plugin reflects this card’s count in the Merchant Center feed.
- WooCommerce Subscriptions: subscription products tracked as inventory will hit OOS on renewal cycles.
- Refresh WP Admin (purge object cache if Redis-backed).
- Check whether a custom inventory plugin overrides
_stock_status. - Verify variations are being counted in WP Admin (the Products list shows simple products only by default, the Stock report shows variations).
- If the gap persists, contact support.