Home / Guides / Measurement

Measurement

How to see variant-level ad spend and waste

Meta and Google report at campaign, ad set and ad. Your money dies at the size and colour line. Here is how to close that gap yourself.

Updated 9 Sep 2026 · ~1484 words · David Smith

Every operator who has run catalogue ads on a fashion catalogue has asked some version of this: how much did I spend advertising the size that was already gone? Every ad platform answers it the same way, which is not at all.

Direct answer: No ad platform reports spend per variant, because spend belongs to ad objects and not to products. But if your catalogue uses variant-level item IDs, and most Shopify feeds do, then the product-level breakdown Meta and Google already give you is variant-level reporting. Join that to a daily record of what was sellable and you can price the waste to within an order of magnitude. That is enough to win the argument.

Stock (per variant)Harris jacket · 10 · 3 days coverHarris jacket · 12 · sold outLinen shirt · M · 41 days coverSpend (per campaign)Bestsellers ASC · £412 yesterdayRetarget 30d · £96 yesterdayMorning list, ranked by £ at risk1. Harris jacket 12: sold out, 2 campaigns, £180/day → exclude in Bestsellers ASC (revert on restock)2. Harris jacket 10: 3 days cover, withhold last 4 units3. Linen shirt M: fine, leave it
The join is the whole method: spend apportioned to the catalogue item, matched to the variant, ranked by waste.

Why the number does not exist

Budget sits on a campaign or an ad set. A single catalogue ad set can serve several hundred items from one product set, choosing per impression which to show. So there is no ledger anywhere that says "we spent £41.20 on the UK 8". What the platforms do instead is apportion outcomes to the item that was shown.

That distinction matters when someone challenges your number, so get ahead of it: item-level spend is always an apportionment. It is not wrong, it is derived. Everyone reporting product-level ad spend, including every vendor who sells you a dashboard, is doing exactly this.

The thing most operators do not realise

Shopify's Meta catalogue sync sends one catalogue item per variant, with an item_group_id grouping them under the parent. Google Shopping behaves the same way for most Shopify feeds.

So when Ads Manager offers you a breakdown by product, and your catalogue is variant-level, that breakdown is already the size-and-colour view you have been asking for. Nobody labels it that way, which is why teams that already have the data still believe they cannot get it. Check your catalogue before you conclude anything is missing.

The input you almost certainly do not have

The blocker is rarely the spend side. It is knowing what was sellable on a given day. Shopify holds current inventory well and inventory history badly, so most stores cannot answer "was the UK 8 available on the 14th" three weeks after the fact.

There is no clever way around this. Either something has been snapshotting available quantity per variant daily, or it has not. If it has not, start today: a daily export of variant and available quantity, appended to a sheet, costs nothing and makes every future version of this analysis possible. This is the single highest-value piece of plumbing a growing store can add, and it takes an afternoon.

You cannot analyse a stock history that nobody recorded. Start the log before you need it.

What good looks like when you have it

A store with three months of daily variant snapshots can answer questions that are otherwise pure opinion. Which sizes consistently sell out mid-flight. Whether the waste is concentrated in a handful of hero products or spread thin. Whether the bleed is getting worse as you scale. Whether a buffer policy actually paid for itself.

Without the log, all of those get settled by whoever speaks most confidently in the meeting. That is the real cost of not having the number, and it compounds quietly.

A worked example

A footwear brand exports 90 days of catalogue item performance and finds £62,000 of Meta spend across 1,400 variant items. Joining to their daily stock log shows £4,900 of that spend landed on days where the variant had zero available at the fulfilment location. That is roughly 8 percent, or about £54 a day, bleeding continuously. The same logic applies to margin, not just spend, and the full breakdown by product sits in true profit from Shopify ads and COGS.

Then the more useful cut: 71 percent of the waste sits on 23 variants, all of them mid-run sizes on four bestsellers. That is not a catalogue-wide platform problem needing a procurement cycle. That is a buffer rule on four products, which someone can implement on Thursday afternoon.

