Live ad spend pointed at SKUs that can’t convert. Direct $/day waste, pause those ad groups now.
At a glance
Live ad spend pointed at WooCommerce SKUs that cannot convert. Joins Woo OOS state against Google Ads / Meta Ads active product spend. Direct dollar-per-day waste; pause those ad groups now.
| What it counts | Google Ads / Meta Ads spend per day on product IDs WHERE corresponding Woo SKU.stock_status = 'outofstock'. Joins Woo product feed against ad-platform product targeting. |
| REST API endpoint | Woo: GET /wp-json/wc/v3/products?stock_status=outofstock. Google Ads: customers.search with shopping_performance_view. Meta: Marketing API ad-spend. |
| VAT / tax / shipping / discounts | Spend reported in account currency (typically pre-tax). |
| Status filter | Only outofstock Woo products joined against enabled ad groups. Backorder-allowed products are excluded (still purchasable). |
| Refunds / cancelled / failed orders | Not applicable. |
| Currency | Ad-platform spend reported in ad-account currency. Multi-currency Woo stores need filter alignment, the join is by SKU / product ID, currency-agnostic. |
| Channels / sources | Web-channel ads only. POS-targeted ads do not exist for most merchants. |
| Self-hosted vs managed-Woo | Self-hosted Woo with object-cache lag can show stale OOS state, ad spend may be flagged as wasted when the SKU has actually been restocked, or vice versa. Managed-Woo is steadier. |
| Time window | RT (polled every 30 min) |
| Alert trigger | >$0/day spend on OOS SKU; sentiment_key out_of_stock_count |
| Roles | owner, marketing, operations |
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 running Google Shopping + Meta Advantage+. Polled 12 Apr 26 14:00 UTC.| Channel | OOS SKUs in active ads | Daily spend | Note |
|---|---|---|---|
| Google Shopping | 8 SKUs | $142/day | ”Mushroom Mug” variants ran out yesterday |
| Meta Advantage+ | 14 SKUs | $98/day | Catalog auto-targeted; Meta unaware of OOS |
| Daily waste | 22 | $240/day | Annualised: $87,600 |
- Self-hosted variance is the recurring theme. This brand had an object-cache misconfiguration last quarter, OOS state lagged by 6+ hours. During those 6 hours, Google Merchant Center had no idea the SKUs were OOS, so spend kept flowing. Pressable’s Redis fixed the lag, this card now catches mismatches within 30 min.
- Meta Advantage+ is the bigger leak than Google. Google Merchant Center pulls feeds from the Woo store via the Google Listings & Ads plugin, which honours OOS state within 1-3 hours. Meta’s catalog feed updates every 24 hours by default, so SKUs that go OOS at 09:00 may continue serving in Meta ads until 09:00 the next day. The card surfaces the gap.
- Plugin-induced data shape variance: Google Listings & Ads plugin. The plugin reads
_stock_statusand disapproves OOS items in Merchant Center, but on stores using a custom inventory plugin (ATUM, Stock Synchronisation), the plugin may miss the disapproval signal. Verify by spot-checking the Merchant Center disapproval list against this card.
Sibling cards merchants should reference together
| Card | Why pair it with Ads on OOS |
|---|---|
| WC Out of Stock | The OOS source data. |
| WC Alert OOS Spike | Trigger card for sudden spikes. |
| WC Top Products | Identifies which OOS items are revenue-leaders worth restocking. |
| Google Ads Wasted Spend | Vendor-side view from Merchant Center. |
| BC Channel OOS per Channel | Cross-platform peer for agencies. |
Reconciling against the vendor’s own dashboard
Where to look in WooCommerce / ad platforms: Woo OOS list: WP Admin → WooCommerce → Reports → Stock → Out of stock. Google Ads waste: Google Ads UI → Reports → Pre-defined → Shopping → Item ID. Meta: Ads Manager → Catalogue → Diagnostics. Why our number may differ from any single dashboard:| Reason | Direction |
|---|---|
| Time-zone. Polled UTC vs ad-platform account timezone. | Boundary effects |
| Self-hosted server uptime. Object-cache lag delays OOS detection. | Either |
| Plugin-version compatibility. Google Listings & Ads vs Pinterest for WooCommerce vs Meta plugin each report differently. | Investigate per-merchant |
| Refund-restock cycle. Refunded inventory restored mid-window flips state mid-period. | Either |
| Currency plugin. Spend in ad-account currency, Woo prices in store currency, the join is by SKU not money. | n/a for join, material for waste calc |
| Card | Expected relationship |
|---|---|
google_ads.gads_disapproved_products | Merchant Center disapproves OOS within 1-3 hours of feed sync. Disapproved count should track this card with a slight lag. |
facebook.fb_catalog_diagnostics | Meta catalog refreshes every 24h by default; the gap is the daily Meta waste window. |
Known limitations / merchant FAQs
Self-hosted vs managed-Woo, why does it matter for this card? Object-cache lag on self-hosted Woo can delay OOS detection by hours, during which ad spend on now-OOS SKUs continues. Managed-Woo with Redis catches OOS within minutes. Status-filter selection, why include backorder products as “in stock”? Backorder-allowed items are still purchasable, ads pointing at them convert (with a delay), so they are not waste. Refund-object accounting, does it affect this card? Yes indirectly. A high-volume refund event can restore stock to many SKUs simultaneously. The card detects the restock at the next poll (within 30 min) and removes those SKUs from the “wasted spend” list. Plugin-induced data shape variance, what gateways / feeds matter?- Google Listings & Ads plugin: reads
_stock_status, syncs to Merchant Center, reliable. - Pinterest for WooCommerce: similar, reliable.
- Meta for WooCommerce: relies on Meta’s 24-hour catalog refresh.
- Custom feed exporters: behaviour varies; verify with a manual OOS test.
_stock_status for one OOS SKU across (a) Woo REST API, (b) Google Merchant Center disapproval list, (c) this card. If all three agree, fine. If Woo says OOS but Merchant Center says approved, feed sync is stuck.
My ad platform shows different numbers, debug:
- Match date / time window exactly.
- Verify ad-account currency and any FX conversion.
- Check feed-sync timestamps; many gaps are within the 24h Meta window.
- If gap > 10% of spend, contact support.