At a glance
A cross-channel alert that joins Criteo’s live dynamic-ad serving against your commerce platform’s real-time stock levels and flags every case where Criteo is still serving a dynamic product ad for a SKU that is actually out of stock. Criteo’s entire model is dynamic product retargeting, so an out-of-stock SKU in the creative 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. This card only exists because Vortex IQ sees both sides, Criteo’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 Criteo manifest, because there is no ambiguity: a quantity of zero cannot convert.
| What it counts | The count and the at-risk spend of active Criteo 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 basis | CPC-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. |
| Currency | Advertiser-account currency for the at-risk spend figure. The SKU match itself is currency-neutral. |
| Conversion attribution | Not 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. |
| Attribution window | 30D click + 7D view default for any residual lagged credit. |
| Bot / invalid traffic | Not the relevant axis here; the waste is structural regardless of traffic quality. |
| iOS 14.5+ ATT impact on the card | Low. This card keys off stock state and ad-serving state, not attribution, so ATT does not distort it. That is part of why it is high-confidence. |
| Catalogue-feed dependency | Central. The usual cause is a feed that has not synced the stock-out yet: the storefront shows zero but Criteo’s catalogue still lists the SKU as available, so dynamic creative keeps rendering it. Feed cadence is the lever. |
| Time window | RT (real-time). Stock can flip to zero at any moment, so the join evaluates continuously rather than on a fixed period. |
| Alert trigger | active dynamic ad on commerce-sibling SKU with qty=0. An illustrative rule; the breach fires the moment a live dynamic ad targets a SKU whose connected-store quantity is zero. |
| Roles | owner, marketing, operations |
Calculation
Calculated automatically by joining your Criteo 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 US beauty DTC retailer on Shopify runs Criteo dynamic retargeting across a 2,400-SKU catalogue. A flash promotion sold through three hero SKUs faster than the feed refreshed. The join evaluates Criteo’s live dynamic-ad serving against Shopify stock. Account currency USD. Window is real-time, snapshot 18 Jun 26.| SKU | Product | Shopify qty | Still served by Criteo? | Spend last 24h ($) | State |
|---|---|---|---|---|---|
| BTY-1182 | Vitamin C Serum 30ml | 0 | Yes | 340 | BREACH |
| BTY-0904 | Hydrating Mask, set of 3 | 0 | Yes | 210 | BREACH |
| BTY-1450 | Night Repair Oil | 0 | Yes | 95 | BREACH |
| BTY-1188 | Vitamin C Serum 50ml | 64 | Yes | 180 | OK |
- Three hero SKUs at quantity zero are still being served. That is roughly USD 645 of at-risk spend in a single day on ads that cannot convert. Every click sends a shopper to a sold-out product page. The waste is not hypothetical; it is billed and ongoing.
- The feed has not caught up to the stock-out. Shopify recorded the sell-through, but Criteo’s catalogue still lists the three SKUs as in stock, so dynamic creative keeps selecting them. The gap between the storefront and the feed is the entire problem, and feed cadence is the fix.
- A near-sibling SKU is fine. The 50ml serum (BTY-1188) 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.
- The fastest mitigation is a feed re-sync. Force a catalogue push so Criteo sees quantity zero and drops the SKUs from the dynamic pool automatically. Most stores running daily feed sync are exposed during flash events; moving to hourly or near-real-time stock sync closes the window.
- The structural fix is stock-aware feed rules. Configure the feed export to exclude or suppress zero-quantity SKUs at the source, so a stock-out removes the SKU from Criteo’s eligible pool the moment it happens rather than at the next scheduled sync.
- There may be a small residual conversion. If any of these SKUs shows an attributed conversion, it is almost certainly lagged credit from a click before the stock-out, not a sale of an out-of-stock item.
- 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
| Card | Why it matters next to Active Dynamic Ads on Out-of-Stock SKUs | What the combination tells you |
|---|---|---|
| Spend on Campaigns with Active Feed Rejections | The other feed-driven waste card. | Stock-out waste and feed-rejection waste are the two ways a feed costs you money; reviewing both gives the full feed-health bill. |
| Wasted-Spend Burst (feed-failed dynamic creative) | The acute zero-conversion 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 Spend | The trailing-30-day waste audit. | Persistent out-of-stock serving shows up here as chronic waste; this card catches it acutely. |
| Zero-Conversion Spend | The underlying zero-conversion metric. | Out-of-stock SKUs are a guaranteed contributor to zero-conversion spend. |
| ROAS | The efficiency headline. | Out-of-stock serving silently drags ROAS; clearing it is a direct efficiency win. |
| Conversion Rate by Campaign | Campaign-level conversion health. | A dynamic campaign heavy with out-of-stock SKUs will show a depressed conversion rate. |
Reconciling against Criteo
Where to look in Criteo’s own dashboard:Criteo Management Centre → Catalogue / Feed Manager → Products to see which SKUs Criteo 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.Criteo on its own cannot show you this card, because Criteo only knows what its 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 up in Criteo’s catalogue (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:
| Reason | Direction | Why |
|---|---|---|
| Feed-sync timing | Moves with cadence | The breach reflects the moment-in-time gap between storefront stock and Criteo’s catalogue; a manual check minutes later may show fewer SKUs if a sync ran in between. |
| Stock buffer rules | Either direction | Some stores reserve safety stock or count committed-but-unfulfilled units; whether “quantity zero” means truly sold out depends on your inventory policy. |
| Multi-location inventory | Ours may differ | If 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 SKUs | Ours may over-flag | A SKU at quantity zero that is still purchasable on backorder is not true waste; configure the feed rule to treat backorder SKUs as available. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
shopify.inventory_on_hand / bigcommerce.inventory_level / adobe_commerce.stock_status | The commerce-platform stock truth is the authoritative side of the join; a SKU at zero there while Criteo 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_revenue | Helps 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. |