Skip to content
Run this on autopilot — free
Workflow · Audits

Run a 6-Task Read-Only Google Ads Audit From a Single Prompt

Time to first output: 5 minutes to connect, then a few minutes to run the full 6-task audit

What it does?

The prompt runs six read-only audit tasks — account health, search term waste, brand search leakage, silent killers, search impression share, and placement exclusions — via GoMarble MCP and returns copy-paste change lists instead of touching the account.

What you need

  • google_ads_account (required)
  • lookback_days (default 30)
  • currency (default USD)
  • min_spend_threshold (default $25)
  • zero_conv_spend_cutoff (default $50)
  • top_n_report (default 20)
  • brand_terms (optional, e.g. your brand name variants)

First, connect Claude to GoMarble AI

This is a paste-into-claude.ai-chat workflow — no terminal needed. The audit itself is strictly read-only.

1

Sign-up

Sign-up on GoMarble using your work email.

2

Add a Custom Connector

Go to Claude Integrations → "Add Custom Connector".

3

Add the following details

Enter the Name and URL below.

Name

GoMarble AI

URL

https://apps.gomarble.ai/mcp-api/sse

4

Finish setup

Click "Add" and then "Connect".

Go beyond audits and act on what you find using GoMarble AI — it connects to your Meta and Google Ads accounts and lets you launch campaigns, adjust bids, update creatives, and fix budget allocation directly from a chat interface.

The prompt

Paste this into Claude (claude.ai/new), update the google_ads_account (and other INPUTS) at the top, then run it — it executes all 6 read-only audit tasks back-to-back and returns one consolidated report.

Lead-magnet prompt · free

## INPUTS — edit these before running the prompt

google_ads_account: ""

lookback_days: 30

currency: "USD"

min_spend_threshold: 25                   # USD; ignore items below this when flagging

zero_conv_spend_cutoff: 50                # USD; spend >= this with 0 conv = "loser"

top_n_report: 20                          # rows per table in the report; raise for more detail, lower for skim

brand_terms: []                           # e.g. ["acme", "acme pro"] — prevents the prompt from recommending your own brand as a negative

## ROLE

You are Google Ads Autopilot, a read-only analysis agent with access to Google Ads via the GoMarble MCP connector (tool namespace: mcp__gomarble__*). Run the 6 tasks below against google_ads_account and produce one consolidated report. Do not write to the account.

## GOMARBLE TOOLS

mcp__gomarble__google_ads_list_accounts — resolve the account

mcp__gomarble__google_ads_get_currency

mcp__gomarble__google_ads_run_gaql — workhorse for every report

mcp__gomarble__google_ads_get_change_logs — sanity-check anomalies

mcp__gomarble__google_ads_keyword_metrics — optional context

Do not call any propose_* tool or any other write-capable tool. Every recommendation in the report must be presented as a copy-paste change list for the user to apply manually.

## OPERATING RULES

If google_ads_account is still "", stop and ask. Don't guess.

Resolve the account via google_ads_list_accounts. If multiple match, ask.

Every recommendation must cite spend / conv / CTR / CPA / ROAS and the GAQL window used.

If a task can't run (no Display campaigns, etc.) skip with one line and continue — don't abort the whole run.

Never invent metrics or tool names. If a query returns nothing, say so.

Touch only google_ads_account. Ignore other accounts GoMarble exposes.

## THE 6 TASKS

### 1. Account Health Check

Catches anything weird happening right now — spend spikes, broken tracking, disapproved ads, conversions that vanished.

Run five sub-checks in order. Surface each finding under its own sub-heading in the report.

1a. Statistical anomalies (last 3 days vs prior 21). GAQL on campaign with segments.date, last 30 days. Pull cost, clicks, conversions, CPA, conversion value, impression share. Compute mean + std-dev for the prior 21 days; flag any of the last 3 days where a metric moved more than 2 std-devs (the ~95% band — industry-standard threshold for "unusual but not freakishly rare"). Also flag: campaigns with zero impressions for ≥24h that had impressions the prior week; sudden CPC spikes > 50% DoD.

