---
name: run-pmax-lead-gen-saas-optimization-cycle
description: >-
  Recurring maintenance loop for lead-gen and SaaS Performance Max campaigns, built around one non-negotiable:
  the campaign must bid on an imported quality signal (MQL, SQL, or revenue), not raw form fills. The cycle
  verifies the offline import is alive, gates on learning status, sweeps search terms weekly (including
  job-seeker and other non-buyer traffic), tiers assets bi-weekly, and monthly reviews channel mix, Customer
  Match freshness, downstream lead quality, brand bleed, and structure, escalating to a downstream bidding
  signal when quality erodes. Use it for an established lead-gen/SaaS PMax campaign due its weekly, bi-weekly,
  or monthly pass. Do not use it for ecommerce PMax (run-pmax-ecommerce-optimization-cycle), to build the
  campaign (launch-pmax-for-lead-gen-saas), to wire up the import itself (set-up-offline-conversion-tracking),
  or for query promotion into Search (manage-pmax-search-terms-and-brand-defense).
---
# Lead-Gen / SaaS Performance Max Optimization Cycle

## Purpose
Keep a lead-gen or SaaS PMax campaign producing leads the sales team actually wants. PMax optimizes ruthlessly
toward whatever conversion it is given; fed raw form submissions, it will happily fill the CRM with junk. This
cycle therefore audits the quality signal before anything else, then works through queries, creative, channels,
audiences, and structure on a fixed cadence, and shifts the bidding signal further down the funnel whenever
volume stays flat while downstream quality decays.

## When to run
- Campaign is 4+ weeks post-launch, out of learning, logs roughly 30+ conversions/month on the quality signal,
  and no structural change landed in the last 2 weeks.
- Weekly: signal health check plus the query/negative sweep (steps 1-4).
- Bi-weekly: add the asset review (step 5).
- Monthly: full pass, channels, audiences, lead quality, brand, structure, placements (steps 6-11).
- Ad hoc: sales reports lead quality dropping, or lead volume spiked suspiciously.

## When NOT to run
- Ecommerce PMax, use run-pmax-ecommerce-optimization-cycle (feed and product logic replace lead quality).
- Campaign not yet launched, use launch-pmax-for-lead-gen-saas.
- Offline conversion import missing or broken, fix via set-up-offline-conversion-tracking first; optimizing a
  campaign that bids on form fills is polishing the wrong objective.
- The task is moving winning PMax queries into Search, use manage-pmax-search-terms-and-brand-defense.
- Whole-account review, use run-a-weekly-performance-review.
- Campaign inside a learning period (see decision rules), record the exit date and stop.

## Prerequisites
- An offline-imported conversion action (MQL, SQL, or revenue) exists and is the campaign's bidding signal.
- CRM stage data (form -> MQL -> SQL -> closed) available for the quality review, even if only as an export.
- A Customer Match seed list built from closed customers or SQLs.
- Target CPA (or ROAS if values are imported) agreed for the quality signal.

## Procedure
Before the first Google Ads write of the session, call `gads_policy_guardrail` and honor its output.
Every write below is previewed first (validate_only=true default) and committed only after explicit user approval.

1. **Quality-signal health gate.** Call `gads_list_conversion_actions` and confirm the imported quality action
   is enabled and set as the campaign's bidding goal. Then use `gads_run_gaql_query` segmented by day and
   conversion action over the last 30 days: look for days with zero imports where the CRM says deals moved, gaps mean the pipeline broke. If the campaign is bidding on raw form fills, or imports have stalled, STOP
   and route to set-up-offline-conversion-tracking before optimizing anything.
2. **Learning-period gate.** Via `gads_run_gaql_query`, review recent changes (bid strategy, budget,
   asset groups, signals) against the learning windows in the decision rules. Inside a window: read-only pass,
   report the exit date, end the cycle.
3. **Query sweep (weekly).** Pull `gads_get_search_terms_report`, last 7 days, cost descending, top 50-100
   rows. Bucket: converting on the quality signal at acceptable cost (leave); heavy spend, zero quality
   conversions; unrelated to the product; brand-containing (hold for step 9); competitor-brand (judge on
   numbers); research-stage phrasing; and the lead-gen-specific bucket, employment intent ("jobs", "careers",
   "salary", "internship") which never buys software. Also compute brand share of impressions (target <30%).
4. **Apply negatives (write).** Add exclusion candidates with `gads_add_negative_keywords` to the campaign's
   shared negative list, organized by category (irrelevant / competitor / brand / employment), preview first,
   apply only after user approval. Verify via `gads_run_gaql_query` that nothing newly added blocks a query
   that produces quality conversions. High-volume accounts: run run-n-gram-analysis monthly on a 30-day export.
5. **Asset review (bi-weekly).** Pull per-asset metrics with `gads_run_gaql_query` on the asset-group-asset
   report and grade against the tier rules below, using delivered CTR/conversion data rather than Google's
   ad-strength grade. Replace at most 1-2 assets per type, and make each replacement a different angle worth
   learning from: product screenshot vs. people imagery, feature-led vs. benefit-led vs. pain-led copy,
   testimonial vs. demo framing, urgency vs. value framing. Execute swaps via run-a-creative-testing-cycle.
6. **Channel mix (monthly).** Call `gads_get_pmax_channel_performance` (or the equivalent
   `gads_run_gaql_query` per-channel rollup) and compare to the lead-gen ranges in the decision rules.
   Display bloated with weak conversions points to placements (step 11) or tired creative; Video spend with no
   uploaded videos means auto-generated video is serving; Search dominating usually means brand bleed (step 9);
   Gmail/Discover dominating suggests weak audience signals pushing PMax toward cheap inventory.
