---
name: run-demand-gen-optimization-cycle
description: >-
  The recurring tuning pass for live Demand Gen campaigns: health gate, per-audience CPA triage, channel-mix and
  view-through sanity checks, monthly creative-fatigue review, and a staged bidding-maturity ladder (clicks →
  conversions → target-based, with disciplined target tightening). Run it bi-weekly as a light pass and monthly in
  full, starting no earlier than day 30 of a campaign's life, or whenever performance slides after learning or a
  budget scale-up is being considered. It judges Demand Gen on Demand Gen economics, CPA up to ~2x non-brand Search
  is normal here, and routes deep work outward: multi-audience failure to optimize-audience-performance, placement
  cleanup to manage-demand-gen-and-video-placements, creative rebuilds to run-a-creative-testing-cycle. Do NOT use it
  to build a new campaign (launch-a-demand-gen-campaign) or for Video campaigns
  (run-video-campaign-optimization-cycle).
---
# Demand Gen Optimization Cycle

## Purpose
A live Demand Gen campaign drifts in four ways: audiences decay, one channel eats the budget, creative fatigues,
and the bid strategy stays stuck at its launch stage long after the data supports graduating it. This skill is
the fixed-cadence pass that measures each of those against hard thresholds and applies (or routes) the fix, in
under an hour, without turning a checkpoint into a rebuild.

## When to run
- Bi-weekly light pass (health + audiences + channels + bidding) and monthly full pass (adds creative, feed, and
  brand-safety review) on every live Demand Gen campaign.
- First run at day 30 post-launch, never earlier; before that you are grading the learning period.
- Ad hoc: CPA/ROAS deteriorating after a stable stretch, or before approving any budget scale-up.

## When NOT to run
- No campaign exists yet → `launch-a-demand-gen-campaign`.
- Several audiences failing at once, or the audience layer needs structural work → `optimize-audience-performance`.
- The findings are placement-shaped (bad sites, apps, channels) → `manage-demand-gen-and-video-placements`.
- The campaign is Video, not Demand Gen → `run-video-campaign-optimization-cycle`.
- You need new creative built and tested, not just fatigue flagged → `run-a-creative-testing-cycle`.

## Prerequisites
- Demand Gen campaign live 30+ days with conversion tracking verified.
- Demand-Gen-specific targets agreed: CPA allowance of 1.5–2x the non-brand Search target (or ROAS at 50–70% of
  it). Judging this channel on Search economics guarantees a false "failing" verdict.
- Google Ads is the source of truth for this channel, its view-through-aware attribution sees what last-click
  analytics cannot. Previous cycle's notes if any.

## Procedure
1. **Health gate.** Call `gads_get_disapproved_ads` (any disapprovals block everything else),
   `gads_run_gaql_query` for serving status and last-7-day conversion recording, and `gads_list_recommendations`
   for account-flagged setup issues. If multiple areas fail, fix in this order: bidding → audiences → creative →
   placements → feed → brand safety. Consult `gads_policy_guardrail` before the session's first write.
2. **Pull the audience dataset.** Via `gads_run_gaql_query`, get last-30-day cost, conversions, value, clicks, and
   CPA/ROAS per audience segment per ad group, plus campaign averages. Then triage:
   - every segment within 1.5x target → no action;
   - one segment past 2x target on 50+ clicks → pause or swap it (audience writes route through
     `optimize-audience-performance`; record the finding here);
   - several segments failing → stop the audience portion and schedule `optimize-audience-performance` in full.
3. **Lookalike reach check (prospecting campaigns).** Efficient but volume-starved → recommend widening reach one
   notch; CPA blown → recommend tightening a notch or replacing the seed with a higher-quality list. The reach
   slider is a HUMAN STEP (outside VigilDog), output the exact instruction, and impose a 14-day no-touch window
   after any change.
4. **Expansion audit.** Via `gads_run_gaql_query`, isolate the optimized-targeting/expansion delivery share per ad
   group and compare its CPA to the selected audiences': under 1.5x → leave on; 1.5–2x → hold and re-check next
   cycle; over 2x → recommend OFF (toggle is a HUMAN STEP, give the exact ad group). Remarketing ad groups must
   show expansion OFF, full stop.
5. **Demographics scan.** From the same GAQL pull, flag any age/gender/parental/income cell at over 2x campaign-
   average CPA on 50+ clicks for exclusion. Treat the Unknown bucket as protected, flag it only when it takes
   over 20% of budget at over 1.5x average CPA, and never exclude it on less than 30 days of data.
6. **Channel mix.** Segment performance by network via `gads_run_gaql_query` (YouTube / Discover / Gmail /
   Display). One channel over 75% of spend is fine if its CPA is on target; over 75% AND over 2x target CPA →
   recommend restructuring into per-channel ad groups so allocation becomes controllable; a channel at zero
   conversions after 30+ days → recommend excluding it via ad group structure. Never kill a channel on last-click
   CPA alone, read the view-through columns first.
7. **View-through reality check.** Compute view-through share of total conversions: under 30% healthy; 30–60% flag
   for backend cross-validation; over 60% → recommend shortening the view-through window or removing view-through
   from bidding (conversion-action setting, HUMAN STEP or route to `set-up-google-ads-conversion-tracking`).
