Systems Lab

Agent skill

google-ads-shopping-campaign-structure-advisor

This skill should be used when the user asks to \"structure Shopping campaigns\", \"choose between Standard Shopping and PMax\", \"set up product group subdivisions\", \"migrate from Standard Shopping to PMax\", or mentions \"campaign priority\", \"query sculpting\", or \"Shopping campaign setup\".

activeSelf-containedInstructions only2,058 words

Filed under ABM and paid.

From Ad-Superpowers/ad-superpowers-plugin · 120 skills · 5 · pushed 2026-09-10

What it does when it runs

This skill should be used when the user asks to \"structure Shopping campaigns\", \"choose between Standard Shopping and PMax\", \"set up product group subdivisions\", \"migrate from Standard Shopping to PMax\", or mentions \"campaign priority\", \"query sculpting\", or \"Shopping campaign setup\". Do NOT use for: PMax general optimization (use performance-max-optimizer), PMax auditing (use pmax-audit-checklist), Shopping feed optimization (use shopping-feed-optimizer).

Read from the skill and the 0 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
None found.
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
No allowed-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about google-ads-shopping-campaign-structure-advisor

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/Ad-Superpowers/ad-superpowers-plugin.git /tmp/ad-superpowers-plugin
git -C /tmp/ad-superpowers-plugin sparse-checkout set "plugin/skills/google-ads-shopping-campaign-structure-advisor"
mkdir -p ~/.claude/skills/google-ads-shopping-campaign-structure-advisor
cp -R "/tmp/ad-superpowers-plugin/plugin/skills/google-ads-shopping-campaign-structure-advisor/." ~/.claude/skills/google-ads-shopping-campaign-structure-advisor/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 120 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add Ad-Superpowers/ad-superpowers-plugin
/plugin

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Reproduced in full from Ad-Superpowers/ad-superpowers-plugin/blob/9b6385d2d2d228e4dac096a1d6bc5715c04fa736/plugin/skills/google-ads-shopping-campaign-structure-advisor/SKILL.md, which is licensed MIT (repository). 2,058 words, 22 headings.

Shopping Campaign Structure Advisor

Framework for choosing and setting up the optimal Shopping campaign structure. Based on proven structures from the PPC community (SavvyRevenue, Smarter Ecommerce, Optmyzr).

Quick Decision Guide

WHICH SHOPPING STRUCTURE?
==========================

Budget?
|
+---> <$1k/mo
|   +---> PMAX RETAIL ONLY
|       +-- Not enough data for multiple campaigns
|       +-- 1-2 asset groups max
|       +-- Bid strategy: Maximize Conversion Value
|
+---> $1k-5k/mo
|   +---> PMAX RETAIL PRIMARY
|       +-- PMax Retail as main campaign
|       +-- Optional: Standard Shopping catchall (low budget)
|       +-- 2-5 asset groups per category/margin
|       +-- Bid strategy: Target ROAS (if >30 conv/mo)
|
+---> $5k-20k/mo
|   +---> CHOICE:
|       +---> Maximum control -> STANDARD SHOPPING + PMAX (split)
|       |   +-- Standard Shopping for top performers
|       |   +-- PMax for discovery + scale
|       |   +-- Product exclusions to prevent overlap
|       |
|       +---> Maximum scale -> PMAX RETAIL ONLY
|           +-- Multiple campaigns per segment
|           +-- 3-7 asset groups per campaign
|           +-- Custom labels for margin tiers
|
+---> >$20k/mo
    +---> HYBRID STRUCTURE RECOMMENDED
        +-- Standard Shopping for branded + top products
        +-- PMax Retail for non-brand discovery
        +-- Campaign-level budget control
        +-- Advanced listing group filters

7 Shopping Structures That Work

Structure 1: Single PMax Retail (All Products)

WHEN TO USE:
+-- Small product catalog (<50 products)
+-- Budget <$1k/mo
+-- New account without historical data
+-- Maximum simplicity desired

SETUP:
Campaign: PMax Retail - All Products
+-- Budget: $30-50/day
+-- Bidding: Maximize Conversion Value
+-- Asset Group 1: All Products
    +-- Listing Group: UNIT_INCLUDED (everything)
    +-- 15 headlines, 5 descriptions
    +-- 5-10 images (product + lifestyle)
    +-- Audience Signals: Website visitors + In-Market

GAQL check -- do you have enough products for PMax?

SELECT segments.product_title, metrics.impressions
FROM shopping_performance_view
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC LIMIT 100

Structure 2: PMax per Category

WHEN TO USE:
+-- 50-500 products
+-- Clear product categories
+-- Budget $1k-10k/mo
+-- Different margins per category

