Spend on Shopping ads pointing at SKUs that can’t convert. Pause the ad, hold the budget, recover the spend within minutes.
At a glance
Cross-channel alert: Google Shopping (or Performance Max product feeds) actively bidding for SKUs that the commerce platform reports as out of stock. Every click on these ads is wasted, the customer cannot convert, and the impression often costs goodwill (“they showed me the dress, then said it was sold out”). The fastest recoverable spend in any account, typically a 5-minute fix once flagged.
| The formula | Cross-connector join. Numerator: ENABLED Shopping or PMax product groups in Google Ads with > 0 spend in the last 24 hours. Denominator side: commerce-platform inventory feed where inventory_quantity = 0 (Shopify), availability_state = OUT_OF_STOCK (BigCommerce), stock_status = 0 (Adobe Commerce). Match on Merchant Center id <-> commerce-platform sku or product_id. |
| GAQL resource + metric | FROM shopping_performance_view for product-level spend; cross-joined to commerce inventory data. Fields: metrics.cost_micros, metrics.clicks, segments.product_item_id. |
| Account currency (single by design) | Account currency from customer.currency_code. Spend is reported in account currency; the alert is currency-aware (£10 / €10 / $10). |
| Conversion attribution model (configurable) | Not directly relevant to this alert (the SKU cannot convert, so attribution is moot). The card focuses on wasted clicks/spend, not attribution. |
| View-through inclusion (excluded by default) | Not relevant. The alert triggers on spend + zero stock, not on conversion attribution. |
| Bot / IVT filter | Google’s Invalid Click Filter applies to the spend numerator. Bot clicks are filtered before reporting, but the residual 2-5% IVT means the “wasted spend” number is slightly understated. |
| Micros conversion | cost_micros divided by 1,000,000. |
| Real-time vs ingestion lag | This card is the most lag-sensitive in the connector. Inventory state can flip from “in stock” to “out” in seconds (a flash sale), but Google Merchant Center feed sync runs every 30-60 minutes for most merchants (or on push-notification for Shopify Connect). Expect a 30-90 minute window during which the ad is live on a now-out-of-stock SKU. The alert flags this window so you can manually pause faster than feed sync. |
| MCC aggregation | Per child account. SKU-to-account mapping requires the commerce platform connection to be linked to each child account separately. |
| Time window | RT (real-time). The cross-channel join refreshes every 5-10 minutes during business hours. |
| Alert trigger | Any ENABLED Shopping/PMax product group with spend in the last 24 hours where the matched SKU has zero stock at the commerce platform. Drives sentiment_key: zero_conversion_spend. |
| Roles | owner, marketing, finance, operations |
Calculation
Calculated automatically from your Google Ads 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 UK fashion brand. Tuesday 14 Apr 26, 14:00 local. The card flags 4 SKUs:| SKU | Product | Google Ads spend (last 24h) | Clicks | Stock (Shopify) | Status |
|---|---|---|---|---|---|
| FLR-DRS-RED-S | Floral dress, red, size S | £42.40 | 18 | 0 | OOS, 6h ago |
| BLK-JKT-M | Leather jacket black, M | £28.10 | 12 | 0 | OOS, 18h ago |
| WHT-TEE-XL | White tee, XL | £14.80 | 9 | 0 | OOS, 3d ago |
| BLU-JNS-W30 | Blue jeans, W30 | £8.20 | 4 | 0 | OOS, 36h ago |
| Total wasted (last 24h) | £93.50 | 43 |
- £93.50 in 24 hours is the recoverable line. All four SKUs are still bidding because Google Merchant Center’s feed sync hasn’t caught up. The fix is two clicks per SKU in Google Ads (or one bulk-action), pausing the product groups. The £93.50 keeps growing every hour until the feed syncs (typically every 30-60 minutes, but feed errors can stall this for hours).
- The “OOS 6h ago” SKU is the worst kind. That dress likely just sold out during a flash sale. Demand is high, ad spend is climbing fast (£42 in 6h vs £14 for the tee in 24h), and every click is doubly bad: wasted spend AND a customer arrives expecting to buy a dress that’s gone.
- The “OOS 3d ago” tee is a feed-error case. Why is this still bidding 3 days after going out of stock? The Merchant Center feed sync has been broken for that SKU specifically. Common cause: Shopify ID -> Merchant Center ID mismatch on a recent product variant change. Investigate the feed errors in Merchant Center > Diagnostics.
- Compare to total Shopping spend. If the brand spent £4,800 on Shopping in the last 24h, £93.50 is 2% wasted on OOS, manageable. If they spent £600 total, £93.50 is 16% wasted, urgent. The proportion matters more than the absolute.
- A pattern of recurring OOS-on-bestsellers is a buying problem, not an ads problem. If the same 5 SKUs go OOS-then-back-in-stock weekly, your buying team is under-ordering bestsellers. The marketing fix (pausing ads) doesn’t solve the lost revenue; the ops fix (better stock planning) does.
- Wasted spend > £100 in 24h: pause those SKU groups now, then investigate feed sync.
- An “OOS for 3+ days” SKU still bidding: feed integration is broken, escalate to the integration owner.
- Same SKUs flagged daily: stock-planning issue; involve buying/ops.
- Card empty: feed sync is healthy; well done.
- Card spikes during sales: bestsellers selling out faster than feed can update; tighten flash-sale stock buffers.
Sibling cards merchants should reference together
| Card | Why pair it with Active Ads on Out-of-Stock SKUs |
|---|---|
| Google Ads Wasted Spend | Sister card: this catches OOS-driven waste; Wasted Spend catches keyword/search-term-driven waste. Run both together for full waste audit. |
| Google Ads Zero Conversion Spend | Catches campaign-level waste; this card is the SKU-level analogue. |
| Google Ads Spend by Campaign | Context: how much of total Shopping spend is in this card. Proportions matter. |
| Shopify Inventory Out-of-Stock Items | The denominator side. Tells you how many SKUs are out at any moment. Cross-reference to see which OOS SKUs are highest-spend leakage. |
| BigCommerce Out-of-Stock Items | Same as Shopify denominator (BC case). |
| Adobe Commerce Out-of-Stock | Same as Shopify denominator (Adobe case). |
| Shopify Best Sellers | If your bestsellers keep showing up in this card, you have a stock-planning problem, not an ads problem. |
| Google Merchant Center Disapprovals | A feed-sync issue that surfaces here often surfaces in Merchant Center too. |
Reconciling against the vendor’s own dashboard
Where to look in Google Ads UI: Google Ads > Campaigns > Shopping campaigns > Products shows per-SKU spend and clicks. Filter to “Active” and sort by Cost descending. Cross-reference each top-spend SKU’s stock at your commerce platform admin. Google Merchant Center > Products > Diagnostics shows feed errors and SKU availability per Google’s view. If a SKU is out at the commerce platform but Merchant Center still shows it as in stock, the feed sync is broken; this is the root cause of most “ads on OOS” cases. Performance Max > Asset groups > Listings for PMax campaigns; the listings tab shows per-SKU performance. Other Google Ads views that look like the same number but aren’t:- Predefined > Shopping Performance: same data, different layout. Doesn’t tell you which SKUs are actually OOS at the commerce platform.
- Disapproved products: a different concern, the SKU is not allowed to advertise (policy issue), separate from this card. Use Google Ads Alert: Disapproved Burst for that.
- PMax asset performance: PMax obscures SKU-level performance; this card joins to commerce-platform inventory directly to surface what PMax’s UI does not.
| Reason | Direction of divergence |
|---|---|
| Real-time event-ingestion lag (1-4 hour for Google Ads spend; near-real-time for commerce inventory). | Card may flag spend before Google Ads UI shows it (rare) or vice versa (typical). Within 30 minutes both views align. |
| Feed sync lag (30-60 min for Merchant Center). | Google Ads UI may show a SKU still as “available” (Merchant Center cache) when commerce platform has zeroed stock. Card joins to commerce platform directly, so flags faster. |
| ID matching. SKU <-> Merchant Center ID join requires consistent product IDs across platforms. Variant-level mismatches cause join misses. | Card may miss some OOS SKUs if the variant ID mismatch isn’t reconciled. |
| Currency. Both use account currency. | None. |
- “Out of stock” can mean different things. A SKU at 0 inventory but with backorder enabled is technically purchasable. A SKU at 0 with “preorder” is purchasable but with delayed fulfilment. The card uses raw stock = 0; the merchant should configure backorder/preorder behaviour to keep ads running for those SKUs.
- Variant-level OOS within a parent product is tricky. If the dress is OOS in size S but available in M and L, Google Ads typically advertises the parent product. The customer arrives, can’t buy size S, but can buy size M or L. Some customers convert; many don’t. The card defaults to flagging the variant; bias the alert to flag only when ALL variants of a parent product are OOS for cleaner action.
- Drop-ship / vendor-fulfilled SKUs may show 0 stock at the commerce platform but be available via the vendor. Common on marketplace-aggregator sites. Configure the commerce platform’s inventory truth source carefully.
- Hidden / archived products still ad-bidding. If a product was archived in commerce admin without removing its Merchant Center listing, the ad keeps running on a SKU that doesn’t exist. This is a hygiene fix, not a stock-planning fix.
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
shopify.oos_items | Numerator-side overlap: SKUs in this card MUST be in Shopify’s OOS list. | Backorder/preorder enabled SKUs may be in Shopify’s “in stock” view and not in OOS. |
bigcommerce.oos_items | Same logic for BC. | Same. |
adobe_commerce.oos_items | Same logic for Adobe. | Same. |
google_merchant.disapprovals | If a SKU is OOS AND disapproved, both cards flag it. Different actions: this card pauses the ad; disapproval card fixes the feed. | Different root causes; can be related (a disapproval can mask an OOS). |
Known limitations / merchant FAQs
The card flagged 4 SKUs. What’s my action? Pause those product groups in Google Ads (or PMax listings). Five-minute fix. Then check Merchant Center > Diagnostics to find the underlying feed sync issue, the SKUs are flagged here precisely because the feed didn’t catch up. Once the feed re-syncs, you can re-enable the product groups (assuming stock returns). My SKU went OOS 3 days ago and is still in this card, why? Feed sync is broken for that SKU. Likely causes: (1) Merchant Center diagnostic error on that SKU (image issue, GTIN missing, etc.) preventing updates; (2) Shopify Connect / Adobe Connect integration disconnect; (3) variant ID mismatch on a recent product update. Open Merchant Center > Diagnostics and look for warnings on that SKU’sid.
Should I be worried about a single SKU at £5 wasted/24h?
Not in absolute terms; in pattern terms, yes. A single £5 leak isn’t worth a Tuesday morning. But if the same SKU appears here three days running, the feed sync is broken for it and the leak compounds. Spend 10 minutes investigating once, don’t pause-and-forget.
Why does the card flag SKUs that are “preorder, no stock yet”?
The card uses raw stock = 0. Preorder SKUs technically have zero physical stock. To exclude preorders, configure your commerce platform to expose a separate “available for preorder” flag and have VortexIQ set the join to use that flag instead of raw stock. This is a setup adjustment.
My PMax campaigns won’t let me pause individual SKUs, what now?
PMax listings are managed through asset groups and listing groups. You can pause a listing group containing the OOS SKUs, but PMax’s optimiser may shift spend to other SKUs in the same group. The cleaner approach: tag OOS SKUs in your Merchant Center feed with availability: out_of_stock (which Shopify Connect should auto-do, but if it’s not syncing, do it manually), then PMax stops bidding on them automatically.
Does this card cover Performance Max alongside Shopping?
Yes. The cross-channel join is on Merchant Center product ID, not on campaign type. PMax product groups bidding on OOS SKUs surface in this card the same as Shopping campaigns.
Multi-store setups: my UK store has stock but US store doesn’t, will the card flag a US ad?
The card joins per commerce-platform store. If the merchant has separate Google Ads accounts per region (best practice for international), each account joins to its regional store. If the merchant runs one Google Ads account across regions and the inventory is per-region, the card requires per-region configuration; raise with VortexIQ support.
Why is the alert real-time and not 24-hour rolled-up?
Speed of recovery. A 24-hour roll-up means the wasted spend has already been spent before you act. Real-time gives you the chance to pause within 30 minutes of OOS, capping the leak at typically £20-£100 per SKU rather than £200-£500.
A bestseller keeps appearing here every Friday, why?
Buying / inventory planning issue. Your weekly demand exceeds your weekly stock arrival. Either order more for restocking days, raise the safety stock buffer, or accept the Friday leak as cost of high-demand inventory cycling.
Variant-level OOS: a dress is OOS in size S but available in M, L, and XL. The ad runs to the parent product page. Is this wasted?
Partially. Customers who arrive looking for size S won’t convert; customers who arrive flexible-on-size might. Empirical data: typically 30-50% of clicks on a parent product with one variant OOS still convert (smaller for fashion, larger for non-apparel). The card is configurable to flag at variant level (strict) or only when ALL variants are OOS (lenient). Default is strict; merchants on multi-variant SKUs may want to switch to lenient.
Currency-wise, how does the threshold work?
Threshold is in account currency (£10 / €10 / $10 of wasted spend per SKU). For multi-currency merchants, each Google Ads account interprets the threshold in its local currency.