---
name: set-up-performance-based-shopping-segmentation
description: >-
  Restructures Shopping spend around historical product performance: products get tiered by trailing
  ROAS into a custom label, and each tier gets its own campaign bucket with its own budget but a
  shared ROAS target. Use it when a mature catalog (90+ days of conversion data, 50+ SKUs) shows
  clear winners and losers and budget is being dragged down by the losers. It reads the ROAS
  baseline, verifies label sync, builds the bucket campaigns and product-group filters, and sets
  uniform tROAS. Do not use it for multi-factor prioritization by margin/stock/price
  (set-up-scoring-model-segmentation), for the initial feed build
  (set-up-and-optimize-product-feed), for a first unsegmented launch
  (launch-standard-shopping-campaign / launch-pmax-feed-only-campaign), or for routine tuning of an
  already-segmented setup (run-shopping-campaign-optimization-cycle).
---
# Segment Shopping Campaigns by Product Performance Tier

## Purpose
Split one undifferentiated Shopping budget into tiered campaign buckets so proven products get most
of the spend, chronic money-losers get contained, and never-shown products get a deliberate testing
budget. The tier assignment lives in a feed custom label maintained by an external labeling tool;
this skill wires the Google Ads side: baseline math, bucket campaigns, listing-group filters,
uniform ROAS targets, and overlap exclusions.

## When to run
- 90+ days of Shopping conversion history exists and product-level ROAS varies widely.
- Budget is constrained and a meaningful share of spend sits on products that never pay back.
- A large slice of the catalog gets essentially no impressions and needs forced exposure.
- A labeling tool (or feed-rule pipeline) is available to write a tier value into a custom label.

## When NOT to run
- Tiering should weigh margin, stock, or price competitiveness, not just ROAS -> set-up-scoring-model-segmentation.
- The feed itself is weak or brand new -> set-up-and-optimize-product-feed first.
- No campaign exists yet -> launch-standard-shopping-campaign or launch-pmax-feed-only-campaign.
- Under ~50 SKUs or under 90 days of data: tiers would be noise -> keep one campaign and run
  run-shopping-campaign-optimization-cycle instead.
- Products all perform in a similar band: segmentation adds structure without payoff.

## Prerequisites
- Merchant Center linked to the Google Ads account, feed approved and stable.
- Conversion tracking with values verified (set-up-google-ads-conversion-tracking if unsure).
- A labeling tool or feed pipeline able to sync a tier value into `custom_label_0` daily.
- Current account tROAS and 30-90 day average ROAS known or computable.

## Procedure
1. **Session guardrail.** Before the first Google Ads write of this session, call
   `gads_policy_guardrail` and honor its output.
2. **Pull the baseline.** Call `gads_get_shopping_performance` for the trailing 90 days, and
   `gads_run_gaql_query` on `shopping_performance_view` for the trailing 30 days to compute:
   account-level average ROAS, total Shopping conversions/month, and the product-level spread
   (spend and ROAS per item). Record average ROAS, the tool threshold derives from it.
3. **Classify the catalog (analysis only).** From step 2 data, bucket products into four neutral
   tiers: consistent high-ROAS sellers, moderate-but-profitable products, high-spend/low-return
   products, and near-zero-impression products. Report the counts and spend share per tier to the
   user, this drives the bucket-structure decision.
4. **Choose the bucket structure** with the user, per Decision rules: two buckets (growth or
   cost-control variant) or one campaign per tier if every major bucket clears ~30
   conversions/month.
5. **HUMAN STEP (outside VigilDog).** Configure the labeling tool: set its ROAS threshold to average
   ROAS x 0.75 (see Decision rules), map output to `custom_label_0`, enable daily sync to Merchant
   Center, and confirm the first sync in the Merchant Center UI. VigilDog has no tool for labeling-tool
   or Merchant Center feed configuration.
6. **Verify labels landed.** Call `gads_run_gaql_query` on `shopping_performance_view` segmented by
   the product custom attribute to count products per label value. Compare against the sanity ranges
   in Decision rules; if the top tier is nearly empty or the bottom tiers dominate, the threshold is
   set too high, send it back to step 5 before building anything.
7. **Plan the buckets.** Call `gads_plan_shopping_campaign` once per bucket to assemble a coherent
   plan (naming, budget share, bidding, filters) and present the full plan to the user.
