Template

Custom label template for Google Shopping

Google gives you five custom label attributes and no advice on how to spend them. This template assigns a job to each slot (price band, margin, performance, seasonality, stock risk), fixes the value vocabulary so campaigns can be split on it, and shows the rule that fills each label from your catalog without a spreadsheet. It also covers the one thing the ranking articles skip: which labels need data the feed does not carry.

We connect your store, build the feed and keep it in sync. Updated 2026-10-27.

At a glance

  • custom_label_0 to custom_label_4: five optional attributes, max 100 characters each, up to 1,000 unique values per label and 5,000 across all five. Values are not shown to shoppers.
  • They exist to subdivide products in Shopping, Performance Max and Demand Gen campaigns for bidding and reporting. Choose values you would actually bid differently on.
  • Assign one job per slot and keep it stable: 0 price band, 1 margin, 2 performance, 3 season or campaign, 4 stock or lead time. Renaming a slot resets campaign history.
  • Labels derived from the catalog (price, stock, category, newness) are rules, and so is a margin band when cost is in the catalog. Sales-based labels, and margin without a cost column, need a merged sheet.

The custom label template: one job per slot

Google's own examples for custom labels are season, selling rate, price range, margin and release year. The template below turns those into five fixed slots with a closed vocabulary, so a campaign built on 'custom_label_0 = 50-99' still works next quarter. Keep values lowercase ASCII; Google compares them case-insensitively but your reports will not.

AttributeJobVocabularySource
custom_label_0Price band0-19, 20-49, 50-99, 100-plusprice, by rule
custom_label_1Margin bandmargin-low, margin-mid, margin-highcost column or merged sheet
custom_label_2Performancebestseller, steady, slow, no-salessales export merged by SKU
custom_label_3Season or campaignspring-26, summer-26, evergreen, black-fridaycategory or tag, by rule
custom_label_4Stock and lead timein-stock-fast, low-stock, made-to-order, clearancestock and lead-time columns, by rule

Limits from Google's custom_label attribute specification, checked 2026-10-27: 100 characters, 1,000 unique values per label, 5,000 in total; values beyond the limit are ignored for bidding and reporting.

Which labels a feed rule can fill, and which it cannot

Anything that is already a column, or can be derived from one, is a rule: a price band from price, a stock label from quantity and lead time, a season from category or tag, newness from a created date. These update on every sync with no human in the loop.

Margin and performance are different. Your store export rarely carries cost, and it never carries last month's sales. (When it does carry cost, the margin band is a rule too: calc{} can divide price minus cost by price.) Those come from a second file (a cost sheet from finance, a sales export from the store or Google Ads) joined onto the catalog by SKU. In Textfinity that join is a merged source; once the sheet is joined, the margin column maps to custom_label_1 like any other attribute, and the sheet's owner refreshes it on their own schedule.

Price bands need numbers, and Textfinity's advanced expressions have them: calc{[price]} reads the first number in the price ("29.00 USD" becomes 29), and nested if/else compares it against each breakpoint. Uneven breakpoints cost nothing extra; change the numbers in the expression.

Advanced rule on custom_label_0 (price band)

if calc{[price]} < 20 then "0-19"
else if calc{[price]} < 50 then "20-49"
else if calc{[price]} < 100 then "50-99"
else "100-plus"

Filling custom labels in Merchant Center versus in the feed

Merchant Center can also set custom labels with attribute rules ('Set to' with a condition, which needs the Advanced data source management add-on) or with a supplemental Google Sheet keyed on id. Both work, and both put the logic somewhere only one person can see. Filling the labels in the feed tool keeps every rule next to the title and filter rules, versioned with the feed, and makes the same labels available to Meta and Microsoft feeds, where the attribute is spelled the same way.

The practical split most stores land on: rule-based labels (0, 3, 4) in the feed tool; data-based labels (1, 2) from a merged sheet in the feed tool; nothing in Merchant Center except a reporting view. If you already have labels in Merchant Center rules, move them one slot at a time and check the campaign filters still match.

Custom label values that cause trouble

Four patterns waste the five slots. Free-text values ('Summer sale 2026!!') blow past the 1,000-unique-value cap once someone types variants. Values that duplicate an existing attribute (brand, product_type, google_product_category) are already available for campaign subdivision and cost a slot for nothing. Numeric bands with overlapping edges ('0-50' and '50-100') put $50 products in both or neither depending on the rule order. And labels that change meaning ('label 2 was performance, now it is color') break every campaign filter silently.

Textfinity's feed hygiene profile shows the value distribution per column, so after the first build you can see that custom_label_0 has five values and custom_label_2 has 400 before Google starts ignoring the extras.

Examples

Worked examples, by situation

Three catalogs, three label schemes, and the rule or merged sheet behind each.

Fashion · Performance Max · 2,400 SKUs · CSV export with a tags column

Season and clearance from tags, price band from price

Before

id,price,tags
TEE-ORG-M,29.00 USD,"organic,basics,spring-26"
COAT-WL-L,189.00 USD,"outerwear,clearance"

After

id,custom_label_0,custom_label_3,custom_label_4
TEE-ORG-M,20-49,spring-26,in-stock-fast
COAT-WL-L,100-plus,evergreen,clearance

How we set it up

We fill custom_label_3 with a conditional rule: if [tags] includes "spring-26" then static "spring-26" else "evergreen". custom_label_4 gets if [tags] includes "clearance" then "clearance" else "in-stock-fast", and custom_label_0 the price-band expression above.

