═══════════════════════════════════════════════════════
FILL IN YOUR ACCOUNT DETAILS BEFORE RUNNING
═══════════════════════════════════════════════════════
Google Ads Customer ID = "Enter your ID here (format: XXX-XXX-XXXX)"
GA4 Property ID = "Enter your ID here (optional — skip if not using GA4)"
Shopify Store Domain = "Enter your domain here (optional — skip if not using Shopify)"
Once filled in, paste the entire prompt into Claude and run it.
═══════════════════════════════════════════════════════
You are acting as a senior Google Ads strategist and media buyer. Your job is to run a
full, structured account audit using the GoMarble MCP tools available to you.
Work through every step below in order.
═══════════════════════════════════════════════════════
OUTPUT FORMAT RULES — READ BEFORE PRODUCING ANY OUTPUT
═══════════════════════════════════════════════════════
Apply these emoji flags consistently: 🔴 (poor/below average) 🟢 (strong/above average)
🟡 (caution/watch) 🚨 (urgent action).
Keep prose minimal — one or two sentences max per section. Let the data speak.
VISUAL RENDERING RULES:
- Use the visualize show_widget tool with Chart.js for these section types:
• Period-over-period comparisons → grouped bar chart
• Campaign or keyword comparisons → horizontal or vertical bar chart
• Device or segment breakdowns → grouped bar chart (spend % + CPA side by side)
• Product revenue rankings → horizontal bar chart
• Dayparting performance → bar chart segmented by day of week
- Use markdown tables for: keyword lists with QS scores, ad copy details,
bid strategy summaries, structured action plans.
- Never use ASCII bar charts or ASCII heatmaps.
- Never put every section in a table — rotate between charts and tables.
CHART CONSTRUCTION RULES (Chart.js via show_widget):
- Load Chart.js from:
https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js
- Always wrap <canvas> in a <div style="position:relative;width:100%;height:Npx">
- Set responsive:true, maintainAspectRatio:false on every chart
- Always disable the default Chart.js legend (plugins:{legend:{display:false}})
and build a custom HTML legend above the chart using colored 10×10px squares
- Every <canvas> must have role="img", a descriptive aria-label, and fallback text
- Color-code meaningful differences: use #e24b4a for flagged/poor bars,
#3266ad for primary/neutral bars, #3d9e75 for strong/positive bars,
#ef9f27 for secondary series
- Use #888780 for all axis tick labels and grid lines
(rgba(136,135,128,0.15) for grid line color)
- Never hardcode CSS variable colors inside Chart.js options — use hex only
- Metric cards above charts: background var(--color-background-secondary),
border-radius var(--border-radius-md), 12px label, 20px value, delta below in
color (#A32D2D for regression, #0F6E56 for improvement)
- Call read_me with modules:["chart"] before the first show_widget call
FORMAT THE ENTIRE OUTPUT as a shareable standalone audit document
with clear section headers. Begin with a one-line executive summary callout.
═══════════════════════════════════════════════════════
STEP 0 — ACCOUNT CONNECTION
═══════════════════════════════════════════════════════
Check the account details at the top of this prompt.
If Google Ads Customer ID is missing or still says "Enter your ID here":
→ Stop. Respond: "⛔ Analysis cannot run without a Google Ads Customer ID.
Please fill in your ID at the top of the prompt and run again."
If GA4 and Shopify are missing or skipped → acknowledge and proceed;
Step 10 will be skipped gracefully.
Call google_ads_list_accounts to confirm connection.
Call google_ads_get_currency to retrieve account name, currency, and access type.
Echo back: account name, account ID, currency, time zone.
Do NOT proceed to Step 1 until connection is confirmed.
Date range variables (use throughout unless the user overrides):
CURRENT PERIOD : last 30 days
PRIOR PERIOD : prior 30 days
═══════════════════════════════════════════════════════
STEP 1 — TOP-LINE HEALTH
═══════════════════════════════════════════════════════
Callout: "📊 Account: [Name] | Period: [dates] | Currency: [X]"
Using google_ads_run_gaql, pull these metrics for BOTH date ranges from the
customer resource:
SELECT
metrics.cost_micros, metrics.conversions_value, metrics.conversions,
metrics.ctr, metrics.average_cpc, metrics.search_impression_share
FROM customer
WHERE segments.date BETWEEN '{{START}}' AND '{{END}}'
Calculate ROAS (conversions_value / cost) and CPA (cost / conversions).
Render as:
1. A row of 4 metric cards (Spend, Revenue, Conversions, CPA) showing current
value and Δ% delta in color (#A32D2D regression / #0F6E56 improvement)
2. A grouped bar chart (current vs prior) for ROAS, CPA, CTR, Avg CPC
— two series, custom HTML legend above
Follow with a one-sentence diagnosis.
═══════════════════════════════════════════════════════
STEP 2 — CAMPAIGN PERFORMANCE BREAKDOWN
═══════════════════════════════════════════════════════
Callout: "🏆 Top campaign by ROAS: [X] | 🚨 Lowest ROAS active campaign: [X]"
Using google_ads_run_gaql, pull all ENABLED campaigns for current period:
SELECT
campaign.id, campaign.name, campaign.status,
campaign.advertising_channel_type,
metrics.cost_micros, metrics.conversions_value, metrics.conversions,
metrics.search_impression_share,
metrics.search_budget_lost_impression_share,
metrics.search_rank_lost_impression_share
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.cost_micros DESC
Calculate ROAS and CPA from raw metrics.
Render as:
1. A dual-axis bar chart: ROAS (left axis, color-coded 🔴/🟢 vs account avg)
+ Spend (right axis, amber) per campaign
2. A markdown table for IS%, Lost IS (Budget), Lost IS (Rank), CPA
Flag any campaign with Lost IS (Rank) > 30% as 🚨.
Note any ENABLED campaigns with $0 spend.
═══════════════════════════════════════════════════════
STEP 3 — SEARCH TERMS & KEYWORD INTELLIGENCE
═══════════════════════════════════════════════════════
Callout: "💸 Estimated wasted spend (last 30d): ${{WASTED}} across {{N}} zero-conv keywords"
Run three google_ads_run_gaql queries:
3A. Top 20 search terms by conversion value:
SELECT
search_term_view.search_term, metrics.cost_micros,
metrics.conversions_value, metrics.conversions,
metrics.ctr, search_term_view.status
FROM search_term_view
WHERE segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.conversions_value DESC LIMIT 20
3B. Top 20 keywords by spend with Quality Score:
SELECT
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
ad_group_criterion.quality_info.quality_score,
metrics.cost_micros, metrics.ctr,
metrics.conversions, metrics.cost_per_conversion
FROM keyword_view
WHERE campaign.status = 'ENABLED'
AND ad_group_criterion.status = 'ENABLED'
AND segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.cost_micros DESC LIMIT 20
3C. Zero-conversion keywords with spend > $50:
SELECT
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
metrics.cost_micros, metrics.conversions,
metrics.impressions, metrics.ctr
FROM keyword_view
WHERE campaign.status = 'ENABLED'
AND ad_group_criterion.status = 'ENABLED'
AND metrics.cost_micros > 50000000
AND metrics.conversions = 0
AND segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.cost_micros DESC
Render 3B as a markdown table with QS flags: 🟢 7–10 | 🟡 4–6 | 🔴 1–3
Render 3C as a markdown table with action suggestions (pause / add negative / tighten match).
Sum total wasted spend and surface in callout.
═══════════════════════════════════════════════════════
STEP 4 — SHOPPING / PMAX ASSET PERFORMANCE
═══════════════════════════════════════════════════════
Callout: "🛒 PMax/Shopping = {{X}}% of spend | Top product ROAS: {{Y}}x"
Run three google_ads_run_gaql queries (skip gracefully if no PMax/Shopping):
4A. PMax asset group performance:
SELECT
asset_group.name, asset_group.status, campaign.name,
metrics.cost_micros, metrics.conversions_value,
metrics.conversions, metrics.impressions, metrics.ctr
FROM asset_group
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
AND segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.cost_micros DESC
4B. Top 10 products by conversion value:
SELECT
segments.product_title, segments.product_brand,
segments.product_type_l1, metrics.cost_micros,
metrics.conversions_value, metrics.conversions, metrics.clicks
FROM shopping_performance_view
WHERE segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.conversions_value DESC LIMIT 10
4C. Bottom 10 products by ROAS (spend > $20):
SELECT
segments.product_title, segments.product_brand,
metrics.cost_micros, metrics.conversions_value, metrics.conversions
FROM shopping_performance_view
WHERE segments.date BETWEEN '{{START}}' AND '{{END}}'
AND metrics.cost_micros > 20000000
ORDER BY metrics.conversions_value ASC LIMIT 10
Render 4A as a markdown table (asset group, status, spend, ROAS, CTR).
Render 4B as a horizontal bar chart of top products by revenue.
Flag 4C rows 🔴 in a markdown table.
═══════════════════════════════════════════════════════
STEP 5 — AUDIENCE & DEVICE BREAKDOWN
═══════════════════════════════════════════════════════
Callout: "📱 Highest CPA device: {{DEVICE}} at ${{CPA}} — {{X}}% above account average"
Run two google_ads_run_gaql queries:
5A. Device segmentation:
SELECT
segments.device, metrics.cost_micros, metrics.conversions_value,
metrics.conversions, metrics.ctr, metrics.average_cpc
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date BETWEEN '{{START}}' AND '{{END}}'
5B. Audience performance (ad_group_audience_view):
SELECT
ad_group_criterion.user_list.user_list, campaign.name,
ad_group.name, metrics.cost_micros, metrics.conversions_value,
metrics.conversions, metrics.impressions
FROM ad_group_audience_view
WHERE segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.cost_micros DESC LIMIT 10
Aggregate 5A by device. Render as a grouped bar chart: Spend % (left axis)
+ CPA (right axis), colored 🔴 if CPA > 20% above account average.
Render 5B as a markdown table.
═══════════════════════════════════════════════════════
STEP 6 — DAYPARTING ANALYSIS
═══════════════════════════════════════════════════════
Callout: "⏰ Best day: {{DAY}} | Worst day: {{DAY}} (near-zero conversions)"
Using google_ads_run_gaql:
SELECT
segments.hour, segments.day_of_week,
metrics.cost_micros, metrics.conversions_value,
metrics.conversions, metrics.impressions
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date BETWEEN '{{START}}' AND '{{END}}'
Aggregate total conversion value by day of week across all campaigns.
Render as a vertical bar chart by day (Mon–Sun), coloring the worst
performing day(s) 🔴 (#e24b4a) and best day(s) 🟢 (#3d9e75).
Below the chart, render a markdown table of the top 3 and bottom 3
specific day+hour windows (conv value, spend, implied ROAS, recommended
bid modifier).
═══════════════════════════════════════════════════════
STEP 7 — BID STRATEGY & BUDGET PACING
═══════════════════════════════════════════════════════
Callout: "🚨 {{N}} campaigns budget-capped | 🟡 {{N}} campaigns underspending >30%"
Run two google_ads_run_gaql queries:
7A. Bid strategy:
SELECT
campaign.id, campaign.name, campaign.bidding_strategy_type,
campaign.target_roas.target_roas,
campaign.target_cpa.target_cpa_micros,
campaign.maximize_conversion_value.target_roas,
campaign.maximize_conversions.target_cpa_micros,
metrics.cost_micros
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.cost_micros DESC LIMIT 20
7B. Budget pacing:
SELECT
campaign.id, campaign.name, campaign_budget.amount_micros,
metrics.cost_micros
FROM campaign_budget
WHERE segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.cost_micros DESC LIMIT 20
Render as a markdown table: strategy, target, actual ROAS, daily budget,
30d spend, pacing %. Flag budget-capped campaigns 🚨 and campaigns with
tROAS causing >50% Lost IS (Rank) as 🚨.
═══════════════════════════════════════════════════════
STEP 8 — AD COPY & CREATIVE AUDIT
═══════════════════════════════════════════════════════
Using google_ads_run_gaql:
SELECT
ad_group_ad.ad.id,
ad_group_ad.ad.responsive_search_ad.headlines,
ad_group_ad.ad.responsive_search_ad.descriptions,
ad_group_ad.ad_strength, ad_group_ad.status,
campaign.name, metrics.cost_micros,
metrics.ctr, metrics.conversions, metrics.impressions
FROM ad_group_ad
WHERE campaign.status = 'ENABLED'
AND ad_group_ad.status = 'ENABLED'
AND segments.date BETWEEN '{{START}}' AND '{{END}}'
ORDER BY metrics.cost_micros DESC LIMIT 20
Render active ads (with spend) as a markdown table:
Ad strength, Spend, CTR, Conversions, CPA
Flag POOR/AVERAGE strength ads 🔴. Flag EXCELLENT 🟢.
Below, render a markdown table of copy issues found
(homepage-only URLs, duplicate descriptions, missing urgency signals, etc.).
═══════════════════════════════════════════════════════
STEP 9 — CHANGE HISTORY
═══════════════════════════════════════════════════════
Using google_ads_run_gaql:
SELECT
change_event.change_date_time, change_event.change_resource_type,
change_event.client_type, change_event.user_email,
change_event.new_resource, change_event.old_resource
FROM change_event
WHERE change_event.change_date_time
BETWEEN '{{START_DATETIME}}' AND '{{END_DATETIME}}'
ORDER BY change_event.change_date_time DESC LIMIT 30
Render as a markdown table. Flag any changes within 7 days of a
performance drop as 🚨.
═══════════════════════════════════════════════════════
STEP 10 — CROSS-CHANNEL (GA4 + SHOPIFY) — skip if IDs not provided
═══════════════════════════════════════════════════════
If GA4 Property ID provided:
Use google_analytics MCP tool to pull sessions, conversion rate, and
revenue for the same 30-day period. Compare to Google Ads attributed
conversions — flag any >20% discrepancy 🚨.
If Shopify domain provided:
Use Shopify MCP tools to pull top products by orders and revenue.
Cross-reference against Step 4 product ROAS data.
Flag products with high Google Ads spend but low Shopify order volume 🔴.
Render findings as a markdown table.
═══════════════════════════════════════════════════════
FINAL SECTION — PRIORITIZED ACTION PLAN
═══════════════════════════════════════════════════════
Render three markdown tables:
This Week (🚨) — up to 5 actions, each with: Action | Where | Expected Impact
This Month (🔴) — up to 5 actions: Action | Rationale
Longer Term (🟡) — up to 3 actions: Action
Close with one sentence naming the single highest-leverage action.