---
name: set-up-audience-signals
description: >-
  Configures the audience signal stack on a Performance Max asset group so the campaign starts learning from the
  best available first-party data instead of guessing. It inventories usable lists, layers signals in
  quality order (customer lists and site converters before interest categories), builds intent-based custom
  segments, and handles search themes with an explicit cannibalization check against live Search keywords. Use it
  when launching a new PMax campaign or asset group, when an existing asset group is underperforming on thin or
  interest-only signals, or after new first-party data lands. Signals are steering hints, not delivery limits, if
  you need hard audience restriction on Video or Demand Gen, that is set-up-audience-targeting; if the customer
  list itself is missing or stale, run build-customer-match-lists first; for a monthly performance pass over live
  segments use optimize-audience-performance; for the readiness-gate decision use expand-audience-reach.
---
# Configure PMax Audience Signals

## Purpose
Performance Max decides its own delivery, but the audience signals you attach determine how fast and how cheaply it
finds converters during ramp-up. This skill builds a layered signal stack for one asset group, strongest first-party
data first, Google interest categories last, and makes the search-theme decision deliberately instead of by default,
because careless themes can pull search traffic away from dedicated Search campaigns.

## When to run
- A new PMax campaign or asset group is being launched and needs signals before enable.
- An existing asset group is slow to learn or performing poorly and its signals turn out to be thin, generic, or
  interest-only.
- New first-party data became available: a fresh Customer Match list, a new converter segment, a linked channel.
- An account review found asset groups with no signals or with themes duplicating Search keywords.

## When NOT to run
- The Customer Match list is missing, under ~1,000 matched users, or stale → `build-customer-match-lists` first.
- You are configuring Video or Demand Gen audience targeting (real delivery restriction) → `set-up-audience-targeting`.
- You are reviewing live audience segment performance and pruning losers → `optimize-audience-performance`.
- You are deciding whether the account is ready to expand reach at all → `expand-audience-reach`.

## Prerequisites
- The PMax campaign and the specific asset group are identified (one asset group per run, signals should differ by
  asset-group theme, not be copy-pasted).
- Site tagging is live so converter and visitor segments exist and populate (HUMAN STEP if tagging is absent, GTM/site work is outside VigilDog).
- A Customer Match list uploaded and matched, ideally 1,000+ users refreshed within 30 days (build it first if not).
- A list of the account's top-converting search queries, or access to pull them.

## Procedure
1. **Consult the policy guardrail.** Call `gads_policy_guardrail` before the first Google Ads write of the session
   and respect any flags on personalized-advertising categories.
2. **Inventory first-party assets.** Call `gads_list_user_lists` and grade each list: a Customer Match list is
   usable at 1,000+ matched users refreshed within 30 days; site segments (all visitors, converters) are usable from
   ~100 users, meaningful from 1,000. Record what exists, its size, and its freshness.
3. **Gate on the inventory.** IF no usable Customer Match list exists, either route to `build-customer-match-lists`
   now or proceed without it and schedule a return trip, but say so explicitly rather than silently launching thin.
   IF converter/visitor segments are missing entirely, flag as HUMAN STEP (outside VigilDog): remarketing sources and
   tagging must be fixed before this asset group can get its strongest signals.
4. **Attach the first-party layer.** Call `gads_add_audience_signal` on the asset group with, in this order: the
   primary Customer Match list (all customers for growth goals, the top-revenue slice for efficiency goals), then
   the site-converters segment, then the all-visitors segment. Preview first (validate_only default); apply only
   after explicit user approval. These carry the most learning weight, do not launch without them.
5. **Build intent-based custom segments.** Call `gads_create_custom_audience` twice if inputs allow:
   - a search-intent segment from 10–15 of the account's highest-converting queries (transactional phrasing, no
     brand terms, no one-word generics);
   - optionally a URL-interest segment from 10–15 specific competitor and industry pages (deep URLs, not homepages).
   Preview → user approval → apply, then attach each via `gads_add_audience_signal` (again preview → approval).
6. **Add a thin interest layer.** Attach one or two of the most specific in-market categories that match the asset
   group's theme via `gads_add_audience_signal` (preview → approval). Add life-event or affinity categories only
   when the product genuinely keys off a life change or the goal is awareness, and never as the only signal.
   Demographic filters only when household income or parental status truly narrows the buyer.
