The Feedance AI features is rolling out.
Check it out!

Custom Labels, Product Type or Item ID: How to Split Performance Max Listing Groups

A Performance Max asset group can hold up to 1,000 listing groups, and Google's own help page warns that a large number of them is not a best practice. Meanwhile each of the five custom_label attributes accepts at most 1,000 unique values, 100 characters each. Both limits are generous, which is why most accounts hit the real constraint first: nobody decided which feed attribute should carry which kind of split.

This guide is for feed managers and paid media leads who build or inherit Performance Max structures on Merchant Center data. By the end you will be able to choose between custom_label, product_type, brand, category and item ID for each level of a listing group tree, score your options with a short rubric, and avoid the failure cases that make a tree silently stop matching products.

The dimensions you can actually split on

Google's Performance Max documentation lists the attributes a listing group can subdivide by: category, brand, item ID, condition, product type, channel and custom labels. In the Google Ads API these map to the product dimension types, with custom labels exposed as the custom attribute dimension. Condition and channel rarely carry strategy, so the table below covers the five that do.

DimensionFeed attributeDocumented limitBest used forBreaks when
Custom labelcustom_label_0 to custom_label_41 value per product, 1-100 characters, 1,000 unique values per attributeAnything you define: margin tier, stock depth, season, price bandValues drift, are mistyped, or exceed 1,000 uniques
Product typeproduct_typeUp to 750 characters; subdivides up to 5 levelsYour own category hierarchyTaxonomy is inconsistent across suppliers or languages
BrandbrandManufacturer nameMulti-brand stores, brand-vs-generic strategyBrand values are spelled several ways
Categorygoogle_product_categoryGoogle taxonomy; subdivision available only in listed countries, which include TurkeyCross-merchant comparisons, broad splitsYour market is not on the supported list
Item IDid1-50 characters, must stay stableA handful of hero productsUsed at scale, or IDs change

Sources for every row: the Performance Max listing group help page, the custom label specification, the product type specification and the item ID specification.

When custom labels are the right dimension

Use a custom label when the split reflects a business decision that does not exist in any standard attribute. Google's own examples are season, selling rate, price range, margin and release year, and its listing group page states: "We recommend you use custom labels to group items, and then target those labels in listing groups."

Three conditions make a custom label worth the effort. The value must change what you do with the group, for example giving a high-margin tier its own asset group and creative. The value must be computable from data you already hold, because a label nobody can maintain goes stale. And the value set must be small and closed, which keeps you far from the 1,000-unique ceiling and keeps your tree readable.

Values must be a single entry per product. Google states that labels beyond the 1,000-unique limit are ignored for reporting and bidding, and products that break the requirements are disapproved. Labels are not case sensitive and Unicode is allowed, but ASCII is recommended. For Turkish catalogs that means writing margin_high rather than a Turkish-language value with characters such as ı or ş, which keeps the same label identical across exports, spreadsheets and rule engines.

You can generate labels without a third-party tool. The same specification notes that feed rules can assign labels automatically from existing product data, such as a price range from the price field. If your inputs live outside the feed, for instance sales rank or margin, a rules layer such as Feedance feed rules or behavior data through GA4 enrichment can write them into a label column before the feed reaches Google Merchant Center.

When product type is the right dimension

