Inventory-aware ad spend: how to tie your budget to your stock.
The platforms know whether a product is in stock. They do not know it will sell out in nine days. Here is how to tell them.
A product with nine days of stock and a six-week reorder time is still in stock. As far as Google and Meta are concerned, it is a perfectly good product to scale.
That is the gap this post closes. Both platforms read a simple availability value from your feed. In stock, the product can be advertised. Out of stock, it cannot. Everything in between is invisible to the bidding: the product that will run out before the reorder lands, and the product sitting on six months of excess. The platforms only learn about those if you put them in the feed yourself.
The setup below takes an afternoon to build and about thirty minutes a week to run.
What the platforms already do with stock
Start with what is automatic, so you do not rebuild it.
- Google Merchant Center reads the availability attribute, with four supported values: in_stock, out_of_stock, preorder, and backorder. The value must match your website. If Google finds a product in stock on your landing page but marked out_of_stock in your data, it disapproves the product.
- Google advises against using out_of_stock to hide a product you are still selling. To stop a product showing for a while, use the pause attribute: the value ads pauses ads only, and the value all also pauses free listings, but a product paused with all for more than 14 days is archived automatically. or excluded_destination to keep it out of Shopping ads specifically.
- Merchant Center can update availability from your landing pages through automatic item updates. Google notes that these are not a replacement for regular product data updates.
- In a Meta catalog, availability takes in stock or out of stock. Meta’s field reference says out-of-stock items display as sold out in a shop and do not display at all in ads.
- On Shopify, the Google & YouTube app syncs your products to Merchant Center automatically, and the Facebook & Instagram app syncs them to a Meta catalog. It is worth understanding how the Google app handles that sync before you add anything on top of it.
So zero is handled, provided the sync works. Your job is the stretch between healthy stock and zero, and the other end: products with far more stock than you will sell at the current rate.
Days of cover: the one number to compute
Days of cover is how long current stock lasts at the current sales rate.
Days of cover = units available to sell ÷ average units sold per day
Use units available, not units on hand, so stock already committed to open orders is excluded. For the sales rate, use the trailing 28 days for most of the year and the trailing 14 days in November and December, when the rate changes quickly. Count every channel the stock serves, not only paid, because a wholesale order draws down the same shelf.
Then compare cover to the reorder lead time: the days from placing a purchase order to having sellable stock. A product with 30 days of cover and a 45-day lead time is going to run out, even though it looks healthy today.
Shopify’s inventory export gives you units available by variant, and its sales reports give you units sold. A spreadsheet joins them. You do not need an app to start.
Stock tiers and what each one means for spend
Turn days of cover into five tiers. The cutoffs below are a rule of thumb, a sensible starting point rather than a platform rule. Check overstock first, then work down, and adjust the numbers to your own lead times.
- overstock: more than 120 days of cover and more than twice the lead time. Push. Give these products their own budget and a lower ROAS target, or feature them in catalog ads. Stock sitting still costs money too.
- deep: cover more than twice the lead time. Scale normally.
- healthy: cover between one and two times the lead time. Run at your normal targets.
- thin: cover below the lead time but above 14 days. Hold spend flat, do not scale, and raise the ROAS target so the stock you have left sells at a better margin.
- critical: 14 days of cover or less. Exclude from prospecting. Keep it in remarketing only if you would rather sell the last units at full price than let them sit.
Out of stock needs no tier. The availability value and the sync handle it.
A worked example
Here is the arithmetic for six illustrative products on one Monday in November. The numbers are made up to show the method. They are not a client’s catalog.
| Product | Units available | Units sold per day | Days of cover | Lead time (days) | Tier | Spend decision |
|---|---|---|---|---|---|---|
| A | 4,200 | 60 | 70 | 30 | deep | Scale |
| B | 1,500 | 50 | 30 | 35 | thin | Hold, raise ROAS target |
| C | 900 | 20 | 45 | 30 | healthy | Run at target |
| D | 260 | 26 | 10 | 21 | critical | Exclude from prospecting |
| E | 3,000 | 15 | 200 | 30 | overstock | Push with its own budget |
| F | 0 | n/a | 0 | 30 | out | Confirm the feed shows out of stock |
Product B is the one that catches people out. It sells well, its ROAS is good, and the bidding will want to push it. Raise its spend by half and, if daily sales rise with it from 50 to 65 units, cover falls from 30 days to 23. The reorder is still 35 days away. You have paid to sell out faster, and for twelve days there is nothing to sell.
Product E is the opposite case. At 15 units a day it has more than six months of stock. That is cash on a shelf. A lower target on E, even at a thinner margin, can be a better use of budget than another dollar on A.
Setting it up in Merchant Center and Google Ads
Use one custom label for the stock tier. Merchant Center gives you five, custom_label_0 to custom_label_4, each holding one value per product of up to 100 characters, with up to 1,000 unique values per label across the account. You need five values. If you already use labels for margin bands or seasonality, as the feed optimization guide suggests, pick a free one and write down which is which.
- Keep the tiers in a Google Sheet with two columns: the product ID exactly as it appears in Merchant Center, and the tier value.
- Add the sheet as a supplemental data source for your main product source, mapping the tier column to the custom label you chose. The Shopify sync keeps owning titles, prices, and availability. The sheet only adds the label.
- In Standard Shopping campaigns, subdivide product groups by that custom label and exclude critical. Google’s own help describes custom labels as the way to include or exclude specific sets of products.
- In Performance Max, open the asset group’s listing groups, subdivide by the same custom label, and set critical to Exclude.
- If you want overstock pushed hard, give it its own campaign or asset group with its own budget and target, rather than a subdivision inside the main one, so the budget cannot drift back to your best sellers.
Check it before you rely on it. After the first upload, open a few products in Merchant Center and confirm the label arrived on the right items. A product ID format that differs between Shopify and your sheet is the usual reason it does not.
Setting it up in Meta
Meta catalog ads work from product sets, and product sets are built from filters on catalog fields. Two fields are made for this.
- internal_label. Meta describes it as a way to add labels that help filter items when you create product sets. Labels are stored in lowercase and matched as a whole, so filter with is any of, not contains.
- custom_number_0 to custom_number_4. Whole numbers you can filter by range, with is greater than and is less than. Write days of cover here, rounded to a whole number, and product set rules can read cover directly.
Build two product sets. A prospecting set that excludes critical items, using internal label critical or days of cover less than 15, and an overstock set for the products you want to push. Point prospecting catalog campaigns at the first set, and give the second its own ad set and budget.
Add the fields through the route that feeds your catalog today. If the Facebook & Instagram app populates it, a supplementary feed keyed on the same content ID is the least invasive way to add columns. Check Meta’s field reference for which fields a supplementary feed accepts before you build one.
How fresh your feed really is
There are two clocks here, and they need different speeds.
Availability has to be close to real time. An ad pointing at a sold-out page wastes the click, and on Google a mismatch can get the product disapproved. That clock belongs to the native sync. Tiers change slowly, because days of cover moves a little each day. A weekly update is enough for them.
Do not assume the native sync is fast. Measure it. When a product sells out, note the time, then check when Merchant Center and Meta Commerce Manager show it as out of stock. Do the same when stock returns. If the lag is more than a few hours, find out why before adding anything else, because every rule here sits on top of accurate availability. Turning on automatic item updates gives Google a second way to catch a mismatch.
The weekly routine
- Monday: export units available and units sold from Shopify. Compute days of cover and the tier for every active product.
- Update the tier sheet and the Meta days-of-cover field. Note which products changed tier since last week.
- Check that last week’s changes took effect: excluded products show no spend, and overstock products are spending their own budget.
- Open Merchant Center diagnostics and look for availability mismatches. Fix the cause, not only the item.
- Send every critical product to whoever places purchase orders, with the date it runs out at the current rate. That is often the most valuable line in the routine.
- Once a month, check the lead times you are using. Supplier lead times often stretch in the fourth quarter.
What common advice gets wrong
The common line is that automation handles stock: the feed syncs, out-of-stock products drop out, and Performance Max or Advantage+ does the rest. The first two parts are true. The third is where the money goes.
Bid strategies optimize toward conversions and conversion value. A product that converts well gets more budget, whether it has nine days of stock or ninety. There is no field for lead time. So automation tends to do the opposite of what you want with a thin product: push it harder, sell it out sooner, then relearn without it. The platform is not failing. It is missing a fact only you have.
This matters most in a concentrated account. If one product brings most of your new customers, as in the hero SKU concentration example, its stock tier is effectively the account’s growth plan.
When this advice is wrong
- Made-to-order and print-on-demand products have no stock to run out of. Use delivery time to the customer as the constraint instead, if it matters at all.
- Deep supplier stock. If you dropship from a supplier holding thousands of units with restocking in days, your own cover is the wrong number. Use theirs if you can get it.
- Planned sell-outs. A limited drop is meant to sell through, and excluding it at 14 days of cover defeats the point. Run those products in their own campaign with a fixed budget and an end date.
- Preorders. Merchant Center supports preorder and backorder as availability values. If you take orders against incoming stock, advertise it deliberately with the right value and a clear ship date rather than excluding it.
- Small catalogs. With five products and plenty of stock, a weekly glance is enough. The system earns its keep when the catalog is too big to hold in your head.
What to do this month
November is when this pays for itself, because demand rises and supplier lead times stretch at the same time.
- Compute days of cover for every product using the trailing 14 days, not 28.
- Pick a free custom label, build the tier sheet, and add it as a supplemental data source.
- Exclude critical products in your Shopping product groups and Performance Max listing groups, and from your Meta prospecting product set.
- Make listing-group exclusions now. Give overstock its own budget in the next few days so learning finishes before Black Friday, or hold new campaigns and target changes until after Cyber Monday.
- Time your sync lag once, so you know how quickly a sell-out reaches the ads.
Before you raise the target on thin products, check what margin each one actually carries with the breakeven ROAS calculator. And if you want help building stock tiers into your Shopping setup, it is part of how we run Google Shopping ads.
Should I mark products out of stock to stop their ads?
No. Google advises using out_of_stock only when a product is genuinely unavailable. To stop a product showing temporarily, use the pause attribute (set to ads, or to all for no more than 14 days), or exclude it in your campaigns with a custom label, which keeps your product data accurate.
How do I exclude low-stock products from Performance Max?
Write a stock tier into a custom label in Merchant Center, then open the asset group’s listing groups, subdivide by that label, and set the low-stock value to Exclude. Update the label weekly from your days-of-cover calculation.
How do I filter a Meta catalog by inventory?
Meta reads availability, and out-of-stock items do not show in ads. For low stock, add an internal_label holding a stock tier or a custom_number field holding days of cover, build product sets that filter on those fields, and point prospecting catalog campaigns at the filtered set.
What is a good days-of-cover threshold?
There is no universal figure. A practical starting rule compares cover to your reorder lead time: scale above twice the lead time, hold below the lead time, and exclude from prospecting at around 14 days. Adjust for your suppliers and your season.
How often should stock tiers be updated?
Weekly is enough for tiers, because days of cover moves slowly. Availability itself should update close to real time through your Shopify sync, and it is worth timing how long a sell-out takes to reach Merchant Center and Meta.
- Google Merchant Center Help: Availability [availability]
- Google Merchant Center Help: Pause [pause]
- Google Merchant Center Help: Custom label 0 to 4
- Google Ads Help: Use custom labels for Shopping ads
- Google Ads Help: Manage a Performance Max campaign with listing groups
- Google Merchant Center Help: Allow Merchant Center to update product information automatically
- Meta for Developers: Catalog fields
- Shopify Help Center: Google & YouTube
Written by Sophie Mills, performance marketing strategist. If this resonated and you want to apply it to your own account, you can Take the growth check or run a free audit.
How we research, source figures, and handle corrections: editorial policy.