SETUP:
Campaign: PMax Retail - Clothing
+-- Asset Group: Men's
|   +-- Listing Group: productType L1 = "Men's"
|   +-- Signals: Men's fashion interests
+-- Asset Group: Women's
|   +-- Listing Group: productType L1 = "Women's"
|   +-- Signals: Women's fashion interests
+-- Asset Group: Kids
    +-- Listing Group: productType L1 = "Kids"
    +-- Signals: Parents

Campaign: PMax Retail - Shoes
+-- Asset Group: Sneakers
+-- Asset Group: Boots
+-- Asset Group: Sandals

Structure 3: PMax per Margin Tier (Custom Labels)

WHEN TO USE:
+-- Large spread in profit margins
+-- Goal = maximum profit (not revenue)
+-- Budget >$3k/mo
+-- Custom labels already set up in feed

SETUP:
Campaign 1: PMax - High Margin (Custom Label 0 = "high_margin")
+-- Budget: 60% of total
+-- Bidding: Target ROAS (higher target, e.g. 500%)
+-- Asset Groups: Per subcategory

Campaign 2: PMax - Standard Margin
+-- Budget: 30% of total
+-- Bidding: Target ROAS (standard, e.g. 300%)
+-- Asset Groups: Per subcategory

Campaign 3: PMax - Low Margin / Clearance
+-- Budget: 10% of total
+-- Bidding: Maximize Conversion Value
+-- Asset Groups: Per subcategory

Structure 4: Standard Shopping Priority Tiers (Query Sculpting)

WHEN TO USE:
+-- Maximum control over bidding desired
+-- Experience with Shopping campaigns
+-- Want to route specific queries to specific campaigns
+-- Budget >$5k/mo

SETUP:
Campaign A: Shopping - Brand + Top Products (Priority LOW = 0)
+-- Contains only your top 20% products
+-- NO negatives -> catches everything not caught by B/C
+-- Highest bids
+-- Bidding: Manual CPC or Enhanced CPC

Campaign B: Shopping - Category Terms (Priority MEDIUM = 1)
+-- All products
+-- Negative keywords: branded + exact product terms
+-- Medium bids
+-- Bidding: Manual CPC or Target ROAS

Campaign C: Shopping - Generic/Discovery (Priority HIGH = 2)
+-- All products
+-- Negative keywords: branded + category + product terms
+-- Lowest bids (discover new queries)
+-- Bidding: Manual CPC with low budget

HOW QUERY SCULPTING WORKS:
+-- Search query: "nike air max 90 black"
|   +-- Campaign C (priority 2): Checked first -> "nike" is negative -> SKIP
|   +-- Campaign B (priority 1): Checked -> "nike air max" is negative -> SKIP
|   +-- Campaign A (priority 0): MATCH -> Shows ad with high bid
|
+-- Search query: "men's running shoes"
|   +-- Campaign C (priority 2): -> "running shoes" is negative -> SKIP
|   +-- Campaign B (priority 1): MATCH -> Shows ad with medium bid
|   +-- Campaign A: Not reached
|
+-- Search query: "cheap sports shoes"
    +-- Campaign C (priority 2): MATCH -> Shows ad with low bid
    +-- Campaign B/A: Not reached
    +-- Result: Generic query = lower bid = discovery