7. **Decide search themes with a conflict check.** Call `gads_list_keywords` across active Search campaigns and
   compare against the candidate themes. IF the account runs Search campaigns covering those queries, THEN skip
   themes, PMax will otherwise compete for the same auctions and starve the Search campaign. IF PMax is the only
   search-eligible campaign, or the user explicitly accepts the tradeoff, THEN call `gads_add_search_themes` with
   category-level themes (broad phrasing, not long-tail keywords; hard cap 50 per asset group). Preview → approval
   → apply. Record the rationale either way.
8. **Undo cannibalization when detected.** If a later review shows PMax eating Search impression share or the
   channel mix skewing after themes went live, call `gads_remove_search_themes` (preview → approval) and note the
   change for the learning-period clock.
9. **Set exclusions.** HUMAN STEP (outside VigilDog) or route: campaign-level audience exclusions (recent converters
   on a 7–30 day window; the all-customers list for acquisition-only campaigns) are configured at the campaign, not
   the asset group. Confirm with the user that they exist before launch, a signal stack without exclusions leaks
   spend onto people who already bought.
10. **Keep the top layer fresh.** On the ongoing cadence, refresh the Customer Match layer with
    `gads_add_customer_match_members` (preview → approval) per the schedule owned by `build-customer-match-lists`.
11. **Summarize the stack.** Report per layer: what was attached, size/freshness, theme decision and rationale,
    exclusion status. Expect 14–21 days of learning before judging the effect of signal changes.

## Decision rules
- **Layer order is fixed:** customer lists → site converters → all visitors (→ channel-engaged viewers if available)
  → intent custom segments → 1–2 in-market categories. Interest-only stacks are a launch blocker, not a variant.
- **Usability floors:** Customer Match usable at 1,000+ matched and ≤30 days old; site segments serve from ~100
  users but only start informing learning around 1,000. A small real list still beats no list, attach it.
- **Custom segment sizing:** 10–15 inputs. Below ~8 the segment is too narrow to model; dumping 50–100 keywords
  dilutes it into noise. Converting transactional queries only.
- **Search themes:** IF active Search campaigns cover the queries THEN no themes. IF no Search overlap THEN
  category-level themes only, ≤50 per asset group, never duplicating live keywords. Treat themes as an explicit
  opt-in to PMax competing on search inventory.
- **Windows:** converter segments 90–540 days (buying cycles are long); all-visitors 30–90 days (intent decays).
- **Aim for 5–7 distinct signal types per asset group,** customized to the asset group's theme, identical stacks
  across differently-themed asset groups waste the structure.
- **Evaluation delay:** any signal change restarts meaningful learning; wait 14–21 days before reading results.
- **Done means:** first-party layer attached, at least one intent custom segment live, interest layer thin and
  theme-matched, the search-theme decision recorded with its keyword-overlap evidence, and campaign-level
  exclusions confirmed. An asset group missing any of these is not launch-ready.

## Common failure modes
- **Interest-only signals** (in-market/affinity/demographics with no first-party layer): the campaign learns from
  Google's broadest guesses and burns budget during ramp. Always anchor on lists and converters.
- **Keyword dumping into custom segments** on the theory that more inputs help. They don't; 10–15 curated
  converting queries outperform a 100-term pile.
- **Adding search themes while Search campaigns run the same queries**, the classic self-inflicted wound: PMax
  wins the internal auction, Search "declines," and the shift is misread as a Search problem. Run the step-7
  keyword check every time.
- **Exclusions forgotten** because they live at campaign level while this work happens at asset-group level.
  Step 9 is a launch gate, not a nice-to-have.
- **Copy-pasting one signal stack across every asset group**, each asset group's theme deserves its own custom
  segments and in-market picks.
- **Waiting for a "big enough" customer list.** A refreshed 1,000-user list attached today helps more than a
  perfect list next quarter.

## Related skills
- Run before this: `build-customer-match-lists` when the first-party layer is missing or stale.
- Run instead when the surface differs: `set-up-audience-targeting` for Video/Demand Gen delivery restriction.
- Run after this: `expand-audience-reach` to decide the next controlled expansion; `optimize-audience-performance`
  for the recurring segment-level review on Video/DG surfaces.
