Live ad spend pointed at SKUs that can’t convert. Pause immediately, direct $/day waste.
At a glance
Live ad spend (Google Ads + Meta Ads) currently driving traffic to BigCommerce SKUs that have inventoryLevel = 0. Cross-connector view: ad campaigns × product targets × BC catalogue inventory. Pause immediately is the only correct response, every dollar spent is direct waste, the customer arrives, finds OOS, leaves.
| What it counts | For each active ad target SKU: daily_ad_spend WHERE BC.inventoryLevel = 0 AND BC.availability != 'disabled'. Summed across all paid surfaces (Google Ads Shopping, Meta Ads catalogue / dynamic-product-ads, etc.). |
| VAT / tax treatment | n/a (ad spend, not revenue). |
| Shipping | n/a. |
| Discounts | n/a. |
| Refunds | n/a. |
| Currency | Ad spend in account currency, mixed-currency for multi-account stores. The headline is directional. |
| Channels / sources | Web only by definition (paid ads drive web traffic). |
Incomplete / Declined orders | n/a, this is a pre-purchase waste view. |
| OOS definition match | Same as BC Channel OOS per Channel, inventoryLevel = 0 AND availability != 'disabled'. Items the merchant has hidden don’t count; items left visible-but-stocked-out do. |
| Why this is double-burn waste | Single-burn waste is a paid click that fails at checkout; double-burn waste is a paid click that the merchant is paying for AND can’t fulfil regardless. The customer experience also damages brand trust (“they’re advertising things they don’t have”). |
| Time window | RT (real-time, polled per ad-platform sync; typically every 30-60 minutes) |
| Alert trigger | >$0/day spend on OOS SKU, fires on any positive spend. The alert is intentionally aggressive because the cost is direct dollar bleed with no upside. |
| Sentiment key | out_of_stock_count |
| Roles | owner, marketing, operations |
Calculation
Calculated automatically from your BigCommerce 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 BigCommerce Enterprise. Snapshot at 09:00 UTC on 13 Apr 26.| Active ad campaign | Target SKU | BC inventory | Daily spend | Status | Wasted $/day |
|---|---|---|---|---|---|
| Google Shopping, Bedding | ”Linen 4-piece set, King” | 0 (OOS, available) | $42 | Wasted | $42 |
| Google Shopping, Bath | ”Towel set 6pk, ivory” | 0 (OOS, available) | $24 | Wasted | $24 |
| Meta DPA, Bedding remarketing | ”Linen sheets, Queen” | 38 in stock | $18 | Working | $0 |
| Meta DPA, Holiday | ”Throw cushion 18inch” | 0 (OOS, available) | $12 | Wasted | $12 |
| Google Search, Brand | (n/a, not SKU-targeted) | n/a | $85 | n/a | $0 |
| Total active OOS spend | $78/day |
- 2,340/month = $28,400/year of pure waste. Not just lost potential revenue, negative outcome (the customer arrives, has a bad experience, leaves with worse brand impression than they came with). The fix is one-click: pause the OOS-targeting ad set or hide the OOS listing from the catalogue feed.
- Google Shopping is the biggest waste category. Shopping ads target specific SKUs; when the SKU goes OOS, the ad keeps running until either (a) the merchant pauses, (b) Google’s automated rules detect the OOS and disapproves the listing, which can take 24-72 hours. Manual pause is faster than waiting for Google’s auto-disapproval.
- Meta Dynamic Product Ads (DPA) auto-update from the merchant feed. If your Meta product feed is correctly configured to exclude OOS items, this card should show $0 on Meta. If it’s showing positive Meta spend, the feed configuration is wrong, fix that and the Meta wedge collapses.
- Brand search is unaffected. Brand keywords don’t target SKUs; they target the merchant name. OOS doesn’t affect brand-campaign performance directly, except via the brand-equity erosion of OOS landing experiences.
- Pause ad sets targeting OOS SKUs within 30 minutes. Most ad platforms support per-SKU pausing without taking down the parent campaign.
- Set up automated rules in Google Shopping Merchant Center: “exclude items where availability = out_of_stock”. This is a one-time configuration that prevents future occurrences.
- Audit Meta product feed for OOS exclusion logic. Most BC-Meta integrations support this; verify it’s configured.
- Hide the OOS listings in BC if they don’t have known restock dates (avoids future drift).
Sibling cards merchants should reference together
| Card | Why pair it with Ads on OOS |
|---|---|
| BC Channel OOS per Channel | The OOS source-of-truth that this card joins to. |
| Inventory Alerts | The inventory-side headline. |
| BC XC Paid Traffic Waste | Ads on OOS is a sub-category of paid waste; this card isolates the inventory-driven slice. |
| BC Top SKUs | If a top SKU is OOS and ad-targeted, that’s a five-alarm event. |
google_ads.ga_shopping_disapprovals | Google Shopping’s auto-disapproval signal; correlates with this card. |
facebook.fb_dpa_feed_health | Meta Dynamic Product Ads feed health. |
| BC Stock vs Sales | Velocity context, OOS items with high pre-OOS velocity are the highest-priority restock targets. |
| BC XC Catalogue Drift | Related catalogue-hygiene problem; both flag broken ad surfaces. |
Reconciling against the vendor’s own dashboard
Where to look in BigCommerce Control Panel: BigCommerce does not surface this metric natively. Cross-connector view: BC catalogue inventory + Google Ads campaign targeting + Meta Ads catalogue feed. To partially diagnose:- Products → View shows current inventory.
- Google Ads → Campaigns → Shopping shows active product targeting.
- Meta Ads Manager → Catalogues → Product feed shows DPA targeting.
- Manually correlate: any SKU with
inventory_level = 0and an active ad target is in this card.
| Reason | Direction |
|---|---|
| Sync lag. BC inventory updates take 5-30 minutes to propagate; ad-platform spend reports lag 2-6 hours. The card may show momentary discrepancies. | Marginal |
| Variant-vs-product semantics. We count at variant level; some merchants target ads at parent-SKU level. | Matching depends on configuration |
| Auto-pause rules. Google Shopping’s auto-disapproval can pause OOS items within 24-72 hours; we surface them during that window. | Vortex IQ flags transient OOS-spend |
| Currency. Ad spend in account currency. | Mixed for multi-account stores |
| Card | Expected relationship | Notes |
|---|---|---|
google_ads.ga_shopping_disapprovals | Google’s auto-flagged OOS items; should overlap with the Google portion of this card. | Direct correlation. |
facebook.fb_dpa_feed_health | Meta’s catalogue-feed health. | Direct correlation. |
| BC Channel OOS per Channel | The OOS-side input. | Direct dependency. |
Known limitations / merchant FAQs
Why is this card always non-zero, can I ever get it to zero? Yes, with proper automation. Two configurations end up at zero: (1) Google Shopping Merchant Center auto-rule excluding OOS items from the feed. (2) Meta product feed configured to filteravailability != in stock. Once both are set, OOS items disappear from ad targeting within hours. The card going to zero is an achievable, sustainable state; not a fantasy.
Some OOS items have known restock dates within 7 days; should I keep ads running?
No. Even with a 7-day restock, the customer arriving today has a bad experience. Switch the listing to preorder mode (BC supports per-SKU preorder configuration), then the ad becomes “Order now, ships 19 Apr 26”, which is honest and converts. Don’t run “in stock” ads on items that aren’t.
My ads are paused but the card still shows them as wasting spend, why?
Two possibilities: (1) Pause hasn’t propagated yet (ad platforms have 1-4 hour ramp-down on paused campaigns). (2) The pause was at the campaign level but individual product targets within the campaign are still active. Pause at the product-target layer for surgical control.
Why doesn’t this card include Pinterest / TikTok Ads?
Currently we monitor Google Ads and Meta Ads (the dominant ecommerce paid surfaces). Other surfaces are on the roadmap; if you have meaningful spend there, contact Ask Viq to prioritise.
My BC inventory is wrong, the items aren’t actually OOS, why does the card flag them?
The card uses BC-indexed inventory as truth. If BC says zero and your warehouse says ten, fix the inventory sync first; the card surfaces what BC believes. Once BC reflects accurate inventory, the false-positive flags resolve.
Should I disable BC’s OOS items entirely or just hide them?
Disable (availability = disabled) is the cleanest state, the listing disappears from public view AND from ad targeting. Hidden-but-not-disabled items can still leak into ad feeds depending on configuration. Disable is preferred for items without near-term restock; preorder mode is preferred for items with known restock dates.
My Meta DPA budget is auto-allocating to OOS items, what changed?
Meta’s algorithm sometimes prioritises items with strong recent engagement; if your top-engagement SKU went OOS, Meta may increase spend on that ad even though it can’t convert. Configure your Meta product feed to set availability = out of stock so Meta auto-excludes; the budget will reallocate to in-stock items.
Why does Google Shopping take so long to auto-detect OOS?
Google’s automated checks run on a 24-72 hour cadence depending on your account history. New accounts get faster checks; established accounts get slower checks. Don’t wait for the auto-detect, manual pause is faster.
My OOS-on-ads spend is $200/day, but the SKU has back-orders pre-paid; is that still wasted?
Yes, in the customer-experience sense. The arriving customer doesn’t know about back-orders unless your PDP communicates it clearly. They see “out of stock” and bounce. Switch to preorder mode and use BC’s preorder UI to communicate the restock date; conversion remains positive and the spend is no longer “wasted”.
Multi-currency Amazon variant: do those count?
Channel Manager / Amazon-routed traffic doesn’t appear in this card (this is a paid-ads-driven card; Channel Manager isn’t paid ads). Amazon’s own paid surface (Amazon Sponsored Products) on OOS items is a separate problem; the amazon_sp.amazon_sponsored_oos card covers that.