spend-efficiency
Analyze spend efficiency across all campaigns and find optimization opportunities. Flags high CPA campaigns, zero-conversion ad groups, broad match bleeding, and low quality scores. Ranks findings by potential savings. Use when: "/spend-efficiency", "where am I wasting money", "optimize spend", "efficiency audit", "wasted spend", "campaign efficiency", "find savings".
Spend Efficiency Analyzer
You are running a spend efficiency audit across all campaigns. The goal: find where money is being wasted and rank opportunities by potential savings.
Before you start, read the ads-playbook skill to load target CPA, wasted spend thresholds, and business context.
Step 1: Pull Campaign-Level Performance
Run this GAQL query to get all enabled campaigns:
SELECT
campaign.name,
campaign.status,
campaign.advertising_channel_type,
metrics.cost_micros,
metrics.conversions,
metrics.cost_per_conversion,
metrics.clicks,
metrics.impressions,
metrics.ctr,
metrics.average_cpc,
metrics.search_impression_share
FROM campaign
WHERE segments.date DURING LAST_30_DAYS
AND campaign.status = 'ENABLED'
ORDER BY metrics.cost_micros DESC
Cost conversion: Divide cost_micros, cost_per_conversion, and average_cpc by 1,000,000.
Step 2: Pull Ad Group-Level Performance
For each campaign, pull ad group data to find zero-conversion ad groups:
SELECT
campaign.name,
ad_group.name,
ad_group.status,
metrics.cost_micros,
metrics.conversions,
metrics.clicks,
metrics.impressions,
metrics.ctr,
metrics.cost_per_conversion
FROM ad_group
WHERE segments.date DURING LAST_30_DAYS
AND campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND metrics.cost_micros > 0
ORDER BY metrics.cost_micros DESC
Step 3: Pull Keyword Match Type Data
Check for broad match bleeding:
SELECT
campaign.name,
ad_group.name,
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
metrics.cost_micros,
metrics.conversions,
metrics.clicks,
metrics.impressions,
metrics.cost_per_conversion,
ad_group_criterion.quality_info.quality_score
FROM keyword_view
WHERE segments.date DURING LAST_30_DAYS
AND campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND metrics.cost_micros > 0
ORDER BY metrics.cost_micros DESC
Step 4: Flag Issues
Analyze the data and flag these categories:
A. High CPA Campaigns
Campaigns where CPA exceeds the target from the ads-playbook.
For each flagged campaign:
- Current CPA vs target CPA
- How much was spent above the target
- Potential savings if CPA hit target
B. Zero-Conversion Ad Groups with Significant Spend
Ad groups that spent above the playbook's zero-conversion kill threshold without a single conversion.
For each:
- Ad group name, campaign name
- Total spend (all wasted)
- Number of clicks (to gauge if there's enough data)
C. Broad Match Bleeding
Keywords on broad match that are consuming disproportionate budget with poor results. Flag if:
- Broad match keyword has CPA > 2x the target
- Broad match keyword has CTR < half the campaign average
- Broad match keyword has zero conversions and significant spend
For each:
- Keyword text, match type
- Spend, conversions, CPA
- Recommendation: tighten to phrase/exact or add negatives
D. Low Quality Score Keywords
Keywords with Quality Score below 5 that are still accumulating spend. Low QS = paying more per click for worse positions.
For each:
- Keyword text, Quality Score
- Spend, CPA
- Recommendation: improve ad relevance, improve landing page, or pause
Step 5: Rank by Potential Savings
Create a ranked list of all flagged items sorted by estimated savings (highest first).
Savings estimation:
- Zero-conversion ad groups: savings = total spend (it's all wasted)
- High CPA campaigns: savings = spend - (conversions * target CPA)
- Broad match bleeding: savings = spend on flagged broad terms with zero conversions
- Low QS keywords: savings = estimated CPC reduction * clicks (rough: assume QS improvement saves ~20% of CPC)
Step 6: Present the Report
Summary
- Total spend analyzed: $X,XXX
- Total potential savings identified: $X,XXX (X% of spend)
- Number of issues found: X
Prioritized Recommendations
| Priority | Type | Item | Spend | Savings | Action |
|---|---|---|---|---|---|
| 1 | Zero-conv AG | "Brand Awareness" in Campaign X | $450 | $450 | Pause ad group |
| 2 | High CPA | Campaign Y (CPA: $120 vs $45 target) | $2,400 | $1,200 | Review targeting |
| 3 | Broad match | "meeting software" (broad) | $380 | $380 | Tighten to phrase |
| ... | ... | ... | ... | ... | ... |
For each recommendation, include a specific action the user can take.
Step 7: Offer to Execute
For actionable items (pausing ad groups, changing match types), ask:
"I can pause the zero-conversion ad groups and tighten the broad match keywords. Want me to do any of these? I'll confirm each change before executing."
Wait for explicit approval on each change.
Edge Cases
- No MCP connected: Ask the user to paste campaign performance data (from Google Ads export) and analyze that.
- New account with limited data: Note that 30 days may not be enough for statistical significance. Flag items but caveat the recommendations.
- Single campaign: Still run all checks at ad group and keyword level.
- Meta Ads: Pull campaign and ad set performance. Flag high-CPA ad sets, zero-conversion ad sets, and audience overlap issues.
- Apple Search Ads: Pull campaign and keyword performance. Flag high-CPI keywords and discovery match bleeding (Apple's equivalent of broad match).