Furniture · Google Shopping · 600 SKUs · WooCommerce XML · 8-week lead times

Stock and lead-time label from two source columns

Before

id,stock,lead_time_weeks
OAK-DESK-120,0,8
OAK-CHAIR-01,14,0

After

id,custom_label_4
OAK-DESK-120,made-to-order
OAK-CHAIR-01,in-stock-fast

How we set it up

We map custom_label_4 with an advanced rule: if calc{[stock]} > 0 then "in-stock-fast" else if calc{[lead_time_weeks]} > 0 then "made-to-order" else "out". Then bid down made-to-order in the campaign rather than excluding it.

Electronics · Shopping + Microsoft · 3,000 SKUs · margin and sales from finance

Margin and performance labels from a merged sheet

finance sheet joined on sku (Merged sources)

sku,margin_band,units_90d
SL-ANC-1,margin-high,412
SL-EB-2,margin-low,3
SL-SPK-7,margin-mid,0

How we set it up

We join the finance sheet as a merged source keyed on sku, map custom_label_1 as a rename of margin_band, and custom_label_2 as an advanced rule: if calc{[units_90d]} == 0 then "no-sales" else if calc{[units_90d]} >= 100 then "bestseller" else "steady". Every sku needs a row in the sheet (0 for no sales), because an advanced rule fails on a product the merged source does not match. The same labels flow into the Microsoft Shopping feed.

Copy this plan

Fill all five labels in one sitting

Thirty minutes of rule work once the catalog is connected. Steps one and two are your decisions; the rest are rules we write.

  1. 01

    Write the five jobs and vocabularies down

    Copy the template table, change the bands to match your price points, and agree the vocabulary with whoever runs the campaigns. Do not start rules until this is fixed.

  2. 02

    Find the source for each label

    Price, stock, lead time, category, tags and created date are in the catalog. Margin and sales are not; ask finance or export them from the store or Google Ads into a Google Sheet keyed on SKU.

  3. 03

    Join the external data

    Add the margin and sales sheet as a merged source so its columns appear next to the catalog's. Refresh it on whatever cadence finance can keep.

    What we set up: We add your Google Sheet as a merged source joined on sku.
  4. 04

    Write the rule for each slot

    Static values with conditions for tags, the advanced DSL for price bands and two-column logic, rename for the merged margin column. Keep the 'otherwise' value explicit so no product is unlabeled.

    What we set up: We write custom_label_0 to custom_label_4 as static values with conditions, advanced expressions or renames, each with an explicit fallback value.
  5. 05

    Check the value counts, then publish

    Each label should show a handful of values, not hundreds. Then rebuild and let Merchant Center fetch; the campaign filters can be built on the new values the next day.

    What we set up: We check each label's value distribution in feed hygiene, then add the feed URL to your Merchant Center as a scheduled fetch, with your access or walking you through it.

Customization tips

Make it yours

Spend slot 0 on the label you will split budgets by

Reports sort by label number. Put the dimension you look at every week in custom_label_0 and the experimental one in custom_label_4, so a future reshuffle only touches the last slot.

Price bands should follow your price points, not round numbers

If 80% of products sit between $20 and $60, bands of 0-19, 20-39, 40-59 and 60-plus split budgets usefully; 0-49 and 50-99 do not. The breakpoints in the expression take a minute to adjust.

Prefer 'no-sales' to a blank performance label

A blank value disappears from campaign filters and reporting. An explicit 'no-sales' or 'unknown' value lets you build a discovery campaign for exactly those products.

Reuse the labels on Meta and Microsoft

Both accept custom_label_0 to 4 with the same spelling. In Textfinity the rules live on each feed, so copy them across once and all three channels segment identically.

FAQ

Questions about custom label template google shopping

What are custom labels in Google Shopping?

Five optional feed attributes, custom_label_0 to custom_label_4, that you fill with your own values (season, price band, margin, performance) to subdivide products in Shopping, Performance Max and Demand Gen campaigns for bidding and reporting. Shoppers never see them.

What are the limits on custom label values?

Each value can be up to 100 characters. Google allows 1,000 unique values per label and 5,000 across all five; values beyond those limits are ignored for bidding and reporting. Values are compared case-insensitively.

What should I put in custom_label_0?

The dimension you split budgets by most often. For most stores that is a price band (0-19, 20-49, 50-99, 100-plus) because it can be filled by rule from the price and never goes stale. Keep the vocabulary fixed so campaign filters keep matching.

Can custom labels be set automatically?

Yes, for anything derived from catalog columns: price bands, stock and lead-time flags, season from category or tag, newness from a date. A feed tool fills them on every sync. Sales labels, and margin labels when the catalog has no cost column, need an external sheet joined onto the catalog by SKU.

Should I set custom labels in Merchant Center or in the feed?

In the feed, if you use a feed tool. The rules then sit next to your title and filter rules and the same labels reach Meta and Microsoft feeds. Merchant Center attribute rules work too but require the Advanced data source management add-on and only apply to Google.

Set up for you

Have all five custom labels filled from your catalog.

Send us your catalog and the dimensions your campaigns split on. We write the rules for price band, season and stock and join your margin sheet for the rest; every label updates on the next sync.

Have us set up your labelsOr email support@textfinity.io

Tell us your store and channels. We reply within 24 hours.