Unusual stock-out velocity, viral SKU, fulfilment glitch, or stock-sync plugin failure. Investigate before ad spend wastes.
At a glance
Real-time alert that fires when a burst of WooCommerce SKUs flip to out-of-stock within an hour. Flags viral demand, fulfilment glitches, or stock-sync plugin failures before ad spend wastes.
| What it counts | COUNT(products WHERE stock_status changed to 'outofstock' in last 1h). Fires when count >5 AND >2σ above the 7D baseline of hourly OOS flips. |
| REST API endpoint | GET /wp-json/wc/v3/products?stock_status=outofstock&modified_after=.... Polled every 10 minutes. |
| VAT / tax / shipping / discounts | Not applicable, inventory state. |
| Status filter | Only stock_status transition from instock (or onbackorder) to outofstock. |
| Variations | Variations count separately. A parent product losing 5 size/colour combos in one hour can trip the alert on its own. |
| Currency | Currency-agnostic. |
| Channels / sources | Inventory is global across channels. Marketplace plugin pools may not match this card. |
| Self-hosted vs managed-Woo | Self-hosted with object-cache misconfiguration can produce a false-spike pattern if cache flushes (5 SKUs become “newly OOS” because the cache caught up, not because they actually flipped). Managed-Woo with Redis is steadier. |
| Time window | RT (rolling-1h, polled every 10 min) |
| Alert trigger | >5 SKUs flipped to OOS in 1h AND >2σ vs 7D baseline; 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 managed-Woo, baseline ~1.2 OOS flips per hour. Wednesday 10 Apr 26, 16:00-17:00 UTC.| Hour bucket | OOS flips | Cause |
|---|---|---|
| 14:00-14:59 | 1 | Normal |
| 15:00-15:59 | 2 | Normal |
| 16:00-16:59 | 18 | Alert fires |
- Cause was a viral TikTok mention. A creator featured the brand’s “ceramic mushroom mug” line at 15:50 UTC; traffic spiked 8x and 12 specific mug variations sold through their stock within 50 minutes. The remaining 6 OOS flips were tangential bestsellers caught up in the surge.
- Self-hosted Woo would have looked similar but for a different reason. On flaky shared hosting, the same alert can fire when an object-cache flush refreshes stock state for ~50 products at once. The 2σ baseline filter usually prevents this, but persistent alerts after host events warrant a cache audit.
- Plugin-induced data shape variance: ATUM Inventory Management. ATUM stores stock in custom tables and writes to
_stock_statuson a delay (every 5 minutes by default). On ATUM-using stores the alert can lag by up to 5 minutes, which means viral demand may have already wasted ad budget before the alert fires.
Sibling cards merchants should reference together
| Card | Why pair it with this alert |
|---|---|
| WC Out of Stock | The cumulative count behind this alert. |
| WC Low Stock | The leading indicator, often spikes 1-2 hours before this alert. |
| WC Ads on OOS | The action card: pause ad spend on the freshly OOS SKUs. |
| WC Top Products | Identifies whether the OOS spike hit revenue-leaders or long-tail. |
| BC Alert OOS Spike | Cross-platform peer for agencies. |
Reconciling against the vendor’s own dashboard
Where to look in WooCommerce Admin: WP Admin → WooCommerce → Reports → Stock → Out of stock shows the cumulative OOS list. WC does not expose hourly flip velocity; this card is the only Vortex IQ view of that. Why our alert may fire when the merchant sees nothing:| Reason | Direction |
|---|---|
| Time-zone. Alert evaluated UTC; WP Admin uses WP-site timezone. Hour buckets may not align. | Both report same events |
| Self-hosted server uptime. Cache flush after a brief outage can backfill OOS state and look like a spike. | Self-resolves |
| Plugin-version compatibility. ATUM, Stock Synchronisation plugins update on a delay. | Alert may lag by up to 5-10 min |
| Currency plugin behaviour. Not relevant for inventory. | n/a |
| Card | Expected relationship |
|---|---|
google_ads.gads_disapproved_products | OOS spike on Woo => disapproval spike on Merchant Center within 24-48 hours unless ads are paused. |
Known limitations / merchant FAQs
Self-hosted vs managed-Woo, false-alert risk? Self-hosted with object-cache misconfiguration produces occasional false spikes (cache flush backfills OOS state). Managed-Woo with Redis is steadier. Status-filter selection, why onlyoutofstock?
Backorder-allowed flips are not really stockouts (the customer can still buy). Including them would noise the alert.
Refund-object accounting?
Refunds restore stock if _restock_refunded_items is enabled. A bulk refund could theoretically push SKUs back to instock, never trips this alert.
Plugin-induced data shape variance?
ATUM Inventory Management updates on a 5-min delay; alert can lag. Stock Synchronisation across multiple Woo installs can produce alert clusters when sync runs. WooCommerce Subscriptions products sometimes track stock and trip alerts on renewal cycles.
Multi-currency, does it affect this alert?
No, inventory is currency-independent.
Why does Woo and Stripe disagree?
Stripe does not track inventory; the metrics are unrelated.
Today is jumpy, why?
Spike alerts are inherently event-driven. The 2σ baseline filter prevents most false positives; rolling-1h evaluation auto-clears once velocity returns to baseline.
Sync-lag from self-hosted server slowness?
Indexer running every 10 min means OOS state can be up to 10 min stale. After host recovery, watch for a delayed alert burst as catch-up reflects intervening events.
My WP Admin shows fewer OOS flips, debug?
- Confirm timezone alignment.
- Refresh WP Admin (purge object cache).
- Check whether a custom inventory plugin overrides
_stock_status. - If the gap persists, contact support.