Skip to main content
Card class: HeroCategory: Cross-Channel

At a glance

A cross-channel alert that joins AdRoll’s live Dynamic Ads serving against your commerce platform’s real-time stock levels and flags every case where AdRoll is still running a dynamic product ad for a SKU that is actually out of stock. AdRoll’s Dynamic Ads are driven entirely by the product catalogue synced from your store, so an out-of-stock SKU left in the eligible pool is pure waste: you pay the click, the shopper lands on a product page they cannot buy, they bounce, and the conversion is impossible by definition. Because AdRoll is retargeting-first, the shopper has usually already viewed or carted that exact SKU, which makes the sold-out landing experience even more jarring. This card only exists because Vortex IQ sees both sides, AdRoll’s serving layer and the commerce stock ledger, in one place. It is the highest-confidence “stop paying for this right now” signal in the AdRoll manifest, because there is no ambiguity: a quantity of zero cannot convert.
What it countsThe count and the at-risk spend of active AdRoll Dynamic Ads whose target SKU has a current stock quantity of zero on the connected commerce platform (Shopify, BigCommerce, or Adobe Commerce). The alert is the breach state; the displayed value is the offending SKU list and the spend exposed to those ads.
Cost basisCPC-dominant. Every click on an out-of-stock dynamic ad is billed and structurally cannot convert, so the cost basis is effectively a waste floor. CPM impressions on the same creative are softer waste but still spend against a dead SKU.
CurrencyAdvertiser-account currency for the at-risk spend figure. The SKU match itself is currency-neutral.
Conversion attributionNot applicable in the usual sense, the whole point is that conversion is impossible. Any attributed conversion on a zero-stock SKU is almost always a lagged credit from before the stock-out, picked up through the AdRoll Pixel.
Attribution window30-day click + 1-day view default (AdRoll’s standard) for any residual lagged credit.
Bot / invalid trafficNot the relevant axis here; the waste is structural regardless of traffic quality.
iOS 14.5+ ATT impact on the cardLow. This card keys off stock state and ad-serving state, not Pixel attribution, so ATT and signal loss do not distort it. That is part of why it is high-confidence.
Catalogue-feed dependencyCentral. The usual cause is a product feed that has not synced the stock-out yet: the storefront shows zero but AdRoll’s catalogue still lists the SKU as available, so Dynamic Ads keep rendering it. Feed cadence is the lever.
Time windowRT (real-time). Stock can flip to zero at any moment, so the join evaluates continuously rather than on a fixed period.
Alert triggeractive dynamic ad on commerce-sibling SKU with qty=0. An illustrative rule; the breach fires the moment a live AdRoll Dynamic Ad targets a SKU whose connected-store quantity is zero.
Rolesowner, marketing, operations

Calculation

Calculated automatically by joining your AdRoll data with your connected commerce platform. 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 homeware DTC retailer on BigCommerce runs AdRoll Dynamic Ads retargeting across a 1,800-SKU catalogue, mostly site-visitor and cart-abandoner audiences with a small prospecting layer. A weekend clearance sold through three hero SKUs faster than the feed refreshed. The join evaluates AdRoll’s live Dynamic Ads serving against BigCommerce stock. Account currency GBP. Window is real-time, snapshot 19 Jun 26.
SKUProductBigCommerce qtyStill served by AdRoll?Spend last 24h (GBP)State
HOM-2207Linen Duvet Set, double0Yes280BREACH
HOM-1944Stoneware Dinner Set, 12pc0Yes165BREACH
HOM-2310Wool Throw, charcoal0Yes90BREACH
HOM-2208Linen Duvet Set, king52Yes140OK
What the pattern tells you:
  1. Three hero SKUs at quantity zero are still being served. That is roughly GBP 535 of at-risk spend in a single day on ads that cannot convert. Because these are retargeting placements, the clicks come from shoppers who already wanted the exact item, so click rates stay high and the waste accelerates. Every click sends a shopper to a sold-out product page. The waste is not hypothetical; it is billed and ongoing.
  2. The feed has not caught up to the stock-out. BigCommerce recorded the sell-through, but AdRoll’s catalogue still lists the three SKUs as in stock, so Dynamic Ads keep selecting them. The gap between the storefront and the synced feed is the entire problem, and feed cadence is the fix.
  3. A near-sibling SKU is fine. The king-size duvet set (HOM-2208) is in stock and converting normally, which proves the campaign and audience are healthy. The fault is per-SKU stock-out, not a campaign-level failure, so the action is surgical, not a campaign pause.
  4. The fastest mitigation is a feed re-sync. Force a catalogue push so AdRoll sees quantity zero and drops the SKUs from the dynamic pool automatically. Most stores running daily feed sync are exposed during clearance and flash events; moving to a faster stock sync closes the window.
  5. The structural fix is stock-aware feed rules. Configure the product feed export to exclude or suppress zero-quantity SKUs at the source, so a stock-out removes the SKU from AdRoll’s eligible pool the moment it happens rather than at the next scheduled sync.
  6. There may be a small residual conversion. If any of these SKUs shows an attributed conversion in AdRoll, it is almost certainly lagged Pixel credit from a click before the stock-out, not a sale of an out-of-stock item.
