Full Google Ads review that synthesizes tracking, search terms, intent mapping, negatives, structure, RSAs, budget decisions, and PMax context into a single operator read.
Library skill — the default version is maintained in GitHub; edits you make live in your own clone.
This is the broad review. Not just a checklist. A synthesis of what the account is learning, where it is leaking, and what should change.
Read first:
- google-ads/references/operator-thesis.md
- google-ads/references/intent-map.md
- google-ads/references/query-patterns.md
- google-ads/references/negatives-playbook.md
- google-ads/references/tracking-playbook.md
- google-ads/references/structure-playbook.md
- google-ads/references/rsa-playbook.md
- google-ads/references/budget-playbook.md
- google-ads/references/benchmarks.md
- google-ads/references/deliverable-templates.md
Read workspace if available:
- All workspace/ads/ files except assets.md (unless creative output is needed)
- Including workspace/ads/drafts/_index.md — check for existing pending drafts
The audit pulls data across all skill areas. Run queries in this order (each feeds into the next):
1. Account overview:
SELECT
customer.id,
customer.descriptive_name,
customer.currency_code,
customer.time_zone,
customer.auto_tagging_enabled
FROM customer
2. Tracking health (check trust first):
SELECT
conversion_action.name,
conversion_action.type,
conversion_action.category,
conversion_action.counting_type,
conversion_action.include_in_conversions_metric,
metrics.conversions,
metrics.all_conversions
FROM conversion_action
WHERE segments.date DURING LAST_30_DAYS
AND conversion_action.status = 'ENABLED'
ORDER BY metrics.conversions DESC
3. Campaign performance and structure:
SELECT
campaign.name,
campaign.status,
campaign.advertising_channel_type,
campaign.bidding_strategy_type,
campaign_budget.amount_micros,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions,
metrics.conversions_value,
metrics.cost_per_conversion,
metrics.search_impression_share,
metrics.search_budget_lost_impression_share
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESC
4. Search terms (top 500 by spend):
SELECT
search_term_view.search_term,
campaign.name,
ad_group.name,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions,
metrics.conversions_value
FROM search_term_view
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESC
LIMIT 500
Retrieval ladder — if the search-term query returns no rows, follow the shared retrieval ladder in data/search-term-retrieval.md. Report the resulting retrieval_mode in the audit header. Mark search-term sections as "PMax visibility-limited" when operating in pmax-fallback mode. In limited mode, note the gap and request a UI export.
5. Ad group structure:
SELECT
campaign.name,
ad_group.name,
ad_group.status,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM ad_group
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY campaign.name
6. Keyword view (targeted keywords — cross-reference with search terms):
SELECT
campaign.name,
ad_group.name,
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
ad_group_criterion.status,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM keyword_view
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESC
LIMIT 200
7. Existing negatives:
SELECT
campaign.name,
campaign_criterion.keyword.text,
campaign_criterion.keyword.match_type
FROM campaign_criterion
WHERE campaign_criterion.negative = TRUE
AND campaign_criterion.type = 'KEYWORD'
8. RSA assets (if time permits):
SELECT
asset.text_asset.text,
asset.type,
ad_group_ad_asset_view.performance_label,
ad_group_ad_asset_view.field_type,
campaign.name,
metrics.impressions,
metrics.clicks,
metrics.conversions
FROM ad_group_ad_asset_view
WHERE segments.date DURING LAST_30_DAYS
AND campaign.status = 'ENABLED'
ORDER BY metrics.impressions DESC
See data/gaql-recipes.md for additional/variant queries.
All date-ranged queries above default to LAST_30_DAYS. If results are empty or near-zero (<$5 total spend):
DURING LAST_90_DAYSThis prevents reporting "no data" on paused or seasonal accounts that have useful history.
Ask the user for as much as they can provide: - Campaign overview (last 30 days) - Search Terms report (last 30 days, top 200+) - Conversion actions list - Current negative keyword list - RSA asset report (optional) - Any notes on tracking, recent changes, or known issues
The audit works with partial data — it will note confidence limitations.
If tracking is weak, say so immediately. Assign tracking confidence level (High/Medium/Low/Broken). Note which downstream conclusions are conditional on tracking trust.
Summarize the query and intent reality. Build or update the Intent Map. Note where intent classes are well-routed vs. poorly routed.
Identify junk, ambiguity, and routing failures. Quantify the waste. Separate "waste from bad queries" from "waste from bad structure."
Distinguish exclusion from structure problems. Default to isolation when in doubt. Also review existing negatives for harm: Check if any current negatives are blocking traffic that matches the business's services. Smart campaign auto-negatives and inherited negatives are common culprits. If harmful negatives are found, include a "Negatives to Remove" section in the negative draft.
Focus on where meaning is being mixed. Prioritize by spend impact, not by cosmetic neatness.
Check whether ads reflect real intent and LP promise. Note specific gaps between search language and ad copy.
Make support/protect/reduce/hold decisions. Gate budget scaling behind tracking confidence.
When conversion rates look suspiciously low, run a quick Fork A check (tracking) before blaming the landing page. If clicks are high but conversions are near-zero, the tag may not be firing — not the page's fault. For full landing page → conversion path diagnosis, delegate to /google-ads landing-review. See skills/google-ads-landing-review/SKILL.md and google-ads/references/landing-page-playbook.md.
Be explicit about inference vs. direct evidence. Check for branded/high-intent cannibalization.
The audit produces multiple drafts organized by priority. Not everything needs fixing at once.
Priority tiers: 1. Fix first — tracking problems that gate everything else 2. Quick wins — clear negatives that stop obvious waste 3. Strategic moves — structure changes, budget reallocation 4. Refinement — RSA refreshes, minor optimizations
For each tier with actionable findings, create a draft:
- Tracking fixes → drafts/templates/tracking-draft.md → workspace/ads/drafts/YYYY-MM-DD-[account-slug]-tracking-fix.md
- Negatives → drafts/templates/negative-draft.md → workspace/ads/drafts/YYYY-MM-DD-[account-slug]-negatives.md
- Structure → drafts/templates/structure-draft.md → workspace/ads/drafts/YYYY-MM-DD-[account-slug]-structure.md
- Budget → drafts/templates/budget-draft.md → workspace/ads/drafts/YYYY-MM-DD-[account-slug]-budget-realloc.md
- RSAs → drafts/templates/rsa-draft.md → workspace/ads/drafts/YYYY-MM-DD-[account-slug]-rsa-refresh.md
- Landing page → drafts/templates/landing-review-draft.md → workspace/ads/drafts/YYYY-MM-DD-[account-slug]-landing-review.md
Cross-reference dependencies between drafts. E.g., "Apply tracking fix before budget scaling."
Update workspace/ads/drafts/_index.md with all new drafts.
If 2 or more drafts are created in the same audit run, also write workspace/ads/drafts/_batch-YYYY-MM-DD-[account-slug].md with:
- Account, date range, and tracking confidence
- Drafts created in that run grouped by priority tier
- Dependency chain and recommended review order
- Quick-apply candidates
Do not list the _batch-*.md packet in _index.md. It is an audit packet, not a draft.
workspace/ads/intent-map.md — build or update from search termsworkspace/ads/findings.md — audit findings logworkspace/ads/negatives.md — recommended negativesworkspace/ads/learnings.md — what we learnedworkspace/ads/account.md — account context if this is first audit