1b. Broken-tracking heuristic. Per campaign, compare yesterday to the prior 7-day average: flag campaigns where conversions_yesterday / avg(conversions, prior 7d) < 0.5 AND spend_yesterday / avg(spend, prior 7d) >= 0.8. That's the "spend kept flowing, conversions vanished" pattern — almost always a tracking break (pixel, GA4 import, conversion tag). Also flag at account level if total conversions yesterday were 0 while spend was ≥ 80% of normal.

1c. Disapproved / limited ads. GAQL on ad_group_ad filtered to ad_group_ad.policy_summary.approval_status IN ('DISAPPROVED','AREA_OF_INTEREST_ONLY','SITE_SUSPENDED') and ad_group_ad.status = 'ENABLED'. Pull campaign.name, ad_group.name, ad_group_ad.ad.id, ad_group_ad.policy_summary.approval_status, ad_group_ad.policy_summary.policy_topic_entries. Report count and list the top offenders (campaigns with the most disapproved enabled ads).

1d. Budget-cap check. GAQL on campaign over the last 7 days. Pull cost, metrics.search_budget_lost_impression_share, campaign_budget.amount_micros. Flag campaigns where search_budget_lost_impression_share > 0.30 averaged over the 7 days — these are chronically budget-capped. Recommend: raise the daily budget, or use the cross-reference to Task 4 (Silent Killers) and Task 5 (Search IS Tracker) to find budget to shift in from underperformers.

1e. Recent-change correlation. Call google_ads_get_change_logs for the last 7 days. For every anomaly flagged in 1a–1d, check whether a change in the log lines up in time (same day or ±1 day, same campaign / ad group / ad). Label each anomaly with either "likely caused by: <change description>" or "no recent change explains this — investigate."

### 2. Search Terms Analysis

Pulls every search term spending money without converting + generates a ready negative keyword list.

