Guide

Google Shopping custom labels

Custom labels are five feed attributes, custom_label_0 to custom_label_4, that you fill with your own values so campaigns can bid on groups Google does not know about: margin, season, bestsellers, price bands. Most guides list the ideas and stop. Below is each scheme with its value vocabulary, where the data comes from, and the exact rule that sets it on every product, plus the one label a feed cannot compute on its own.

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

At a glance

  • Five optional attributes, custom_label_0 to 4: one value per product, up to 100 characters, case-insensitive, never shown to shoppers.
  • Google counts up to 1,000 unique values per label; values over the limit are ignored for reporting and bidding.
  • They subdivide products in Shopping, Performance Max and Demand Gen campaigns. Pick values you would bid differently on, and keep the vocabulary fixed.
  • Price band, season and stock labels can be derived from the catalog by rule. Margin and bestseller labels need cost or sales data joined from a sheet.

What Google Shopping custom labels do

Google already lets you split campaigns by brand, category, product type, condition and item id. Custom labels add the dimensions only you know: which products earn the most, which are seasonal, which sell fastest. Google's own examples are season, selling rate, price range, margin and release year.

The labels do nothing on their own. They pay off when a campaign uses them: a Performance Max listing group per margin band, a Shopping product group for bestsellers with a higher target, a seasonal campaign that only includes summer-26 items. If no one will build a campaign on a label, the slot is better left free.

SlotSchemeVocabularyData source
custom_label_0Price band0-19, 20-49, 50-99, 100-249, 250-plusprice column, by rule
custom_label_1Marginmargin-low, margin-mid, margin-highfinance sheet, merged by SKU
custom_label_2Bestsellerbestseller, steady, no-salessales export, merged by SKU
custom_label_3Seasonsummer-26, winter-26, evergreentags or category, by rule
custom_label_4Stocklow-stock, clearance, in-stockinventory and tags, by rule

The same slot assignment as our custom label template, so the two pages stay consistent.

Price band label: a regex per band

Textfinity's conditional mapping compares text: is equal to, includes, is in list, is in google sheet list, matches regexp. So a conditional price band matches the price string with a regular expression, one branch per band, and the else branch catches the top band; map from a price column without the currency suffix. The advanced transform compares numbers instead, in one expression: if calc{[price]} < 20 then "0-19" else if calc{[price]} < 50 then "20-49" else if calc{[price]} < 100 then "50-99" else if calc{[price]} < 250 then "100-249" else "250-plus". The price column must not be blank for that.

custom_label_0: add static value, with conditions

if    [price] matches regexp ^1?[0-9](\.[0-9]+)?$  → "0-19"
else if [price] matches regexp ^[2-4][0-9](\.[0-9]+)?$ → "20-49"
else if [price] matches regexp ^[5-9][0-9](\.[0-9]+)?$ → "50-99"
else if [price] matches regexp ^(1[0-9]{2}|2[0-4][0-9])(\.[0-9]+)?$
                                                → "100-249"
else                                            → "250-plus"

Margin and bestseller labels: data the feed does not have

A store export carries price but rarely cost, and never last quarter's sales. No rule can produce a margin or bestseller label from data that is not there. Once cost is present on every row (a blank cost fails the rule), the advanced transform can compute the margin: if calc{([price] - [cost]) / [price]} > 0.4 then "margin-high" else "margin-standard". Sales data, and cost when the store does not export it, has to arrive from outside: a Google Sheet that finance keeps, or a sales export, joined onto the catalog by SKU as a merged source (with a row for every product, since an advanced rule fails on a product the sheet does not match), or kept as a list of SKUs the rule checks against.

Two patterns work. If the sheet already holds the band (margin_band = margin-high), rename that column into custom_label_1. If someone maintains SKU lists instead, check membership with is in google sheet list. Either way, the sheet's owner refreshes it on their schedule and the next sync picks it up.

custom_label_2: add static value, with conditions

if    [sku] is in google sheet list "Bestsellers 90d" → "bestseller"
else if [units_90d] is equal to "0"                   → "no-sales"
else                                                → "steady"

custom_label_1 → rename [margin_band]   (merged finance sheet)

Season and stock labels from tags, category and inventory

Seasonality usually already exists as a tag, a collection or a category path. A regex over tags catches several spellings at once; the else branch labels everything else evergreen, so no product drops out of a seasonal split. Stock labels combine a tag for clearance with a regex on the inventory count for low stock. Change the season vocabulary at the start of each season, not mid-campaign.

custom_label_3 and custom_label_4 rules

custom_label_3:
if    [tags] matches regexp (?i).*\b(summer-26|swim|beach)\b → "summer-26"
else if [tags] includes "winter-26"                            → "winter-26"
else                                                         → "evergreen"

custom_label_4:
if    [tags] includes "clearance"           → "clearance"
else if [inventory] matches regexp ^[1-5]$ → "low-stock"
else                                    → "in-stock"

Custom labels in Merchant Center or in the feed

Merchant Center can set labels too, with attribute rules (needs the Advanced data source management add-on) or a supplemental sheet keyed on id. That is fine for one label on Google only. Setting them in the feed keeps the rules next to your titles and filters, lets you check each product's value before Google fetches the file, and sends the same labels to Meta and Microsoft, which use the same attribute names. Margin from a cost column works in both places: a Calculate rule in Merchant Center, an advanced expression in the feed.

Examples

Worked examples, by situation

Four stores, four schemes. Each before shows the source columns; each after shows the labels the rule wrote.

Fashion · Performance Max · 2,400 variants · WooCommerce tags

Season label from tags, with an evergreen fallback

Before

id,tags
TEE-ORG-M,"basics,Swim,summer-26"
COAT-WL-L,"outerwear,winter-26"
SOCK-3PK,basics

