← All field notes
PMAX & Google April 28, 2026 14 min read

How to win Performance Max in 2026: every attribute, every score, no shortcuts .

Performance Max is a black box. but it has one consistent input that determines whether you spend efficiently or set money on fire: the depth and quality of the catalog you give it. here's the complete checklist of what PMAX actually rewards — required, recommended, and the ones nobody tells you about.

— Each cell is one PMAX-eligible product attribute. Most stores fill ~40% of them.

Most Shopify stores ship a Google Merchant Center feed with eight or nine fields filled in. id, title, description, price, image_link, availability, brand, maybe gtin. that’s enough to pass validation and start spending. it is not enough to win.

PMAX is an auction algorithm with one job: predict the lifetime value of a click. it does that with two inputs — your conversion data and your catalog data. the catalog isn’t just what gets shown; it’s what gets understood. when you leave attributes blank, you’re handing PMAX a partial picture of what you sell, and it will price your auctions accordingly.

”my feed validates” is the lowest possible bar. validation is the legal minimum. it has nothing to do with performance.

The three tiers of PMAX attributes

Google publishes a specification with three levels: required, recommended, optional. but those labels are misleading. in practice, there’s a different hierarchy that actually predicts performance, and it goes:

  1. Identity attributes — what is this product, exactly? gtin, mpn, brand, identifier_exists.
  2. Categorization attributes — where does it live in Google’s taxonomy? google_product_category, product_type.
  3. Variant attributes — how does it differ from its siblings? color, size, material, pattern, age_group, gender.
  4. Behavioral attributes — what does it cost to fulfill, who’s it for? shipping, tax, shipping_weight, multipack, is_bundle.

Tiers 1 and 2 get you into the auction. tiers 3 and 4 are what determine whether PMAX bids confidently — and confident bids are how you outrank the brand next to you.

The complete attribute checklist

Below is the full list of PMAX-relevant attributes for a typical apparel or consumer-goods Shopify store. the “Tier” column is our internal weighting based on what we’ve seen actually move spend efficiency, not Google’s official labels.

Attribute
Tier
What it does
id
Required
unique product identifier. most stores get this wrong by reusing the same id across variants — they shouldn't. each variant is a unique offer.
title
Required
the single most-weighted text field. 150 char limit, but Google reads roughly the first 70. front-load the brand, the category, and the differentiating attribute. "Patagonia Better Sweater Fleece Jacket — Men's, Forest Green" beats "Better Sweater" by 3-4× CTR.
description
Required
5,000 char limit. Google parses this for query expansion. do not paste your storefront copy — that copy is written for humans browsing. write a separate description that includes synonyms, use-cases, materials, fit notes.
image_link
Required
primary product image. white-background plain product shots outperform lifestyle shots in PMAX. lifestyle goes in additional_image_link.
additional_image_link
High impact
up to 10 alternate images. PMAX uses these to assemble responsive ads across YouTube, Discover, and Display. stores that fill 6+ here see meaningfully better placement diversity.
gtin
High impact
universal product code (UPC, EAN, ISBN). products with valid GTINs win 20-30% more impressions on the same query — Google trusts them more. for in-house brands without a GTIN, fill identifier_exists: false rather than leaving it blank.
brand
Required
manufacturer name. for private-label, use your own brand. consistency matters: "Patagonia" and "patagonia" and "Patagonia, Inc." get treated as three different brands.
google_product_category
High impact
Google's product taxonomy ID. drives auction eligibility for category-specific surfaces. Shopify's auto-mapping is wrong about 35% of the time. manually verify against the Google taxonomy CSV.
product_type
High impact
your own taxonomy. used by PMAX to build asset groups and listing groups. format: Apparel > Outerwear > Fleece > Quarter-Zip. depth helps — 4-5 levels is the sweet spot.
availability
Required
in_stock, out_of_stock, preorder, backorder. must be accurate within 4 hours; Google disapproves products with stale availability.
availability_date
Edge
required if availability is preorder or backorder. ISO 8601 date.
price
Required
currency-tagged. must match landing page within tight tolerance — 2% drift will trigger price-mismatch warnings.
sale_price + sale_price_effective_date
High impact
strike-through pricing in the auction listing. scheduled with effective_date — set it ahead of time so PMAX can pre-train, don't toggle live.
color, size, material, pattern
High impact
apparel/accessories table stakes. required for Apparel & Accessories category. Shopify variant options often map cleanly here, but only if you've named them precisely — "M" not "Medium", consistent color names not "ocean" / "blue" / "navy" mixed.
item_group_id
High impact
groups variants of the same product. without this, PMAX treats each variant as a fully separate product and can't pool learnings across colors/sizes. one of the biggest leaks we see.
age_group, gender
High impact
apparel-specific. also affects which audience signals PMAX considers — leaving gender blank on a women's product means it might serve to men.
shipping
High impact
explicit shipping cost per region. can be set globally in Merchant Center, but per-product override beats global. PMAX uses this in its profitability model — undercount and it'll bid like you have free shipping.
shipping_weight, shipping_length/width/height
Edge
enables dimensional shipping calculation. matters most for furniture, bulk goods, anything with awkward shipping economics.
tax
Edge
US-only, per-state. only set if your tax handling differs from your account-level default.
custom_label_0 — custom_label_4
Operational
5 free-text bucketing fields. invisible to shoppers, used for bidding strategy. typical use: custom_label_0 = margin tier (high/mid/low), custom_label_1 = best-seller flag, custom_label_2 = inventory depth. then build PMAX asset groups around these.
promotion_id
Edge
links a product to a Merchant Center promotion. enables the "Special offer" badge in shopping ads, which lifts CTR 10-15%.
product_highlight
Edge
3-10 short bullets shown in some shopping placements. most stores skip this; it's a free differentiator on premium-priced items.
multipack, is_bundle
Edge
for retailers selling multi-unit SKUs (a 6-pack of socks vs a single pair). without these, Google can't compute per-unit price and your bundles look overpriced in auctions.
condition
Edge
new, refurbished, used. defaults to new. only relevant if you sell anything that isn't.
energy_efficiency_class
Edge
EU regulatory requirement for appliances and electronics sold in the EU.
i
Reality check