Quick sanity tests:
  • Breach concentrated on hero SKUs during a promotion = feed lag against fast sell-through, tighten sync cadence.
  • Breach on a single SKU = isolated stock-out, suppress that SKU in the feed.
  • Breach clears after a forced feed re-sync = confirmed feed-lag cause, no campaign change needed.
  • Breach persists after re-sync = the feed export is not honouring stock state, fix the feed rule.
  • At-risk spend is large relative to total = your feed cadence is too slow for your stock velocity.

Sibling cards merchants should reference together

CardWhy it matters next to Active Dynamic Ads on Out-of-Stock SKUsWhat the combination tells you
Spend on Campaigns with Active Feed RejectionsThe other feed-driven waste card.Stock-out waste and feed-rejection waste are the two ways a product feed costs you money; reviewing both gives the full feed-health bill.
Wasted-Spend Burst (retargeting pool exhaustion)The acute zero-return burst detector.If a hero SKU stock-out is large enough, it can also trip the burst card; both firing names the SKU and sizes the bleed.
Wasted SpendThe trailing-period waste audit.Persistent out-of-stock serving shows up here as chronic waste; this card catches it acutely.
Retargeting ROAS Dropped Below ThresholdThe efficiency tripwire for your core audience.Out-of-stock serving silently drags retargeting ROAS; clearing it is a direct efficiency win on the audience that matters most.
ROASThe efficiency headline.Out-of-stock serving quietly suppresses ROAS; removing dead SKUs lifts return without touching budget.
Landing Pages with Poor Web VitalsThe other “the click lands badly” card.A sold-out page and a slow page are both broken landing experiences; together they show where paid clicks are being wasted after the click.

Reconciling against AdRoll