The aggregate number gets attention. The concentration is what makes it actionable, so always cut it both ways.

What the number is not

Who this argument is actually for

Two audiences, and they need different framings. Whoever owns purchasing needs the daily bleed rate against the margin cost of holding units back, because the buffer decision is theirs. Whoever owns budget needs the concentration cut, because it tells them whether this is an engineering project or a Thursday afternoon.

Bring one number to both and you will lose one of the conversations.

Estimate variant-level ad spend and out-of-stock waste

  1. Confirm your catalogue IDs are variant-level. Open Commerce Manager and inspect a product. If you see one entry per size or colour, each with its own ID and often an item_group_id tying them to the parent, your catalogue is variant-level. Most Shopify feeds are. If instead you see one entry per product, everything below this line is impossible until you fix the feed, and that is the finding.
  2. Pull item-level results from Meta. In Ads Manager, filter to your catalogue campaigns and use the breakdown by product or product ID. Export it. You now have impressions, clicks, spend and purchases attributed per catalogue item for the window.
  3. Pull item-level results from Google. In Google Ads use the Shopping product report, or the Merchant Center product performance view, and export by item ID for the same window. Keep the two exports separate. Do not add Meta and Google spend per item until you have agreed how you treat overlap.
  4. Rebuild each variant's availability history. This is the hard input. Shopify does not keep an easy stock-history export, so use what you have: inventory adjustment history, your 3PL or ERP feed, or a daily snapshot if someone has been taking one. If nothing exists, start snapshotting available quantity per variant daily now, and accept that this analysis is retrospective from today rather than backdated.
  5. Join spend to availability by day. For each variant and each day, you now have spend and whether it was sellable. Sum the spend on days where available was zero, or below your buffer. That total is your first honest estimate of out-of-stock ad waste.
  6. Separate the two kinds of waste. Spend on genuinely unsellable stock is pure loss. Spend on a variant that was in stock but converts far below its category median is a different decision, closer to an exclusion call than a stock one. Report them as two numbers, because they have two different owners.
  7. Convert waste into a buffer policy. Divide the waste by the number of days in the window to get a daily bleed rate. Then compare it against the margin you would give up by withholding the last few units from paid. That comparison is the entire buffer argument, and it is usually one-sided once someone finally puts numbers on it.
  8. State the error bars every time you share it. Catalogue campaigns only, platform attribution as-is, no halo, availability reconstructed rather than logged. Say it out loud. A number with stated limits survives scrutiny. A confident number that turns out to be a guess costs you the argument permanently.

Questions people actually ask

Can Meta report ad spend per product variant?

Not directly as a variant dimension. But catalogue and Advantage+ catalogue campaigns can break results down by the catalogue item, and for most Shopify setups the catalogue item IS the variant, because the feed sends variant-level IDs. So product-level breakdown gives you variant-level reporting without anyone calling it that.

Why does no platform show spend by size?

Because spend is attached to ad objects, not to products. A single ad set can serve hundreds of items from one catalogue, so the platform apportions results to items, not budget. Item-level spend is therefore always an apportionment, never a ledger entry.

How accurate is the approximation?

Good enough to make decisions with, not good enough for the accounts. It covers catalogue-driven spend only, it inherits the platform's attribution window, and it cannot see the halo where a catalogue ad drives a search for the same product. Treat it as an order of magnitude, and be honest about that when you present it.

What is the number actually for?

Two arguments. Deciding whether a variant-level stock problem is worth engineering effort, and justifying a buffer policy to whoever owns purchasing. Both need a pound figure, and both currently get argued with anecdotes.

If the numbers are the problem: Ralph puts real orders, costs and refunds next to the ads, and leaves a blank where a cost price is missing rather than inventing a margin. See Ralph · True profit · Docs