Choose product_type when the split is "what the product is" in your own vocabulary. It accepts up to 750 characters, uses ">" with a space on each side to express hierarchy (Google's example is Home > Women > Dresses > Maxi Dresses), and you can submit it up to five times, but only the first value is used for bidding and reporting in Shopping. Submit one.

It wins over custom labels when your site taxonomy is already clean, because the data exists, needs no maintenance and mirrors how merchandisers think. It loses when the hierarchy differs by supplier feed, or when one marketing idea cuts across categories, such as "clearance" or "new this season". Those are custom label jobs.

When brand, category or item ID is the right dimension

Brand is the right first split for multi-brand retailers who treat their own label and third-party brands differently. Its failure mode is dirty data: "Nike", "NIKE" and "Nike Inc." become three branches.

Category (google_product_category) is useful as a coarse split, but Google states that category subdivision is available only in a list of countries. Turkey is on that list; the UAE and Saudi Arabia are not named, so check the help page for your target country before designing around it.

Item ID is the narrowest dimension. The Google Ads API documentation recommends grouping by dimensions such as custom labels or brand rather than targeting individual item IDs in Performance Max, and Google's item ID specification says that once assigned, an ID should not be changed because that can lose the product's performance history. Reserve item ID for a short list of hero products you want isolated, and treat each one as a deliberate exception.

Worked example: a Turkish outerwear store

The rows below are illustrative, not client data. The store sells in TRY and wants three outcomes: separate creative for high-margin products, a way to stop pushing products with thin stock, and a clean report by price band.

idproduct_typepricecustom_label_0 (margin)custom_label_1 (stock)custom_label_2 (price band)
TR-1001Home > Outerwear > Parkas4299.00 TRYmargin_highstock_deepprice_3000_plus
TR-1002Home > Outerwear > Trench Coats2150.00 TRYmargin_midstock_thinprice_1500_3000
TR-1003Home > Outerwear > Vests890.00 TRYmargin_lowstock_deepprice_under_1500

Here is the resulting listing group design for one asset group:

  1. Level 1 subdivides by custom_label_0: margin_high, margin_mid, and an "Everything else" node. High margin gets its own asset group with its own creative.
  2. Within margin_high, level 2 subdivides by custom_label_1: stock_deep, and an "Everything else" node that catches stock_thin and any missing value.
  3. Price band stays out of the tree and is read from the product-level report, because splitting on it would multiply groups without changing a decision.

Three things to notice. First, every subdivision needs a node representing "Other": the Google Ads API documentation states that each subdivision must be completely partitioned. Second, sibling nodes must share one dimension type, so one level cannot mix a margin label with a brand. Third, the tree uses two labels for structure and a third only for reporting, which is the discipline that keeps the group count low.

Score each option before you commit

For each candidate dimension, score the four criteria below from 0 to 2. A total of 7 or 8 means use it as a tree level. A total of 4 to 6 means use it for reporting only. A total of 3 or less means leave it out.

Criterion0 points1 point2 points
Decision valueNo action changes between valuesChanges reporting onlyChanges creative, exclusion or structure
Data qualityInconsistent or manualMostly consistent, some cleanupGenerated by rule, validated
CardinalityHundreds of valuesDozensFewer than ten
StabilityChanges daily per productChanges weeklyChanges rarely

Applied to the outerwear example: margin tier and stock depth score 7 or 8 as custom labels, product_type level 1 scores 7 where the taxonomy is clean, and item ID scores 3 or below for everything except a few hero products.

Pre-launch checklist

  • One value per label per product. No comma-separated lists.
  • All values ASCII, lowercase and underscore-separated, with no trailing spaces.
  • Unique values per label well under 1,000, and listing groups per asset group well under 1,000.
  • An "Everything else" node on every subdivision.
  • Labels added or changed in Merchant Center are given 24 to 48 hours before use. Google's product group documentation says to "allow 24-48 hours for them to be available for use in Google Ads product groups".
  • No item ID changes for products you have isolated by ID.

Where this method breaks down

This guide covers structure, not bidding. In Performance Max, bidding is handled by Google's systems against the campaign objective, and Feedance does not manage bids. Listing groups also report at product level, so impressions counted in the listing groups tab can differ from the campaign-level count, as Google notes.

It also does not prove that a split improves return. To judge that, use a controlled approach such as the one in our guide to measuring a feed change against ROAS, and for routing segments to different creative see segmenting a feed for creative testing.

For a single-market store with a few hundred SKUs, Merchant Center's own rules can write the labels described here from fields already in your feed, and a feed tool adds little. If you merge many source systems with approval workflows and custom transformations, evaluate dedicated enterprise tools such as Productsup or Feedonomics alongside Feedance.

Frequently asked questions

How many custom labels can I use?

Five, numbered custom_label_0 to custom_label_4. Each is optional per product and accepts one value of 1 to 100 characters.

What happens if I exceed 1,000 unique values in one label?

Labels over the limit are ignored for reporting and bidding. Google's instruction is to reduce the number of unique labels and resubmit the product data.

Should I use product_type or custom_label for categories?

Use product_type if your hierarchy is clean, since the data already exists. Use a custom label when the segment cuts across categories, such as clearance or seasonal items.

Why is an "Everything else" node required?

The Google Ads API documentation states that each subdivision must be completely partitioned, so every subdivision needs a node that represents all remaining products.

How long until a new label is usable in Google Ads?

Google's documentation says to allow 24 to 48 hours after adding or updating custom labels in Merchant Center.

Is it safe to split by item ID?

For a small hero set, yes. At scale it is discouraged, and a changed ID can lose the product's history, so keep IDs stable.

Can I use Turkish characters in labels?

Unicode is permitted and labels are not case sensitive, but Google recommends ASCII. ASCII values avoid mismatches between systems.

Does the category dimension work in my country?

Category subdivision is available only in the countries Google lists, which include Turkey. Check the Performance Max listing group help page for your target market.

Check your labels against your feed

Before you rebuild a tree, find out whether your feed actually carries clean, single-value labels and a consistent product_type. Run your feed through the free product feed audit tool and see where the gaps are.

Prev Article
Found by Google: Why Merchant Center Lists Products You Never Submitted, and How to Control Them

Related to this topic:

Schedule your 15-minute demo now

Schedule my demo

We’ll tailor your demo to your immediate needs and answer all your questions. Get ready to see how it works!