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.
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.
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:
- Identity attributes — what is this product, exactly?
gtin,mpn,brand,identifier_exists. - Categorization attributes — where does it live in Google’s taxonomy?
google_product_category,product_type. - Variant attributes — how does it differ from its siblings?
color,size,material,pattern,age_group,gender. - 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.
additional_image_link. identifier_exists: false rather than leaving it blank. Apparel > Outerwear > Fleece > Quarter-Zip. depth helps — 4-5 levels is the sweet spot. in_stock, out_of_stock, preorder, backorder. must be accurate within 4 hours; Google disapproves products with stale availability. preorder or backorder. ISO 8601 date. 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. new, refurbished, used. defaults to new. only relevant if you sell anything that isn't. 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.
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:
- auto-map every Shopify product, variant, and metafield to the correct Google attribute, including the ones above that nobody wires up by default;
- generate a per-product score against the full attribute spec — not just “are you valid”, but “what’s missing that would help”;
- let you write transformation rules in plain English (“for products in collection X, set
custom_label_0to ‘high-margin’”) that we compile and apply at feed-generation time; - flag PMAX-specific issues — variant pooling gaps, GTIN inconsistency, taxonomy mismatches — and queue fixes for human approval.
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.)