Feed Optimization
The Custom Labels Playbook: Heroes, Villains, and Zombies in Your Product Catalog
How to use custom_label_0-4 for strategic campaign segmentation. The Heroes/Villains/Zombies framework, margin-based bidding, seasonal labels, and…
Custom labels are for campaigns, not for customers
Custom labels have zero effect on ad serving, search matching, or product visibility. Shoppers never see them. Google’s AI doesn’t use them for auction decisions. What they do is give you a systematic way to segment products for bidding strategy in Google Ads.
You have five labels available — custom_label_0 through custom_label_4 — each accepting one value per product, with up to 1,000 unique values per label across your account. These labels become filter dimensions in Google Ads campaign product groups, letting you set different bidding strategies for different product segments. Most accounts use zero custom labels — leaving significant optimization leverage unused.
The Heroes / Villains / Zombies framework
Heroes — top performers
Products with strong ROAS, healthy click volume, and consistent conversions. These deserve aggressive bidding and premium placement. The top 10-20% of products by revenue typically generates 60-70% of total Shopping revenue.
Label: custom_label_2: hero
Identify: ROAS ≥ target + 20% AND revenue in top quintile over last 30-90 days.
Villains — high spend, low return
Products consuming significant budget but delivering below-target ROAS. Getting clicks but not converting, or converting at a cost that doesn’t justify the spend. These need either bid reduction, landing page improvement, or removal from campaigns.
Label: custom_label_2: villain
Identify: spend ≥ threshold AND ROAS ≤ target × 0.6 over last 30-90 days.
Zombies — no traffic, no conversions
Products that exist in your feed and campaigns but get nearly zero impressions and zero clicks. Not spending money, but not earning any either. Often caused by poor category assignment, weak titles, missing GTINs, or thin data.
Label: custom_label_2: zombie
Identify: impressions < 10 or clicks = 0 over a 30-day window.
Rising Stars — promising new entrants
New arrivals with limited data but promising early signals. Need enough budget to gather signal, but guarded until they prove themselves.
Label: custom_label_2: rising_star
A practical five-label schema
| Label | Dimension | Example values | Primary use |
|---|---|---|---|
custom_label_0 | Margin tier | high_margin, mid_margin, low_margin | Set tROAS targets per margin tier. Bid more on high-margin products. |
custom_label_1 | Seasonality | evergreen, summer, winter, q4_peak | Increase budgets on seasonal products during their peak window. |
custom_label_2 | Performance tier | hero, zombie, villain, rising_star | HVZ framework — separate bidding strategies per tier. |
custom_label_3 | Price tier | under_25, 25_to_100, 100_to_500, over_500 | Adjust bids by price range — expensive products justify higher CPCs. |
custom_label_4 | Promo status | on_sale, clearance, full_price, bundle | Boost budgets during promotions; separate clearance for distinct campaigns. |
Using labels in Standard Shopping campaigns
In a Standard Shopping campaign, you segment products using product groups — subdivision filters at the campaign or ad group level. Custom labels are one of the available subdivision dimensions alongside brand, category, product type, and item ID.
Practical campaign structure:
-
Campaign 1 — Heroes / High Margin: custom_label_0 = high_margin AND custom_label_2 = hero. tROAS: aggressive. Budget: highest.
-
Campaign 2 — Rising Stars: custom_label_2 = rising_star. Maximize Clicks initially, then transition to tROAS after 30 days of data.
-
Campaign 3 — Clearance: custom_label_4 = clearance. Lower tROAS target. Goal is volume at thin margin.
-
Campaign 4 — Zombies: custom_label_2 = zombie. Very low bids, minimal budget. Gather trickle data while working on feed quality.
-
Catch-all: Everything else. Catches new products that haven’t been labeled yet.
Using labels in Performance Max
In PMax, custom labels control which products enter which asset group via product filters. Each asset group’s product filter works like a WHERE clause: show this creative to users likely to buy products matching [label criteria].
-
Asset group: Premium Heroes — high_margin AND hero. Premium creative, brand-focused headlines, lifestyle images.
-
Asset group: Sale Items — on_sale OR clearance. Price-focused creative, urgency messaging.
-
Asset group: Default — all other products. Generic brand creative as catch-all.
Without custom labels, you can only segment PMax product groups by category, brand, product type, or item ID. Custom labels give you business-logic dimensions Google’s taxonomy doesn’t have — like “high margin” or “currently on promotion.” For more on PMax asset group strategy, see Performance Max Feed Requirements.
Practical implementation
id,custom_label_0,custom_label_1,custom_label_2,custom_label_3,custom_label_4
SKU-1001,high_margin,evergreen,hero,over_500,full_price
SKU-1002,low_margin,summer,zombie,under_25,clearance
SKU-1003,mid_margin,q4_peak,rising_star,25_to_100,full_price
SKU-1004,high_margin,evergreen,villain,100_to_500,on_sale
Implementation path:
-
Export product catalog with Google Ads performance data (revenue, spend, ROAS, impressions per product ID)
-
Build classification logic and run it against performance data
-
Add margin data from ERP or pricing system for label_0
-
Output a supplemental feed with product IDs and five custom_label columns. Upload to Merchant Center.
-
Refresh labels monthly (quarterly for stable catalogs). Performance tiers change.
Common mistakes
-
Too many unique values per label. The 1,000 unique value limit is strict. Consolidate values if approaching it.
-
Labels not mapped to bidding decisions. If a label doesn’t correspond to a different strategy, it provides no value.
-
Not refreshing labels. A hero from 6 months ago may be a zombie today.
-
Confusing custom labels with product_type. Product_type = product taxonomy. Custom labels = campaign strategy. Different purposes.
-
All products sharing the same label value. Provides no segmentation value whatsoever.