7. **Customer Match freshness (monthly).** Check list size and age with `gads_list_user_lists`. If the primary
   list is older than 90 days or under 1,000 matched members, refreshing it outranks every other signal task:
   pull the latest closed-won/SQL records from the CRM (HUMAN STEP (outside VigilDog) if no CRM connector is
   available) and upload with `gads_add_customer_match_members`, preview first, apply only after user approval.
8. **Lead-quality review (monthly).** Compare the last 30 days to the prior 30: form-to-MQL rate, MQL-to-SQL
   rate, SQL-to-close rate, and average deal value. The Google-side numbers come from `gads_run_gaql_query`
   and `gads_get_account_performance`; the CRM-side stage rates are a HUMAN STEP (outside VigilDog) unless the
   CRM is connected. If volume holds while any downstream rate slides, PMax is harvesting easy-but-poor leads:
   tighten audience signals, add low-intent negatives (step 4), and if it persists a second month, move the
   bidding signal one stage downstream (e.g., MQL -> SQL) with `gads_set_campaign_conversion_goal`, preview
   first, apply only after user approval, and warn that this restarts learning.
9. **Brand containment (monthly).** Cross-check brand queries from step 3 against the brand Search campaign
   via `gads_run_gaql_query`: PMax paying more per brand click than Search, or Search brand volume falling as
   PMax rises, means interception of owned demand. HUMAN STEP (outside VigilDog): maintain the brand-exclusion
   list in the Google Ads UI, adding every misspelling the report surfaces. Promotion work goes to
   manage-pmax-search-terms-and-brand-defense.
10. **Structure review (monthly).** Roll up quality-signal conversions per asset group via
    `gads_run_gaql_query` and apply the 30/200 thresholds below. Lead-gen groups are organized by offer,
    service, or audience, groups mixing unrelated offers, or offers with very different margins sharing one
    campaign, are split candidates. Maximum one structural change per month; it restarts learning.
11. **Placement review (monthly).** Query the PMax placement report via `gads_run_gaql_query`, sorted by
    impressions; flag app placements with zero conversions, junk domains, irrelevant video channels, and any
    single placement over 5% of spend with nothing to show. Exclusions apply account-wide, confirm with the
    user before any exclusion write, preview first, apply only after approval.
12. **Close the cycle.** Document changes made, deferred items, quality-trend direction, and the next pass
    dates. Carry forward any new learning-gate dates for step 2.

## Decision rules
- Learning windows: new campaign 4-6 weeks; bid-strategy or bidding-signal change 2-4 weeks; budget moved more
  than ~20% 1-2 weeks; asset-group change 1-2 weeks; audience-signal overhaul 2-3 weeks.
- Negative trigger: query spent ~3x target CPA with zero quality conversions, is off-topic, or shows
  employment intent. Borderline terms: wait one more week rather than cut reach.
- Brand share of PMax impressions under 30%; above that, reported CPA flatters the campaign.
- Asset tiers: above-average CTR and conversion rate = keep; average with volume = watch; below-average at
  1,000+ impressions = replace; under 500 impressions after 2 weeks = check approval; 1,000+ impressions with
  zero conversions = replace immediately. Max 1-2 swaps per type per cycle.
- Channel spend (lead gen, no Shopping): Search 40-60% (investigate under 30% or over 70%); Display 10-25%
  (investigate over 30% with weak conversions); Video 5-20% (investigate over 25% with no uploaded video);
  Gmail/Discover 5-15% (investigate over 20% with low engagement).
- Customer Match: at least 1,000 matched members, refreshed at least quarterly; older than 90 days = stale.
- Quality escalation: one month of declining downstream rates = tighten signals and negatives; two consecutive
  months = move the bidding signal downstream. If PMax leads close meaningfully worse than Search leads,
  audit audience signals and channel mix before adding budget.
- Asset groups: under 30 quality conversions/month = consolidate; over 200 = consider splitting, only if each
  side keeps 30+ (ideally 100+) per month. Separate campaigns only when offers differ in margin or value and
  each can sustain 30+ quality conversions/month.

## Common failure modes
- Bidding on form fills "temporarily", PMax learns to find form-fillers, and undoing that costs a full
  relearning cycle. Gate on the import before every pass.
- Celebrating volume while MQL-to-SQL quietly halves, the monthly quality review is the whole point of
  lead-gen PMax; never skip it.
- A Customer Match list uploaded once at launch and never refreshed, the strongest signal decays into noise.
- Swapping every asset in one sitting, which destroys attribution of the improvement.
- Weekly structural tinkering that keeps the campaign in permanent learning.
- Changing the bidding signal and judging results a week later, the switch restarts learning; wait the window.
- Import pipeline silently down for two weeks, the day-by-day gap check in step 1 exists to catch exactly this.

## Related skills
- Before: launch-pmax-for-lead-gen-saas (build), set-up-offline-conversion-tracking (signal plumbing),
  build-customer-match-lists (seed audiences).
- Alongside: run-a-weekly-performance-review (account level).
- Deep dives: manage-pmax-search-terms-and-brand-defense (query promotion and brand routing),
  run-n-gram-analysis (pattern negatives), run-a-creative-testing-cycle (asset swaps).
- Ecommerce twin: run-pmax-ecommerce-optimization-cycle.