This is 24 attributes. a typical Shopify store fed by the native Google & YouTube channel app fills 9–11 of them. that’s not a Shopify problem — Shopify exposes the data — it’s that nobody bothered to map it. that gap is where PMAX efficiency comes from.

The attributes nobody talks about (but PMAX uses)

1. Custom labels are not optional. they’re how you bid.

Custom labels are the only way to slice your catalog inside PMAX without splitting it into separate campaigns. once you have custom_label_0 = margin tier, you can build a listing group filter that excludes low-margin SKUs, or a separate asset group that bids harder on high-margin ones. without custom labels, PMAX treats every product as equally valuable, which means it’ll happily spend your tROAS budget on your worst-margin items.

2. item_group_id is variant pooling.

If you sell a t-shirt in 6 colors and 4 sizes, that’s 24 variants. with item_group_id set, PMAX learns from all 24 as one product family — what works for Color A’s L size informs Color B’s M. without it, the algorithm has to learn 24 separate products from scratch, and most variants never get enough impressions to learn from at all.

3. identifier_exists: false beats a missing GTIN.

If you don’t have a GTIN — common for private label, custom goods, or older inventory — explicitly setting identifier_exists: false tells Google “this is intentional, I’m a brand, treat me as such.” leaving the field blank, by contrast, gets read as “this product is missing data” and the auction priority drops accordingly.

4. shipping per-product overrides global.

Most stores set shipping at the account level and never touch the per-product field. but if you have heavy items that cost more to ship, or items where you eat shipping for margin reasons, the global rate is wrong. PMAX uses your declared shipping cost in its tROAS math; lying to it (intentionally or not) means it bids based on a profitability model that doesn’t match yours.

If you can name what every custom_label in your feed means and why, you’re in the top 5% of PMAX advertisers. most people set them once during onboarding and never touch them.

How Maximo handles all of this

I’m going to be direct about this section because there’s no point being coy: this is what we built Maximo to solve.

Shopify’s native Google channel fills the required fields and walks away. Feedonomics handles all of this and more, but they’re an enterprise-priced agency-style relationship — you don’t just turn it on. the gap in the middle — for a Shopify store doing $5–50M ARR that wants the depth of a real feed without an agency on retainer — is what Maximo sits in.

Specifically, on the catalog side, we:

And on the tracking side — because this matters just as much for PMAX — we send first-party events with the same SKU IDs that appear in your catalog, so PMAX’s conversion data and catalog data actually agree on what a product is. (we wrote about why catalog-event ID drift kills match quality separately.)