8. **Create budgets and campaigns (write).** For each bucket: `gads_create_budget` then
   `gads_create_shopping_campaign`, budget split per Decision rules. Preview first
   (validate_only=true default), show the user each campaign's name/budget/target, apply only after
   explicit approval.
9. **Filter each bucket to its tiers (write).** In each campaign, use `gads_create_product_group` to
   subdivide by `custom_label_0` and include only that bucket's tier values, and
   `gads_exclude_product_group` to shut out every other value. Preview first, apply only after user
   approval. Verify the resulting tree with `gads_list_product_groups`, each tier value must be
   servable in exactly one campaign.
10. **Seal the legacy campaigns (write).** For every pre-existing Shopping/PMax campaign that could
    still serve these products, apply `gads_exclude_product_group` on the now-segmented label values.
    Preview first, apply after approval. Skipping this creates self-competition and splits the data.
11. **Set bidding (write).** Call `gads_set_campaign_bidding_strategy` to apply the SAME tROAS on
    every bucket. Optional exception: the zero-impression bucket may run Maximize Conversion Value
    with no target to force delivery. Preview first, apply after approval.
12. **Day-1 and week-1 validation.** Via `gads_run_gaql_query`: every bucket serving, spend pacing
    close to the intended split, the zero-impression bucket actually accruing impressions, and no
    product serving from two campaigns. Fix filter gaps immediately.
13. **Monthly maintenance.** Re-run steps 2 and 6: confirm products migrate between tiers over time
    (a frozen distribution means the sync or threshold broke), and re-check that the tool threshold
    still sits ~25% under the live tROAS. After ANY tROAS or budget change, recompute the threshold
    and have the human update the tool (step 5).

## Decision rules
- **Tool threshold formula:** labeling-tool ROAS threshold = trailing 30-90 day average ROAS x 0.75.
  The ~25% buffer below the campaign tROAS keeps a product that dips briefly from being demoted and
  stranded.
- **One tROAS for all buckets.** Differentiate buckets by BUDGET, never by target. A lower target on
  the weak bucket means a recovering product never clears the bar to climb back up.
- **Volume gate:** every bucket bidding to tROAS needs ~30 conversions/month of its own. Any bucket
  below that gets merged into a neighbor. The zero-impression bucket is exempt when it runs
  Maximize Conversion Value without a target.
- **Structure variants:** growth focus -> bucket A = winners + moderates + losers (70-80% of
  budget), bucket B = zero-impression products (20-30%); cost-control focus -> bucket A = winners +
  moderates + zero-impression (70-80%), bucket B = losers (20-30%); full split (one campaign per
  tier) only when volume allows, roughly 50-60% / 20-25% / 20-25% across winner/loser/dormant lines.
- **Label distribution sanity check (step 6):** top tier ~5-15% of catalog, moderate ~15-25%,
  low-return ~25-40%, near-zero-impression ~30-50%. Outside these bands, suspect the threshold, not
  the catalog.
- **Patience windows:** label sync 24-48h; bidding re-learn 7-14 days after the restructure; do not
  judge bucket performance before ~30 days.

## Common failure modes
- **Different targets per bucket.** Feels intuitive ("go easy on the weak ones"), quietly pins
  products in the bottom tier forever. Uniform target, tiered budget.
- **Threshold never revisited.** The tROAS gets raised later but the tool threshold stays put, so
  the buffer collapses and tiers thrash. Re-derive the threshold after every target change.
- **No exclusions on legacy campaigns.** The old catch-all campaign keeps bidding on segmented
  products; both campaigns learn from half a signal. Step 10 is not optional.
- **Dormant bucket starves.** A tROAS target on products with no history means the algorithm never
  risks an impression. Give that bucket Maximize Conversion Value (no target) or a bid floor.
- **Judging tiers on a week of data.** Tier migration is the health signal, and it plays out over
  weeks. Monthly review cadence, not daily.

## Related skills
- Before: set-up-and-optimize-product-feed (labels ride on a healthy feed),
  set-up-google-ads-conversion-tracking (value data must be trustworthy).
- During: launch-standard-shopping-campaign or launch-pmax-feed-only-campaign (per-bucket build
  details).
- After: run-shopping-campaign-optimization-cycle (recurring tuning),
  set-up-scoring-model-segmentation (graduate to multi-variable prioritization),
  handle-budget-limited-campaigns (if a winning bucket hits its budget ceiling).