Where to look in AdRoll’s own dashboard:
In the AdRoll dashboard at app.adroll.com, open Product Feed (under Audiences and catalogue settings) to see which SKUs AdRoll currently treats as available, and your commerce platform’s inventory view (Shopify Admin → Products → Inventory, BigCommerce → Products, or Adobe Commerce → Catalog → Products) for the live stock quantity.
AdRoll on its own cannot show you this card, because AdRoll only knows what its synced catalogue says, not what your storefront actually has in stock at this second. That is the cross-channel gap Vortex IQ closes. To reconcile manually, take the breached SKU list from this card, look each one up in AdRoll’s Product Feed (it will show as available, which is the bug) and in your commerce inventory (it will show quantity zero, which is the truth). The mismatch between the two is exactly what this card surfaces automatically. Why our number may legitimately differ from a manual check:
ReasonDirectionWhy
Feed-sync timingMoves with cadenceThe breach reflects the moment-in-time gap between storefront stock and AdRoll’s catalogue; a manual check minutes later may show fewer SKUs if a sync ran in between.
Stock buffer rulesEither directionSome stores reserve safety stock or count committed-but-unfulfilled units; whether “quantity zero” means truly sold out depends on your inventory policy.
Multi-location inventoryOurs may differIf stock is summed across warehouses or locations, the relevant quantity is the sellable total, which the join uses; a single-location view can read differently.
Pre-order or backorder SKUsOurs may over-flagA SKU at quantity zero that is still purchasable on backorder is not true waste; configure the feed rule to treat backorder SKUs as available.
Cross-connector reconciliation: This card is inherently cross-channel; the join is its whole reason for existing:
CardExpected relationshipWhat causes legitimate divergence
shopify.inventory_on_hand / bigcommerce.inventory_level / adobe_commerce.stock_statusThe commerce-platform stock truth is the authoritative side of the join; a SKU at zero there while AdRoll still serves it is the breach.Inventory-policy nuances (safety stock, backorder, multi-location) decide what “out of stock” means; align the feed rule to the same policy.
shopify.total_revenueHelps size the opportunity cost: a high-velocity SKU that sold out is both lost sales and wasted ad spend.A slow SKU stock-out wastes less spend than a hero SKU stock-out even at the same ad volume.

Known limitations / merchant FAQs

Why does AdRoll keep serving ads for a product I have sold out? Because AdRoll serves Dynamic Ads from its synced catalogue, and the catalogue is only as fresh as your last feed sync. The storefront recorded the sell-through immediately, but AdRoll will not know until the next feed push tells it the quantity is zero. On a daily-sync store, that gap can be most of a day, long enough to waste real money during a fast-moving clearance. Tightening feed cadence is the direct fix. Is this really waste if the shopper might buy something else when they land? Some recovery happens, but you should not count on it, and it is even less likely on retargeting. The shopper was retargeted on a specific product they had already viewed or carted, found it sold out, and most will bounce rather than browse a substitute. Treat the spend as waste for planning purposes; any cross-sell recovery is a bonus, not a reason to tolerate the leak. What is the fastest way to stop the bleed when this fires? Force a product feed re-sync so AdRoll sees the zero quantity and drops the SKUs from the dynamic pool. That is minutes of work and stops the waste immediately. The durable fix is a feed export rule that suppresses or excludes zero-quantity SKUs at the source, so future stock-outs remove themselves from the eligible pool the moment they happen. My SKU is at zero but it is on backorder and still buyable, is this a false flag? Yes, and it is worth fixing. A backorder-enabled SKU at quantity zero can still convert, so it should not be treated as out of stock. Configure the feed rule and the inventory policy so backorder and pre-order SKUs report as available; otherwise the card will over-flag them. The card honours whatever stock definition your feed and inventory policy supply. Does ATT or Pixel signal loss affect this card? Barely, which is one of its strengths. The card keys off stock state and ad-serving state, both of which are observed directly rather than attributed through the AdRoll Pixel, so iOS ATT and Safari ITP do not distort it. A breach here is high-confidence: a quantity of zero cannot convert regardless of how attribution is measured. How is this different from feed rejections? Two distinct feed failures. A feed rejection means AdRoll refused the catalogue or specific items, so no creative renders at all. An out-of-stock-serving breach means the creative renders fine, the SKU just is not buyable. One stops ads; the other runs ads that cannot convert. Review both feed-health cards together for the complete picture. Does this matter more on retargeting than on prospecting? Yes, in practice it tends to hit retargeting hardest. Retargeting Dynamic Ads re-serve the precise SKUs a shopper already engaged with, so when one of those sells out the ad keeps chasing a warm, high-intent audience to a dead page, which is the most expensive form of this waste. Prospecting Dynamic Ads can hit it too, but the per-click intent is lower, so the sting is smaller per impression. Either way the fix is the same: keep the feed honest about stock.

Tracked live in Vortex IQ Nerve Centre

Active Dynamic Ads on Out-of-Stock SKUs is one of hundreds of KPI pulses Vortex IQ tracks across AdRoll and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.