---
name: build-search-campaign-structure
description: >-
  Turns finished keyword clusters into a live-but-paused Search campaign skeleton in Google Ads: campaign map with
  a consolidate-by-default bias, ad groups cut along creative themes, keywords with maturity-appropriate match
  types, the three-list shared negative infrastructure, landing page assignment, and full campaign settings
  (networks, geo, language, rotation, bidding, budget). Use it after cluster-and-map-keywords has produced
  tiered, intent-labeled clusters with page mappings and the account's economics and bid strategy are decided.
  It does not research or cluster keywords (research-keywords, cluster-and-map-keywords), write the ads
  (write-compelling-rsas), or flip anything live (launch-a-search-campaign). For restructuring an account that is
  already running, use review-and-optimize-campaign-structure instead.
---
# Build a Search Campaign Structure

## Purpose
This is the assembly step between keyword strategy and ad writing: it converts clusters into concrete campaigns, ad
groups, keywords, negatives, and settings inside Google Ads, with everything paused. The structural philosophy is
consolidation-first, one non-brand campaign unless a specific, nameable setting difference forces a split, because
Smart Bidding learns at the query level and more data per campaign means faster, cheaper learning.

## When to run
- Keyword clusters are complete (tiered, intent-labeled, mapped to landing pages) and the campaign needs building.
- A ground-up rebuild of Search structure has been approved.
- The business is expanding into a new product or service area that needs net-new campaigns.

## When NOT to run
- No clustered keyword list yet → `research-keywords` then `cluster-and-map-keywords`.
- The account already has running Search campaigns that need structural surgery → `review-and-optimize-campaign-structure`.
- You need ads written → `write-compelling-rsas` (this skill builds containers, not copy).
- You are choosing the bidding approach itself → `select-a-bidding-strategy` first.
- Ready structure just needs enabling → `launch-a-search-campaign`.

## Prerequisites
- Cluster worksheet from `cluster-and-map-keywords`: clusters with intent labels, tiers, and landing page URLs.
- Conversion tracking verified working (upstream of this skill; see `set-up-google-ads-conversion-tracking`).
- Bid strategy and targets chosen (`select-a-bidding-strategy`, `calculate-bid-targets`).
- Daily budget per campaign decided (`allocate-budget-across-campaigns`).
- The rejected-keyword list from research (seeds the negative lists).

## Procedure
1. **Consult the policy guardrail.** Call `gads_policy_guardrail` before the session's first Google Ads write.
2. **Draft the campaign map.** Optionally seed with `gads_plan_search_campaign` for a coherent starting plan.
   Default every non-brand cluster into ONE campaign, then test each cluster against the split criteria in
   Decision rules. Brand clusters always get their own campaign. Record each campaign with its clusters, the
   specific reason it exists separately (or "consolidated default"), its bid strategy, and its daily budget.
   Present the map for user approval before creating anything.
3. **Cut ad groups by creative theme.** Within each campaign, group clusters by the one-ad coverage question: could
   a single responsive search ad's headlines and descriptions serve every keyword in this group without sounding
   generic for any of them? Yes → one ad group; no → split along the theme boundary. Sanity-check counts: 5–25 ad
   groups per campaign is typical; 40+ suggests a missing campaign split; a 50-keyword ad group usually hides two
   themes; a 1–2 keyword ad group usually merges into a neighbor.
4. **Create the campaigns paused.** For each approved campaign, call `gads_create_search_campaign` (or
   `gads_create_campaign`) with status paused, alongside its budget via `gads_create_budget`. Preview first
   (validate_only default), commit each only after explicit user approval.
5. **Create ad groups.** Call `gads_create_ad_group` per ad group from step 3 (preview → approval → commit). If
   Smart Bidding will control bids, the ad group default bid is a placeholder.
6. **Assign keywords with match types.** For each ad group, call `gads_add_keywords` with match type chosen by
   account maturity (see Decision rules). Set keyword-level final URLs where individual keywords within a theme
   need a different page; otherwise the URL rides on the ad. Before committing, verify no keyword appears in two
   ad groups of the same campaign, duplicates create internal auction competition. Preview → approval → commit.
7. **Build the shared negative infrastructure.** Via `gads_create_shared_negative_set`, create three core lists, one for business-irrelevant terms, one for data-proven poor performers (left empty now; `run-n-gram-analysis`
   fills it later), one for the account's own brand terms, plus optional competitor and spam lists where the
   vertical warrants. Populate via `gads_add_keywords_to_shared_set`: research rejects into the irrelevant list
   (lowercase, phrase match for multi-word patterns), every brand variant and misspelling into the brand list.
   Link with `gads_link_shared_set_to_campaign`: irrelevant + poor-performer lists to every Search/Shopping/PMax
   campaign; the brand list to non-brand Search campaigns ONLY, verify brand campaigns are not linked to it.
   Each write previews first and commits after approval.
