Ad Copy Analyzer -- Google Ads
Analyze Responsive Search Ads (RSAs) for quality gaps, underperforming assets, over-pinning, and messaging diversity. Produces a prioritized replacement plan ranked by ad group spend.
Account Context
Read ${CLAUDE_PLUGIN_ROOT}/profile/account-profile.md at the start of every run.
If it exists:
- Use known account IDs -- skip
list_accounts discovery.
- Apply KPI targets when assessing ad performance (e.g., flag ads in ad groups where CPA > target).
- Note active tests -- do not recommend changes to ads currently in a test.
- Check watch list for prior ad copy findings that may need follow-up.
If it doesn't exist, fall back to
list_accounts and suggest running platform-setup.
Data Access
mcp__google-ads__query: Execute GAQL SELECT queries and return structured rows.
mcp__google-ads__list_accounts: Validate account access before analysis when customer scope is unclear.
Use GAQL templates from references/gaql-queries.md directly with mcp__google-ads__query.
Connection verification
- If the profile has account IDs, use them directly.
- Otherwise, run
mcp__google-ads__list_accounts to discover accounts.
- If it fails, report the connection failure and suggest running
platform-setup.
Workflow
Phase 1: Collect data
Execute two queries from references/gaql-queries.md:
| Query ID |
What It Returns |
| ACA-1 |
All enabled RSAs with headlines, descriptions, ad strength, final URLs, and 30-day performance metrics (impressions, clicks, CTR, cost, conversions, CPA) |
| ACA-2 |
Asset-level performance labels, field types (HEADLINE/DESCRIPTION), pinning status, and per-asset metrics |
Run both queries. ACA-2 is at the asset level and may return many rows for large accounts.
Scope control: If the user specifies a campaign or ad group, add the appropriate WHERE filter to both queries. Otherwise, analyze the full account.
Phase 2: Ad strength analysis
Classify all RSAs by ad strength:
| Ad Strength |
Health |
Action Needed |
| EXCELLENT |
Strong |
Monitor |
| GOOD |
Acceptable |
Optional optimization |
| AVERAGE |
Below standard |
Improve headlines/descriptions |
| POOR |
Critical |
Rewrite needed |
| UNSPECIFIED |
Insufficient data |
Needs more impressions |
Compute the distribution:
- Count and percentage of RSAs at each ad strength level.
- Total spend at each level.
- Average CTR and CPA at each level.
Flag: If >30% of RSAs are AVERAGE or POOR AND those RSAs carry >20% of total ad spend, tag as HIGH severity.
Phase 3: Asset performance analysis
For each RSA, classify assets by performance label:
| Label |
Meaning |
Action |
| BEST |
Top performer relative to other assets |
Protect -- do not edit |
| GOOD |
Above average |
Keep |
| LOW |
Below average |
Replace candidate |
| PENDING |
Insufficient data for labeling |
Monitor -- needs more impressions |
Build the replacement priority list:
- Filter to assets with
performance_label = LOW.
- Join with ad group spend from ACA-1 to rank by dollar exposure.
- Prioritize LOW assets in high-spend ad groups (these have the most impact potential).
- Estimate monthly impact:
ad_group_monthly_spend * estimated_ctr_lift_from_replacement.
- Use a conservative 5-15% CTR lift estimate for replacing a LOW asset with a new variant.
- Label all impact estimates explicitly as estimates.
Assign severity:
- HIGH (>$500/mo ad group spend with LOW assets)
- MEDIUM ($100-500/mo ad group spend with LOW assets)
- LOW ($25-100/mo ad group spend with LOW assets)
- INFO (<$25/mo or PENDING-only ad groups)
Phase 4: Pinning analysis
From ACA-2, identify assets with pinned_field values (HEADLINE_1, HEADLINE_2, HEADLINE_3, DESCRIPTION_1, DESCRIPTION_2).
Over-pinning heuristic:
- An RSA is "over-pinned" if >50% of its headline slots AND >50% of its description slots have pinned assets.
- A fully pinned RSA (all slots pinned) effectively disables ad rotation optimization entirely.
For each over-pinned ad:
- Calculate the ad group's 30-day spend.
- Note which assets are pinned to which positions.
- Recommend specific unpinning actions: which pins to remove first (start with lowest-performing pinned assets).
- UI path: Google Ads > Campaigns > [Campaign] > Ad groups > [Ad group] > Ads > [Ad] > Edit > Click the pin icon on each asset to unpin.
Phase 5: Headline and description diversity analysis
For each ad group with active RSAs:
- Extract all headline texts and description texts across the ad group's RSAs.
- Cluster headlines by theme:
- Brand: company name, brand terms
- Benefit: value propositions, outcomes
- Feature: product features, specifications
- CTA: calls to action (Get, Try, Start, Buy, etc.)
- Social proof: reviews, awards, numbers
- Urgency: limited time, seasonal, deadlines
- Price/Offer: discounts, pricing, promotions
- Flag ad groups with:
- Fewer than 3 distinct themes across all headlines (low diversity).
60% of headlines in a single theme (over-concentration).
- Duplicate or near-duplicate headlines within the same RSA.
- Suggest themes to add based on missing categories.
Do not generate specific headline or description copy unless the user explicitly asks for copywriting help. Focus on theme gaps and structural recommendations.
Phase 6: Build output
Compile all findings into the output format below. Every actionable finding includes:
- A dollar table showing spend exposure.
- A Google Ads UI path for remediation.
- A copy-paste-ready list of entities to act on.
Output format
## Ad Copy Analysis -- [Date]
### Account
- Google Ads: [Account Name] ([Customer ID])
- RSAs analyzed: [N] across [N] ad groups
- 30-day ad spend analyzed: $X,XXX
### Ad Strength Summary
| Ad Strength | Count | % of RSAs | 30d Spend | Avg CTR | Avg CPA |
|-------------|------:|----------:|----------:|--------:|--------:|
| EXCELLENT | X | XX% | $X,XXX | X.XX% | $XX.XX |
| GOOD | X | XX% | $X,XXX | X.XX% | $XX.XX |
| AVERAGE | X | XX% | $X,XXX | X.XX% | $XX.XX |
| POOR | X | XX% | $X,XXX | X.XX% | $XX.XX |
### Priority: LOW Assets in High-Spend Ad Groups
| # | Severity | Campaign | Ad Group | Asset Type | Asset Text | Label | Ad Group 30d Spend | Est. Impact |
|---|----------|----------|----------|-----------|------------|-------|-------------------:|------------:|
| 1 | HIGH | [campaign] | [ad group] | HEADLINE | [text] | LOW | $X,XXX | $XXX/mo |
| 2 | MEDIUM | [campaign] | [ad group] | DESCRIPTION | [text] | LOW | $XXX | $XX/mo |
**UI path:** Google Ads > Campaigns > [Campaign] > Ad groups > [Ad group] > Ads > [Ad] > Edit > Replace the LOW asset with a new variant.
### Pinning Warnings
| Campaign | Ad Group | Ad ID | Pinned Slots | Ad Group 30d Spend | Recommendation |
|----------|----------|-------|-------------|-------------------:|----------------|
| [name] | [name] | [id] | H1, H2, D1 | $X,XXX | Unpin [asset] from [position] |
**UI path:** Google Ads > Campaigns > [Campaign] > Ad groups > [Ad group] > Ads > [Ad] > Edit > Click pin icon to remove pin.
### Diversity Gaps
| Campaign | Ad Group | Active Themes | Missing Themes | 30d Spend |
|----------|----------|--------------|----------------|----------:|
| [name] | [name] | Brand, CTA | Benefit, Social Proof | $X,XXX |
**Suggestion:** Add headlines in the [missing theme] category to improve rotation diversity.
### Replacement Priorities (Summary)
Copy-paste list of ad groups needing work, ordered by spend:
1. **[Campaign] > [Ad Group]** ($X,XXX/mo) -- [N] LOW assets, [ad strength], missing [themes]
2. **[Campaign] > [Ad Group]** ($XXX/mo) -- [N] LOW assets, over-pinned
3. ...
### Notes
- Data freshness: 30-day lookback, performance labels require sufficient impression volume
- Assets with PENDING labels excluded from replacement priorities
- Impact estimates assume 5-15% CTR lift from asset replacement (conservative range)
Guardrails
- Read-only: This skill produces analysis and recommendations only. No ad modifications are made. All remediation actions include specific Google Ads UI paths.
- No copy generation by default: Do not write new headlines or descriptions unless the user explicitly requests copywriting. Focus on structural analysis (strength, labels, pinning, themes).
- PENDING assets: Do not recommend replacing PENDING assets. They need more impression volume before their performance label is meaningful. Note the count of PENDING assets separately.
- BEST asset protection: Never recommend modifying or replacing BEST-labeled assets. Call them out as strengths to preserve.
- Active tests: If the account profile indicates active ad copy tests, exclude those ad groups from replacement recommendations and note the exclusion.
- Small ad groups: For ad groups with <100 impressions in 30 days, asset performance labels are unreliable. Note these ad groups separately as "insufficient data" rather than scoring them.
- Ad strength caveats: Ad strength is Google's predictive signal, not a direct performance metric. An EXCELLENT ad strength does not guarantee high CTR or low CPA. Note this distinction in the output when ad strength and actual performance diverge.
- Conversion lag: CPA figures use the full 30-day window to minimize conversion lag distortion. Do not compare yesterday's CPA to 30-day CPA without noting the lag.
- Severity calibration: All dollar impact figures are labeled as estimates. Distinguish direct spend from modeled improvement potential.
Profile Maintenance
After completing analysis, if ${CLAUDE_PLUGIN_ROOT}/profile/account-profile.md exists:
- Update Watch List with HIGH-severity findings (LOW assets in high-spend ad groups, fully pinned ads with significant spend).
- Update Active Tests if the user mentioned starting an ad copy test during the session.
- Append to Decision Log if the user acknowledged specific replacement or unpinning actions.
- Update "Last updated" date.
Present proposed profile changes to the user before writing.
References
references/gaql-queries.md -- query IDs: ACA-1, ACA-2
1---2name: ad-copy-analyzer3description: This skill should be used when the user asks to "analyze my ads", "review RSAs", "check ad copy", "ad strength review", "which ads need work", "headline analysis", "ad copy audit", "RSA performance", "asset performance", "are my ads any good", "ad quality check", "which headlines are working", "improve my ad copy", "ad strength is poor", "pinning problems", "messaging diversity", "how are my RSAs doing", "best performing headlines", or mentions ad copy optimization, responsive search ad analysis, headline/description review, or asset label performance.4---56# Ad Copy Analyzer -- Google Ads78Analyze Responsive Search Ads (RSAs) for quality gaps, underperforming assets, over-pinning, and messaging diversity. Produces a prioritized replacement plan ranked by ad group spend.910## Account Context1112Read `${CLAUDE_PLUGIN_ROOT}/profile/account-profile.md` at the start of every run.13If it exists:14- Use known account IDs -- skip `list_accounts` discovery.15- Apply KPI targets when assessing ad performance (e.g., flag ads in ad groups where CPA > target).16- Note active tests -- do not recommend changes to ads currently in a test.17- Check watch list for prior ad copy findings that may need follow-up.18If it doesn't exist, fall back to `list_accounts` and suggest running `platform-setup`.1920## Data Access2122- `mcp__google-ads__query`: Execute GAQL SELECT queries and return structured rows.23- `mcp__google-ads__list_accounts`: Validate account access before analysis when customer scope is unclear.2425Use GAQL templates from `references/gaql-queries.md` directly with `mcp__google-ads__query`.2627### Connection verification28291. If the profile has account IDs, use them directly.302. Otherwise, run `mcp__google-ads__list_accounts` to discover accounts.313. If it fails, report the connection failure and suggest running `platform-setup`.3233## Workflow3435### Phase 1: Collect data3637Execute two queries from `references/gaql-queries.md`:3839| Query ID | What It Returns |40|----------|----------------|41| ACA-1 | All enabled RSAs with headlines, descriptions, ad strength, final URLs, and 30-day performance metrics (impressions, clicks, CTR, cost, conversions, CPA) |42| ACA-2 | Asset-level performance labels, field types (HEADLINE/DESCRIPTION), pinning status, and per-asset metrics |4344Run both queries. ACA-2 is at the asset level and may return many rows for large accounts.4546**Scope control**: If the user specifies a campaign or ad group, add the appropriate WHERE filter to both queries. Otherwise, analyze the full account.4748### Phase 2: Ad strength analysis4950Classify all RSAs by ad strength:5152| Ad Strength | Health | Action Needed |53|-------------|--------|---------------|54| EXCELLENT | Strong | Monitor |55| GOOD | Acceptable | Optional optimization |56| AVERAGE | Below standard | Improve headlines/descriptions |57| POOR | Critical | Rewrite needed |58| UNSPECIFIED | Insufficient data | Needs more impressions |5960Compute the distribution:61- Count and percentage of RSAs at each ad strength level.62- Total spend at each level.63- Average CTR and CPA at each level.6465Flag: If >30% of RSAs are AVERAGE or POOR AND those RSAs carry >20% of total ad spend, tag as **HIGH** severity.6667### Phase 3: Asset performance analysis6869For each RSA, classify assets by performance label:7071| Label | Meaning | Action |72|-------|---------|--------|73| BEST | Top performer relative to other assets | Protect -- do not edit |74| GOOD | Above average | Keep |75| LOW | Below average | Replace candidate |76| PENDING | Insufficient data for labeling | Monitor -- needs more impressions |7778Build the replacement priority list:79801. Filter to assets with `performance_label = LOW`.812. Join with ad group spend from ACA-1 to rank by dollar exposure.823. Prioritize LOW assets in high-spend ad groups (these have the most impact potential).834. Estimate monthly impact: `ad_group_monthly_spend * estimated_ctr_lift_from_replacement`.84 - Use a conservative 5-15% CTR lift estimate for replacing a LOW asset with a new variant.85 - Label all impact estimates explicitly as estimates.8687Assign severity:88- **HIGH** (>$500/mo ad group spend with LOW assets)89- **MEDIUM** ($100-500/mo ad group spend with LOW assets)90- **LOW** ($25-100/mo ad group spend with LOW assets)91- **INFO** (<$25/mo or PENDING-only ad groups)9293### Phase 4: Pinning analysis9495From ACA-2, identify assets with `pinned_field` values (HEADLINE_1, HEADLINE_2, HEADLINE_3, DESCRIPTION_1, DESCRIPTION_2).9697Over-pinning heuristic:98- An RSA is "over-pinned" if >50% of its headline slots AND >50% of its description slots have pinned assets.99- A fully pinned RSA (all slots pinned) effectively disables ad rotation optimization entirely.100101For each over-pinned ad:102- Calculate the ad group's 30-day spend.103- Note which assets are pinned to which positions.104- Recommend specific unpinning actions: which pins to remove first (start with lowest-performing pinned assets).105- **UI path:** Google Ads > Campaigns > [Campaign] > Ad groups > [Ad group] > Ads > [Ad] > Edit > Click the pin icon on each asset to unpin.106107### Phase 5: Headline and description diversity analysis108109For each ad group with active RSAs:1101111. Extract all headline texts and description texts across the ad group's RSAs.1122. Cluster headlines by theme:113 - **Brand**: company name, brand terms114 - **Benefit**: value propositions, outcomes115 - **Feature**: product features, specifications116 - **CTA**: calls to action (Get, Try, Start, Buy, etc.)117 - **Social proof**: reviews, awards, numbers118 - **Urgency**: limited time, seasonal, deadlines119 - **Price/Offer**: discounts, pricing, promotions1203. Flag ad groups with:121 - Fewer than 3 distinct themes across all headlines (low diversity).122 - >60% of headlines in a single theme (over-concentration).123 - Duplicate or near-duplicate headlines within the same RSA.1244. Suggest themes to add based on missing categories.125126Do not generate specific headline or description copy unless the user explicitly asks for copywriting help. Focus on theme gaps and structural recommendations.127128### Phase 6: Build output129130Compile all findings into the output format below. Every actionable finding includes:131- A dollar table showing spend exposure.132- A Google Ads UI path for remediation.133- A copy-paste-ready list of entities to act on.134135## Output format136137```markdown138## Ad Copy Analysis -- [Date]139140### Account141- Google Ads: [Account Name] ([Customer ID])142- RSAs analyzed: [N] across [N] ad groups143- 30-day ad spend analyzed: $X,XXX144145### Ad Strength Summary146147| Ad Strength | Count | % of RSAs | 30d Spend | Avg CTR | Avg CPA |148|-------------|------:|----------:|----------:|--------:|--------:|149| EXCELLENT | X | XX% | $X,XXX | X.XX% | $XX.XX |150| GOOD | X | XX% | $X,XXX | X.XX% | $XX.XX |151| AVERAGE | X | XX% | $X,XXX | X.XX% | $XX.XX |152| POOR | X | XX% | $X,XXX | X.XX% | $XX.XX |153154### Priority: LOW Assets in High-Spend Ad Groups155156| # | Severity | Campaign | Ad Group | Asset Type | Asset Text | Label | Ad Group 30d Spend | Est. Impact |157|---|----------|----------|----------|-----------|------------|-------|-------------------:|------------:|158| 1 | HIGH | [campaign] | [ad group] | HEADLINE | [text] | LOW | $X,XXX | $XXX/mo |159| 2 | MEDIUM | [campaign] | [ad group] | DESCRIPTION | [text] | LOW | $XXX | $XX/mo |160161**UI path:** Google Ads > Campaigns > [Campaign] > Ad groups > [Ad group] > Ads > [Ad] > Edit > Replace the LOW asset with a new variant.162163### Pinning Warnings164165| Campaign | Ad Group | Ad ID | Pinned Slots | Ad Group 30d Spend | Recommendation |166|----------|----------|-------|-------------|-------------------:|----------------|167| [name] | [name] | [id] | H1, H2, D1 | $X,XXX | Unpin [asset] from [position] |168169**UI path:** Google Ads > Campaigns > [Campaign] > Ad groups > [Ad group] > Ads > [Ad] > Edit > Click pin icon to remove pin.170171### Diversity Gaps172173| Campaign | Ad Group | Active Themes | Missing Themes | 30d Spend |174|----------|----------|--------------|----------------|----------:|175| [name] | [name] | Brand, CTA | Benefit, Social Proof | $X,XXX |176177**Suggestion:** Add headlines in the [missing theme] category to improve rotation diversity.178179### Replacement Priorities (Summary)180181Copy-paste list of ad groups needing work, ordered by spend:1821831. **[Campaign] > [Ad Group]** ($X,XXX/mo) -- [N] LOW assets, [ad strength], missing [themes]1842. **[Campaign] > [Ad Group]** ($XXX/mo) -- [N] LOW assets, over-pinned1853. ...186187### Notes188- Data freshness: 30-day lookback, performance labels require sufficient impression volume189- Assets with PENDING labels excluded from replacement priorities190- Impact estimates assume 5-15% CTR lift from asset replacement (conservative range)191```192193## Guardrails194195- **Read-only**: This skill produces analysis and recommendations only. No ad modifications are made. All remediation actions include specific Google Ads UI paths.196- **No copy generation by default**: Do not write new headlines or descriptions unless the user explicitly requests copywriting. Focus on structural analysis (strength, labels, pinning, themes).197- **PENDING assets**: Do not recommend replacing PENDING assets. They need more impression volume before their performance label is meaningful. Note the count of PENDING assets separately.198- **BEST asset protection**: Never recommend modifying or replacing BEST-labeled assets. Call them out as strengths to preserve.199- **Active tests**: If the account profile indicates active ad copy tests, exclude those ad groups from replacement recommendations and note the exclusion.200- **Small ad groups**: For ad groups with <100 impressions in 30 days, asset performance labels are unreliable. Note these ad groups separately as "insufficient data" rather than scoring them.201- **Ad strength caveats**: Ad strength is Google's predictive signal, not a direct performance metric. An EXCELLENT ad strength does not guarantee high CTR or low CPA. Note this distinction in the output when ad strength and actual performance diverge.202- **Conversion lag**: CPA figures use the full 30-day window to minimize conversion lag distortion. Do not compare yesterday's CPA to 30-day CPA without noting the lag.203- **Severity calibration**: All dollar impact figures are labeled as estimates. Distinguish direct spend from modeled improvement potential.204205## Profile Maintenance206207After completing analysis, if `${CLAUDE_PLUGIN_ROOT}/profile/account-profile.md` exists:2081. Update Watch List with HIGH-severity findings (LOW assets in high-spend ad groups, fully pinned ads with significant spend).2092. Update Active Tests if the user mentioned starting an ad copy test during the session.2103. Append to Decision Log if the user acknowledged specific replacement or unpinning actions.2114. Update "Last updated" date.212Present proposed profile changes to the user before writing.213214## References215216- `references/gaql-queries.md` -- query IDs: ACA-1, ACA-2