8. **Display placement spot-check.** If Display inventory carries meaningful spend, call
   `gads_get_placement_report` for the top 50 by cost. One or two junk placements in the top 10 → note them for
   immediate exclusion; three or more, or unexcluded mobile apps → schedule
   `manage-demand-gen-and-video-placements` this week. Also check frequency: above ~5/user/week with CTR falling
   → the fix is bigger audiences or fresh creative, not more budget.
9. **Creative pass (monthly only).** From GAQL asset metrics: fatigue = CTR down two straight weeks, or frequency
   past 5 per user per 7 days, or CPA up 20%+ over 14 days with audiences unchanged. Refresh protocol: add new
   variants next to the old (never swap-and-delete), give them 14 days, then pause the losers. Verify every asset
   slot is filled (images, headlines, descriptions, logo) and flag any image asset 90+ days old with zero
   conversions for removal. Creative production and structured tests → `run-a-creative-testing-cycle`.
10. **Bidding maturity.** Read the current strategy and 30-day conversion count, then walk the ladder (Decision
    rules). Execute graduations via `gads_set_campaign_bidding_strategy`, preview (validate_only=true), apply
    only after explicit user approval. When first adding a CPA/ROAS target, set it AT the trailing-30-day actual,
    not at the aspiration.
11. **Target tightening (campaigns already on targets).** Move 5–10% per step via
    `gads_set_campaign_bidding_strategy` or `gads_update_campaign` (preview → approval), wait 14 days between
    steps, cap total movement at 20% per cycle. If conversion volume drops more than 30% after a tightening, give
    back 5%.
12. **Feed check (monthly, product-feed campaigns only).** Merchant Center diagnostics are a HUMAN STEP (outside
    VigilDog): feed active, expected product count approved, disapprovals under 5%, no placeholder images, prices
    matching landing pages.
13. **Brand safety check (monthly).** Expected state: inventory type at the moderate or restricted tier (never the
    widest), sensitive categories excluded, mature-audience content label excluded. These are UI settings, HUMAN
    STEP to verify, but log the confirmation. Spot-check recent placements from step 8's report for anything
    brand-inappropriate.
14. **Close the loop.** Log every change with its triggering numbers, the escalations scheduled, and the next
    review date. One structural change per cycle, if this cycle already migrated bidding, defer the channel
    restructure to the next one.

## Decision rules
- **Channel economics baseline:** Demand Gen CPA at 1.5–2x non-brand Search tCPA = normal; ROAS at 50–70% of
  Search = normal. Set targets on this basis before flagging anything as broken.
- **Audience action floor:** no pause/swap verdict without 50+ clicks; single failure → act locally; multiple
  failures → escalate to the audience skill rather than serial-pausing.
- **Expansion verdicts:** expansion CPA <1.5x selected-audience CPA keep · 1.5–2x monitor 14+ days · >2x off.
  Remarketing: always off.
- **Bidding ladder:** click-maximizing at launch → conversion-maximizing (no target) at 15+ conversions/30 days →
  add tCPA/tROAS at 30+ conversions/30 days with stable performance → begin tightening only at 50+
  conversions/ad group/30 days.
- **Tightening discipline:** 5–10% per step · 14-day wait · ≤20% per cycle · volume drop >30% → loosen 5%.
- **View-through bands:** <30% healthy · 30–60% validate against backend · >60% restructure the window.
- **Creative staleness:** no creative runs 60+ days unchanged; images at 90+ days with zero conversions get
  pruned.
- **Frequency ceiling:** >5/user/week with declining CTR = fatigue signal, answered with audience size or new
  creative.

## Common failure modes
- **Grading on Search benchmarks.** The most common false alarm; upper-funnel CPA runs structurally higher, and
  the view-through contribution never shows in a Search-style readout.
- **Touching the campaign before day 30.** Optimizing inside the learning period resets the learning period.
- **Several levers per cycle.** Bidding migration + channel restructure + creative swap in one pass makes the
  next cycle's data unreadable. One structural change, then wait.
- **Killing placements/channels on last-click.** View-through is a real fraction of this channel's value; check
  it before every exclusion verdict.
- **Aspirational targets at migration.** Setting tCPA 30% below current actuals throttles delivery instantly; set
  at actuals, tighten on the 5–10% schedule.
- **Expansion never measured.** The expansion row quietly absorbs budget; without step 4 the campaign-level
  numbers hide it.
- **Fatigue answered with budget.** Rising frequency + falling CTR means the audience has seen the ad; more spend
  deepens the burn instead of fixing it.

## Related skills
- Before (first time): `launch-a-demand-gen-campaign` sets up everything this skill assumes.
- Escalation targets: `optimize-audience-performance` (audience layer), `manage-demand-gen-and-video-placements`
  (placements/brand safety), `run-a-creative-testing-cycle` (creative), `select-a-bidding-strategy` (strategy
  re-selection beyond the ladder).
- Sibling cadence: `run-video-campaign-optimization-cycle` for the account's Video campaigns.