After

id,custom_label_3
TEE-ORG-M,summer-26
COAT-WL-L,winter-26
SOCK-3PK,evergreen

How we set it up

We set custom_label_3 as a static value with conditions: matches regexp (?i).*\b(summer-26|swim|beach)\b (mapping conditions match from the start of the value, hence the leading .*), then includes "winter-26", else evergreen. A summer PMax campaign includes only summer-26 in its listing group.

Electronics · Google Shopping and Microsoft · 3,000 SKUs · finance sheet

Margin bands the finance team owns

Before

catalog: id,price
SL-ANC-1,199.00
finance sheet: sku,margin_band
SL-ANC-1,margin-high

After

id,custom_label_1
SL-ANC-1,margin-high

How we set it up

We join the finance team's Google Sheet as a merged source on sku and map custom_label_1 as a rename of margin_band. Microsoft's feed gets the same rule, so both channels bid on the same bands.

Home goods · Google Shopping · 6,000 SKUs · WooCommerce CSV

Price bands that follow the store's price points

Before

id,price
PLATE-4,34.00
LAMP-OAK,129.00
RUG-240,389.00

After

id,custom_label_0
PLATE-4,20-49
LAMP-OAK,100-249
RUG-240,250-plus

How we set it up

We set custom_label_0 as a static value with one matches regexp condition per band, else 250-plus. If most products sit between 20 and 60, we split that range into two bands instead of using round numbers.

Sporting goods · Shopping and Meta Advantage+ · 900 SKUs · weekly sales export

Bestsellers from a sales export, and a feed for them alone

custom_label_2 rule, then a second feed's filter

custom_label_2:
  if [sku] is in google sheet list "Bestsellers 90d" → "bestseller"
  else if [units_90d] is equal to "0" → "no-sales"
  else → "steady"

Meta feed filter: include if [sku] is in google sheet list "Bestsellers 90d"

How we set it up

We join the sales export as a merged source on sku and read the bestseller list from a one-column sheet. The Meta feed uses the same sheet as an include filter, so its catalog only carries the products Google labels bestseller.

Copy this plan

Plan: four custom labels live by tomorrow

Decide first, then build. The campaign side happens in Google Ads.

  1. 01

    Decide the schemes and vocabularies

    Write down which label sits in which slot and the exact values. Agree them with whoever runs campaigns; renaming a value later breaks their product groups.

  2. 02

    Bring in cost and sales data

    Put margin bands and the bestseller SKU list in a Google Sheet keyed on SKU and add it as a merged source. Skip this step if you only need price, season and stock labels.

    What we set up: We add your sheet as a merged source joined on sku, so the bands and lists stay in a file your team already edits.
  3. 03

    Write one rule per label

    Conditional static values for price band, season and bestseller; rename for a sheet column that already holds the band; advanced DSL for two-column logic. Always set an else value.

    What we set up: We write custom_label_0 to custom_label_4 as conditional static values, a rename of the sheet's band column, or an advanced expression, each with an explicit else value.
  4. 04

    Check the values

    Open a few products from each band in the product explorer, and confirm each label has a handful of values, not hundreds.

    What we set up: We check sample products from each band in the product explorer and run feed hygiene's value consistency and outlier checks on every label column.
  5. 05

    Publish and build the campaigns

    Merchant Center fetches the feed; labels can take a while to show in Google Ads. Then subdivide listing groups or product groups by label there.

    What we set up: We register the feed URL in your Merchant Center as a scheduled fetch, with access you give us or on a short call with you.

Customization tips

Make it yours

Fewer values beat finer ones

Three margin bands with enough conversions each let bidding learn; ten bands split the data too thin. Add a band only when you would set a different target for it.

Never leave a label blank

Products without a value vanish from label-based product groups. An explicit else value (evergreen, steady, in-stock) keeps every product in some group and makes gaps visible in reports.

Don't spend a slot on what Google already has

Brand, product type, category, condition and item id are already available for subdivision. Copying them into a custom label wastes one of only five slots.

Season labels need a calendar

A label that still says summer-26 in November keeps winter campaigns from picking the products up. Put the vocabulary change on the calendar for the first week of each season.

FAQ

Questions about google shopping custom labels

How many custom labels can I use in Google Shopping?

Five: custom_label_0 to custom_label_4. Each product can have one value per label, up to 100 characters. Google counts up to 1,000 unique values per label; values over the limit are not used for reporting or bidding.

Do custom labels work with Performance Max?

Yes. Custom labels can subdivide listing groups in Performance Max as well as product groups in Standard Shopping and products in Demand Gen campaigns, so one feed can drive separate targets per margin band or season.

Are custom labels visible to shoppers?

No. Google states that custom label values are not shown to customers. You can use internal words such as margin-high or no-sales without affecting the ad.

Can custom labels be set automatically from price?

Yes. In Merchant Center with an attribute rule per band, or in the feed with a conditional rule per band. In Textfinity each band is either a matches regexp condition on the price string or a branch of one advanced expression that compares calc{[price]} with the band limits.

How do I create a margin custom label?

You need cost data. Either compute the band in a spreadsheet and join it to the feed by SKU, then map that column to a custom label, or, if cost is already in the catalog and filled on every row, compute it in the feed with an advanced expression such as if calc{([price] - [cost]) / [price]} > 0.4 then "margin-high" else "margin-standard". A Merchant Center Calculate rule works too.

Set up for you

We'll fill your five custom labels from your catalog and your sheets.

Tell us which labels your campaigns need and share the finance sheet. We join it to the catalog, write one rule per label and check every value before Google fetches the feed.

Have us set up my custom labelsOr email support@textfinity.io

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