Setting negatives via google_ads_mutate (Recipe #7):

operations=[
    {"campaignCriterionOperation": {"create": {
        "campaign": "customers/{CID}/campaigns/{CAMPAIGN_B_ID}",
        "negative": true,
        "keyword": {"text": "[brand name]", "matchType": "PHRASE"}
    }}},
    {"campaignCriterionOperation": {"create": {
        "campaign": "customers/{CID}/campaigns/{CAMPAIGN_C_ID}",
        "negative": true,
        "keyword": {"text": "[brand name]", "matchType": "PHRASE"}
    }}},
    {"campaignCriterionOperation": {"create": {
        "campaign": "customers/{CID}/campaigns/{CAMPAIGN_C_ID}",
        "negative": true,
        "keyword": {"text": "category term", "matchType": "PHRASE"}
    }}}
]

Structure 5: Standard Shopping (Brand) + PMax (Non-Brand)

WHEN TO USE:
+-- Brand traffic converts well and predictably
+-- Want to keep brand CPC low
+-- PMax for non-brand discovery
+-- Budget >$3k/mo

SETUP:
Campaign 1: Standard Shopping - Brand Only
+-- Priority: LOW (catches brand queries)
+-- Negative keywords: generic terms
+-- Bidding: Manual CPC (low cost for brand)
+-- Budget: 20-30% of total
+-- All products

Campaign 2: PMax Retail - Non-Brand
+-- Brand exclusions set up (Recipe #7)
+-- Asset groups per category/margin
+-- Bidding: Target ROAS or Max Conv Value
+-- Budget: 70-80% of total
+-- Focus on new customers

Structure 6: PMax (Bestsellers) + Standard Shopping (Long Tail)

WHEN TO USE:
+-- Large product catalog (500+ products)
+-- Clear top 20% products
+-- PMax works well for bestsellers
+-- Long tail products have too little data for PMax
+-- Budget >$5k/mo

SETUP:
Campaign 1: PMax Retail - Top 100 Bestsellers
+-- Custom Label: "bestseller"
+-- Asset groups: Per category (3-5)
+-- Bidding: Target ROAS
+-- Budget: 60-70% of total
+-- Regularly update which products are "bestseller"

Campaign 2: Standard Shopping - Remaining Products
+-- All products MINUS bestsellers
+-- Bidding: Enhanced CPC or Target ROAS
+-- Budget: 30-40% of total
+-- Goal: collect data, discover new bestsellers

Structure 7: Campaign Orchestration (4-Level Framework)

WHEN TO USE:
+-- Enterprise accounts (>$20k/mo)
+-- Maximum control + maximum scale
+-- Team with PPC experience
+-- 1000+ products

4-LEVEL ORCHESTRATION:
======================

Level 1: BRAND SEARCH (Standard Search)
+-- Exact match brand keywords
+-- Lowest CPA in account
+-- Protects brand against PMax

Level 2: BRANDED SHOPPING (Standard Shopping, Priority LOW)
+-- Catches branded shopping queries
+-- Manual CPC (low, brand converts)
+-- All products

Level 3: PMAX RETAIL (Performance Max)
+-- Brand exclusions active
+-- Asset groups per segment
+-- Focus on non-brand discovery
+-- Largest budget allocation (50-60%)

Level 4: GENERIC SHOPPING CATCHALL (Standard Shopping, Priority HIGH)
+-- Lowest bids
+-- Catches what PMax misses
+-- Budget: 5-10% as safety net
+-- Data discovery for new products/queries

4 Structures That DON'T Work

AVOID THESE STRUCTURES
=========================

X 1. Standard Shopping Manual Bidding + Few Products (<20)
+-- Problem: Too little data for manual optimization
+-- Result: Inconsistent performance, no learning
+-- Better: PMax Retail with 1-2 asset groups

X 2. PMax with 1 Asset Group for 500+ Products
+-- Problem: Google can't create personalized ads
+-- Result: Generic assets for all products
+-- Better: At least 3-5 asset groups per category

X 3. Overlapping PMax Campaigns Without Product Exclusions
+-- Problem: Campaigns bid against each other
+-- Result: Higher CPCs, wasted budget
+-- Better: Clear product splits via listing group filters

X 4. Standard Shopping Without Priority Setup (with multiple campaigns)
+-- Problem: Random which campaign wins the auction
+-- Result: Unpredictable query matching
+-- Better: Priority tiers (HIGH/MEDIUM/LOW) + negatives

Product Group Subdivision Strategy

When to Use Which Attribute

AttributeUse whenExample
productBrandSelling multiple brandsNike vs Adidas vs own brand
productTypeHierarchical categoriesClothing > Men's > Shirts
productCustomAttribute (Label 0-4)Business-specific segmentationMargin tier, season, bestseller
productItemIdTargeting individual productsTop 10 bestsellers separately
productChannelOnline vs localWebshop vs physical store

GAQL: Analyze Existing Listing Groups

SELECT ad_group.name, ad_group_criterion.listing_group.type,
    ad_group_criterion.listing_group.case_value.product_brand.value,
    ad_group_criterion.listing_group.case_value.product_type.value,
    ad_group_criterion.cpc_bid_micros
FROM ad_group_criterion
WHERE ad_group_criterion.type = 'LISTING_GROUP'

Mutate: Product Group Subdivisions (Standard Shopping)

Via google_ads_mutate recipe for listing group subdivision:

operations=[
    {"adGroupCriterionOperation": {"create": {
        "adGroup": "customers/{CID}/adGroups/{AG_ID}",
        "listingGroupInfo": {
            "type": "SUBDIVISION",
            "caseValue": {"productBrand": {"value": null}}
        }
    }}},
    {"adGroupCriterionOperation": {"create": {
        "adGroup": "customers/{CID}/adGroups/{AG_ID}",
        "listingGroupInfo": {
            "type": "UNIT",
            "caseValue": {"productBrand": {"value": "Nike"}}
        },
        "cpcBidMicros": "1500000"
    }}},
    {"adGroupCriterionOperation": {"create": {
        "adGroup": "customers/{CID}/adGroups/{AG_ID}",
        "listingGroupInfo": {
            "type": "UNIT",
            "caseValue": {"productBrand": {"value": "Adidas"}}
        },
        "cpcBidMicros": "1200000"
    }}}
]

PMax Listing Group Filters (Asset Group Level)

Via google_ads_mutate -- assetGroupListingGroupFilterOperation:

operations=[
    {"assetGroupListingGroupFilterOperation": {"create": {
        "assetGroup": "customers/{CID}/assetGroups/{AG_ID}",
        "type": "UNIT_INCLUDED",
        "vertical": "SHOPPING",
        "caseValue": {"productBrand": {"value": "Nike"}}
    }}}
]

Migration Checklist

Standard Shopping -> PMax

MIGRATION: STANDARD SHOPPING -> PMAX
====================================

[ ] PRE-MIGRATION (Week 1)
+-- Export current Shopping performance data (30d + 90d)
+-- Identify top performing products/categories
+-- Collect creative assets (images, headlines, descriptions)
+-- Plan asset group structure
+-- Check Merchant Center feed health

[ ] SETUP (Week 2)
+-- Create PMax Retail campaign (PAUSED)
+-- Configure asset groups with listing group filters
+-- Add all assets (max per type)
+-- Set audience signals
+-- Set brand exclusions (if Brand Search active)
+-- Validate with google_ads_mutate validate_only=True

[ ] LAUNCH (Week 3)
+-- Activate PMax campaign
+-- Reduce Standard Shopping budget by 50%
+-- Monitor daily: PMax vs Shopping performance
+-- DO NOT: Turn off Standard Shopping immediately

[ ] TRANSITION (Week 4-5)
+-- If PMax ROAS >= Shopping ROAS: Reduce Shopping further
+-- If PMax ROAS < Shopping ROAS: Wait, PMax still in learning
+-- After 2 weeks stable: Pause Shopping
+-- Keep Shopping as catchall (low budget) or pause

[ ] POST-MIGRATION (Week 6+)
+-- Compare: Total account performance before/after
+-- Monitor search terms for irrelevance
+-- Optimize asset groups based on data
+-- Evaluate after 30 days fully on PMax

PMax -> Standard Shopping

MIGRATION: PMAX -> STANDARD SHOPPING (switching back)
=====================================================

[ ] Reasons to switch back:
+-- PMax ROAS consistently lower than historical Shopping
+-- Too little control over search queries
+-- Budget going to irrelevant channels
+-- Brand cannibalization not resolvable

[ ] APPROACH:
+-- Create Standard Shopping campaign (PAUSED)
+-- Configure product groups and bids
+-- Set priority (if multiple Shopping campaigns)
+-- Activate Standard Shopping
+-- Reduce PMax budget gradually (25% per week)
+-- After 4 weeks: Evaluate, potentially pause PMax

2026 Updates: PMax Negative Keywords

  • Campaign-level negative keywords are now fully supported in PMax (API v20+). No need to use brand exclusion lists as a workaround — add negatives directly to PMax campaigns via google_ads_mutate Recipe #7.
  • Search term reporting now available for PMax (API v21+) — use search_term_view with PERFORMANCE_MAX filter to see which queries PMax is serving.
  • url_expansion_opt_out was removed in API v22 — this parameter no longer exists.
  • Smart Bidding Exploration (v21+): An optional signal that lets Smart Bidding test broader traffic to find new converting segments. Can be enabled per campaign.

GAQL: Check Existing PMax Negative Keywords

SELECT campaign.name, campaign_criterion.keyword.text,
    campaign_criterion.keyword.match_type,
    campaign_criterion.negative
FROM campaign_criterion
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
AND campaign_criterion.negative = TRUE

Tools Reference

ActionToolRecipe/Query
Create Shopping campaigngoogle_ads_mutateRecipe #17
Create PMax Retailgoogle_ads_mutateRecipe #19
Pause campaigngoogle_ads_mutateRecipe #2
Change budgetgoogle_ads_mutateRecipe #3
Negative keywordsgoogle_ads_mutateRecipe #7
Analyze listing groupsgoogle_ads_run_gaqlListing groups recipe
Shopping performancegoogle_ads_run_gaqlShopping performance recipe
Merchant Center detectiongoogle_ads_run_gaqlMerchant Center link recipe
Look up accountsgoogle_ads_list_accounts--
Keyword researchgoogle_ads_run_keyword_plannerSeed keywords

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what google-ads-shopping-campaign-structure-advisor does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.