8. **Add targeted negatives.** Call `gads_add_negative_keywords` for ad-group-level cross-routing blocks (stop ad
   group A's keywords triggering ad group B's ads) where themes overlap. Brand campaigns on phrase/exact rarely
   need generic negatives; add campaign-level ones only if junk queries actually appear.
9. **Validate landing pages.** HUMAN STEP (outside VigilDog): confirm each mapped URL returns 200, renders on
   mobile, carries the cluster's primary term above the fold, and matches the planned ad promise. Never point a
   non-brand ad group at the homepage, flag any cluster whose page is missing as blocked rather than substituting.
10. **Configure campaign settings.** Per campaign: `gads_create_search_campaign` defaults to Search-only (Search
    Partners and Display off, Display-on is the classic silent budget leak); `gads_add_location_targeting` for the
    geo plan (the presence-vs-interest option is a CAMPAIGN setting: `positive_geo_target_type` at create, or
    `gads_update_campaign` updates `{geo_target_type_setting: {positive_geo_target_type: ...}}`, no longer a
    human step);
    `gads_add_language_targeting` for audience languages; `gads_set_campaign_ad_rotation` to optimize-for-best;
    start date set, no end date unless a promo. Every write previews and waits for approval.
11. **Apply bidding and budget.** `gads_set_campaign_bidding_strategy` with the chosen strategy and tCPA/tROAS from
    upstream, and `gads_update_budget` to the allocated daily amounts (preview → approval each). Confirm the
    campaign-level conversion goal matches the intended action.
12. **Verify the build.** Run `gads_run_gaql_query` to audit the finished structure: campaign settings and network
    flags, keyword counts and match types per ad group, shared-set links, no duplicate keywords, budgets and
    strategies attached. Deliver the audit as the handoff artifact and keep everything paused for
    `write-compelling-rsas` and then `launch-a-search-campaign`.

## Decision rules
- **Split a campaign only for a nameable setting difference:** its own budget cap, different bid strategy or
  target, different conversion goal, different geography, different ad schedule, different network policy, or
  brand vs. non-brand. No reason from that list → consolidate.
- **Brand is always separate.** Brand traffic's CPC, CVR, and intent profile would distort any shared campaign's
  learning and reporting.
- **Match type by maturity:** established account + tCPA/tROAS + roughly 30+ conversions/month → broad match as
  default. New accounts, low-volume campaigns (<30 conv/month), tight budgets, or narrow B2B query spaces →
  exact/phrase, testing broad later via a 50/50 experiment. Brand keywords → phrase/exact only. Proven keywords
  keep their current type.
- **One keyword, one ad group** within a campaign. Cross-ad-group duplicates are always a defect.
- **Ad group counts are signals, not laws:** 5–25 typical; review consolidation past 25; consider a campaign split
  with a documented reason past 40.
- **Negative list linking matrix:** irrelevant + poor-performer lists → everywhere; brand list → non-brand only;
  competitor list → everywhere except deliberate competitor campaigns.
- **Landing pages:** homepage acceptable only for brand campaigns; every non-brand ad group needs an
  intent-matched page or a blocked flag.

## Common failure modes
- **Over-segmentation.** Ten small campaigns "for organization" each learn from a tenth of the data. If the split
  reason is not on the list, it is not a reason.
- **Ad groups cut by keyword similarity instead of ad coverage.** Words can look alike while needing different
  promises; the one-ad coverage question is the only grouping test.
- **Brand list linked to the brand campaign.** The account then blocks its own brand traffic, the single most
  embarrassing linking error; verify in step 7.
- **Display Network left on.** Default settings quietly siphon Search budget into Display; step 10 exists for this.
- **Duplicated keywords across ad groups.** Internal competition raises your own CPCs; audit before committing.
- **Homepage as a non-brand landing page.** Generic destination, poor Quality Score, wasted intent; block the
  cluster instead.
- **Building and launching in one breath.** This skill ends paused on purpose, ads, extensions, and a pre-flight
  check still stand between structure and spend.

## Related skills
- Run before: `research-keywords` → `cluster-and-map-keywords`; `select-a-bidding-strategy`,
  `calculate-bid-targets`, `allocate-budget-across-campaigns`, `set-up-google-ads-conversion-tracking`.
- Run after: `write-compelling-rsas`, `set-up-ad-extensions`, then `launch-a-search-campaign`.
- Later lifecycle: `review-and-optimize-campaign-structure` (quarterly), `configure-ai-max-for-search` (expansion
  once broad match is proven).