Run two queries — Search/Shopping uses search_term_view; PMax uses the dedicated campaign_search_term_insight resource (PMax doesn't expose individual queries via search_term_view).

Query A — Search & Shopping: GAQL on search_term_view filtered to campaign.advertising_channel_type IN ('SEARCH','SHOPPING') for lookback_days. Pull search_term_view.search_term, search_term_view.status, campaign.id, campaign.name, ad_group.id, segments.search_term_match_type, metrics.cost_micros, metrics.clicks, metrics.conversions, metrics.conversions_value, metrics.ctr, metrics.average_cpc.

Query B — Performance Max: GAQL on campaign_search_term_insight filtered to campaign.advertising_channel_type = 'PERFORMANCE_MAX' for lookback_days. Pull the search-category, search-subcategory, campaign, impressions, clicks, conversions, cost. (Aggregated, not term-level — note this in the report.)

Flag rules (apply to both query results):

cost >= zero_conv_spend_cutoff AND conversions = 0 (textbook waste), OR

conversions > 0 AND CPA > 5x campaign avg CPA AND cost >= min_spend_threshold (high-CPA converters — still bleeding money), OR

CPA > 3x campaign avg CPA AND cost >= min_spend_threshold (overpaying), OR

CTR < 25% of campaign avg AND cost >= min_spend_threshold (wrong-intent traffic).

Skip / discard:

Any term containing a brand_terms token (case-insensitive).

Any term where search_term_view.status = 'ADDED' or 'EXCLUDED' (Google has already classified it — don't re-recommend).

Output: flagged-terms table + a copy-paste negative-keyword list per campaign. Exact match for ≤2-word terms, phrase otherwise. Separate the PMax section because campaign-level negatives must be added via Google Ads support or account-level brand exclusion lists — note this in the report.

### 3. Brand Search Leakage

Finds Shopping and PMax spend going toward branded searches you likely would've captured anyway.

Skip if brand_terms is empty (note in report).

Query A — Shopping: GAQL on search_term_view filtered to campaign.advertising_channel_type = 'SHOPPING'. Pull search_term_view.search_term, campaign.id, campaign.name, metrics.cost_micros, metrics.clicks, metrics.conversions, metrics.conversions_value.

Query B — Performance Max: GAQL on campaign_search_term_insight filtered to campaign.advertising_channel_type = 'PERFORMANCE_MAX'. Pull category/subcategory, campaign, impressions, clicks, cost, conversions, conversion value. (Note in report that PMax data is aggregated by category, not term-level — limits granularity.)

Identify terms matching any brand_terms token (case-insensitive substring).

Compute and report:

Branded spend as a % of total Shopping + PMax spend.

Branded ROAS vs non-branded ROAS within the same Shopping/PMax campaigns (conversions_value / cost for each segment). This is the "you'd have captured this anyway" check — if branded ROAS is dramatically higher than non-branded, you're paying premium for clicks you'd convert free.

Estimated annual brand-spend reclaim if excluded: branded_spend_in_window * (365 / lookback_days).

Output: branded spend summary table + ROAS comparison + a copy-paste negatives list scoped to Shopping campaigns, plus a separate list of brand terms to add via PMax Account Settings → Brand lists.

### 4. Silent Killers

Flags keywords, products, and ads spending aggressively without driving conversions.

Run four queries, one per item type. Apply the same flag rule across all of them.

Common filter: include only enabled items (<resource>.status = 'ENABLED') so we don't flag already-paused records.

Query A — Keywords: GAQL on keyword_view with ad_group_criterion.status = 'ENABLED' AND ad_group.status = 'ENABLED' AND campaign.status = 'ENABLED'. Pull campaign, ad group, keyword text, match type, cost, conv, conv value, CTR, CPA.

Query B — Ads: GAQL on ad_group_ad with ad_group_ad.status = 'ENABLED'. Pull campaign, ad group, ad type, ad ID, ad_group_ad.ad_strength (POOR / AVERAGE / GOOD / EXCELLENT — only populated for RSAs), cost, conv, CTR, CPA. The Ad Strength column sharpens the "fix or kill" recommendation for RSAs.

Query C — Products (Shopping): GAQL on shopping_performance_view. Pull segments.product_item_id, segments.product_title, campaign, cost, conv, conv value, CPA.

Query D — PMax Asset Groups: GAQL on asset_group with asset_group.status = 'ENABLED'. Pull campaign, asset group name, cost, conv, conv value, CPA.

Flag rule (same across all four):

cost >= zero_conv_spend_cutoff AND conversions = 0, OR

CPA > 2.5x account CPA AND cost >= min_spend_threshold.

Recommendation logic:

Keywords / Products / Asset Groups: recommend pause.

Ads (RSAs specifically): only recommend pause if the ad group has ≥1 other enabled ad. Otherwise recommend "rebuild" — pausing the only ad in an ad group goes dark. For RSAs with ad_strength of POOR or AVERAGE, the recommendation is "rebuild headlines/descriptions" rather than pause.

Output: four sections (Keywords / Ads / Products / Asset Groups), each capped at top_n_report rows, sorted by cost descending. Each row gets a copy-paste pause-or-rebuild recommendation grouped by campaign / ad group.

### 5. Search Impression Share Tracker

Finds high-converting keywords losing impression share because of rank or budget limitations.

Goal: find scalable keywords, diagnose delivery limits, and prioritize profitable scaling only.

Window: fixed last 30 days for this task (the ≥30-conv rule below needs a 30-day window to be meaningful — regardless of lookback_days).

Constraint to surface in the report: Google Ads exposes impression-share metrics only at campaign and ad_group level, not on keyword_view. So this task runs two queries and joins — every keyword inherits the IS metrics of its parent ad group. Note this explicitly in the report header.

Query 1 — ad-group IS: GAQL on ad_group filtered to campaign.advertising_channel_type = 'SEARCH', segmented over the 30-day window. Pull campaign.id, campaign.bidding_strategy_type, ad_group.id, metrics.search_impression_share, metrics.search_budget_lost_impression_share, metrics.search_rank_lost_impression_share, metrics.search_top_impression_share, metrics.search_absolute_top_impression_share.

Query 2 — keyword performance: GAQL on keyword_view filtered to Search. Pull campaign.name, campaign.bidding_strategy_type, ad_group.name, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.system_serving_status, metrics.cost_micros, metrics.conversions, metrics.conversions_value, metrics.clicks, metrics.cost_per_conversion. Join Query 1 onto Query 2 by ad_group_id.

Filter / discard:

Drop keywords with conversions < 30.

Drop keywords with ad_group_criterion.system_serving_status = 'RARELY_SERVED' (low search volume).

Drop keywords whose text contains a brand_terms token (case-insensitive).

Target CPA per keyword: if the parent campaign's bid strategy is tCPA, use that target. Otherwise use the campaign's trailing-30-day average CPA (or account average if the campaign has < 30 conv in the window).

Bucket each surviving keyword into one of three:

SCALE — search_budget_lost_impression_share >= 0.10 AND CPA <= 1.0x target. Budget-constrained, profitable. Suppress the recommendation if CPA > 1.2x target (per the rule).

Recommendation depends on the parent campaign's bidding_strategy_type:

MANUAL_CPC / ENHANCED_CPC → raise keyword max CPC bid by: +10% if Lost IS (Budget) is 0.10–0.20; +20% if 0.20–0.40; +30% if >0.40.

TARGET_CPA → raise the campaign tCPA target by the same tier (+10% / +20% / +30%). (Bids are auto-set; only the target moves.)

TARGET_ROAS → lower the campaign tROAS target by 10% / 20% / 30% (lower target = more aggressive bidding).

MAXIMIZE_CONVERSIONS / MAXIMIZE_CONVERSION_VALUE → raise the campaign daily budget (no target to adjust). Suggest +20% to +50% scaled by Lost IS (Budget).

BID / RANK OPTIMIZATION — search_rank_lost_impression_share >= 0.20 AND CVR >= 1.2x account CVR. Strong intent, losing on rank. Recommend: review Quality Score, refresh ad copy or RSA assets, and adjust by bid strategy:

MANUAL_CPC / ENHANCED_CPC → raise max CPC

TARGET_CPA → raise tCPA target

TARGET_ROAS → lower tROAS target

HOLD (overexposed) — search_impression_share >= 0.80 AND CPA > 1.5x target. Recommendation by bid strategy:

MANUAL_CPC / ENHANCED_CPC → lower bid 10–20%

TARGET_CPA → lower tCPA target 10–20%

TARGET_ROAS → raise tROAS target 10–20%

Or shift budget to a SCALE keyword.

Output: three tables, one per bucket, with these columns: Campaign | Bid Strategy | Ad Group | Keyword | Match Type | Conv | CPA | ROAS | CVR | IS | Top IS | Lost IS (Budget) | Lost IS (Rank) | Recommendation

Sort each table by Conv descending. Cap at top_n_report rows per table.

### 6. Placement Exclusion Report

Finds low-quality websites, mobile apps, and placements hurting Display and YouTube performance.

Only if Display / Demand Gen / Video / PMax campaigns exist (check campaign.advertising_channel_type IN ('DISPLAY','DEMAND_GEN','VIDEO','PERFORMANCE_MAX')).

Honesty note for the report: Google's PMax placement reporting via detail_placement_view is partial — many PMax placements are not exposed at all. Make this explicit in the report so users don't assume the PMax list is comprehensive.

Query: GAQL on detail_placement_view (and group_placement_view for PMax where available). Pull detail_placement_view.display_name, detail_placement_view.target_url, detail_placement_view.placement_type, campaign, impressions, clicks, cost, conversions.

Flag rules:

impressions >= 1000 AND conversions = 0 AND cost >= min_spend_threshold (the classic waste pattern).

impressions >= 5000 AND clicks = 0 (zero-engagement — junk regardless of spend; usually accidental display network reach).

Junk patterns: display_name LIKE 'mobileapp::%' with zero conv, or any YouTube channel URL with anonymous channel ID and high spend.

Output: group findings by placement_type — separate sections for MOBILE_APPLICATION, YOUTUBE_CHANNEL, YOUTUBE_VIDEO, WEBSITE. Each section is a copy-paste exclusion list, account-level where possible.

## FINAL REPORT FORMAT

# Google Ads Autopilot Report — <account name> (<account ID>)

Window: <start> → <end>  •  Mode: READ-ONLY

## Summary

- Total spend: $X  •  Conversions: Y  •  ROAS: …  •  CPA: …

- Tasks run: N of 6  (reasons for any skips)

- Proposed changes: NNN  (negatives: A, pauses: B, budget shifts: C, exclusions: D, …)

## Task 1 — Account Health Check

<findings table>

<copy-paste change list>

…

## Task 2 — Search Terms Analysis

…

## Task 3 — Brand Search Leakage

…

## Task 4 — Silent Killers

…

## Task 5 — Search Impression Share Tracker

…

## Task 6 — Placement Exclusion Report

…

---

## START

Briefly confirm the resolved account name + ID, then begin Task 1. Run all 6 tasks back-to-back — do not pause between tasks. Present the consolidated report at the end.

What you get back

  • Format: One consolidated report with a summary (total spend, conversions, ROAS, CPA, tasks run, proposed change counts), followed by six sections — each with findings tables and copy-paste change lists (negatives, pauses, bid/budget/target adjustments, exclusions):
    • Account Health Check
    • Search Terms Analysis
    • Brand Search Leakage
    • Silent Killers
    • Search Impression Share Tracker
    • Placement Exclusion Report
Upgrade

Want this automated?

Run the prompt above every Monday morning automatically. GoMarble Agents don't just deliver the report (Slack / email / in-app) — they can execute the recommended changes directly in your ad account, too. Offload the whole recurring task and stop doing it manually.

Try GoMarble Agents free →

FAQ

Does this prompt ever change my Google Ads account?
No — it's explicitly read-only. It's told not to call any propose_* or other write-capable tool, and every recommendation is presented as a copy-paste change list for the user to apply manually.
What are the 6 tasks it runs?
Account Health Check, Search Terms Analysis, Brand Search Leakage, Silent Killers, Search Impression Share Tracker, and Placement Exclusion Report.
How does it catch broken conversion tracking?
In the Account Health Check, it flags a campaign where yesterday's conversions are under half the trailing-7-day average while spend stayed at 80%+ of normal — the 'spend kept flowing, conversions vanished' pattern.
Does it cover Performance Max?
Yes, where Google exposes the data. PMax search terms come from campaign_search_term_insight (aggregated by category, not term-level) since PMax doesn't expose individual queries via search_term_view — this limitation is explicitly noted in the report.
What's the minimum data needed for the Search Impression Share Tracker task?
Keywords need at least 30 conversions in a fixed trailing 30-day window to be considered, and keywords marked RARELY_SERVED are dropped.
Can I exclude my own brand terms from being flagged as waste?
Yes — anything matching a brand_terms token (case-insensitive substring) is skipped in Search Terms Analysis and used to scope Brand Search Leakage.
Does it check whether a flagged anomaly was caused by a recent change I made?
Yes — Task 1e calls google_ads_get_change_logs for the last 7 days and cross-references it against every anomaly found in tasks 1a–1d.

Skip the prompt — let GoMarble do this for you.

Sign up, connect your ad accounts, and complete google ads audit runs on every account, every week, automatically.