campaign-structure-auditor
Skill4 starsChanged 6 months agoMITView on GitHub
Audits Google Ads account structure including ad group strategy, keyword duplication, match type distribution, and naming conventions. Use when auditing campaigns, reviewing account structure, finding duplicate keywords, or checking naming conventions.
In this repository59 other files it gives its agents.
- ad-copy-generationSkill
- ad-creative-fatigue-detectorSkill
- ad-policy-complianceSkill
- amazon-ads-optimizerSkill
- anomaly-detectorSkill
- attribution-modelingSkill
- audience-expansion-strategySkill
- bid-optimizationSkill
- budget-optimizerSkill
- campaign-ide-handoffSkill
- campaign-preflightSkill
- chatgpt-ads-conversion-trackingSkill
- chatgpt-ads-launchSkill
- competitor-analysisSkill
- creative-testingSkill
- cross-platform-attributionSkill
- cross-platform-launcherSkill
- dayparting-schedulerSkill
- executive-reportingSkill
- first-party-data-strategySkill
- google-ads-operatorSkill
- google-ads-quality-scoreSkill
- google-shopping-optimizerSkill
- gtm-metricsSkill
- incrementality-testingSkill
- keyword-researchSkill
- kill-scale-rulesSkill
- klaviyo-campaignsSkill
- landing-page-optimizerSkill
- launch-gatesSkill
- linkedin-ads-operatorSkill
- linkedin-ads-targetingSkill
- media-plan-builderSkill
- meta-ads-diagnosticsSkill
- meta-ads-operatorSkill
- mmm-budget-plannerSkill
- multi-channel-reportingSkill
- multi-platform-ads-operatorSkill
- multi-platform-launchSkill
- negative-keyword-minerSkill
- openai-ads-operatorSkill
- performance-max-optimizerSkill
- pixel-capi-auditorSkill
- pixel-capi-setupSkill
- platform-cost-benchmarksSkill
- public-ad-library-intelligenceSkill
- retargeting-sequence-designerSkill
- roas-calculatorSkill
- seasonal-budget-plannerSkill
- spearSkill
- spec-driven-devSkill
- synter-mcp-setupSkill
- tiktok-ads-operatorSkill
- tracking-leak-detectorSkill
- ugc-creative-briefSkill
- ui-contrast-reviewSkill
- utm-builderSkill
- video-ad-scriptwriterSkill
- x-ads-operatorSkill
The file
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 1 is distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 15
Ad Group Health: Check keyword-to-ad-group ratios, empty ad groups, RSA coverage
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Campaign Structure Auditor
Performs comprehensive Google Ads account structure audits covering ad group strategy (SKAG vs STAG vs themed), duplicate keyword detection, match type distribution, ad group health, and naming convention enforcement. Outputs actionable recommendations with severity ratings.
Capabilities
- Ad Group Strategy Assessment: Evaluate SKAG, STAG, and themed ad group approaches
- Duplicate Keyword Detection: Find keyword overlap across campaigns and ad groups
- Match Type Audit: Analyze broad, phrase, and exact match distribution
- Ad Group Health: Check keyword-to-ad-group ratios, empty ad groups, RSA coverage
- Naming Convention Enforcement: Validate campaign/ad group naming patterns
- Quality Score Analysis: Correlate structure issues with Quality Score impact
- Budget Waste Identification: Find structural causes of wasted spend
Workflows
1. Full Account Structure Audit
Step 1: Pull account inventory
-- GAQL: Get all campaigns with status and type
SELECT
campaign.id,
campaign.name,
campaign.status,
campaign.advertising_channel_type,
campaign_budget.amount_micros,
metrics.cost_micros,
metrics.impressions,
metrics.clicks,
metrics.conversions
FROM campaign
WHERE campaign.status != 'REMOVED'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESCStep 2: Pull ad group details
-- GAQL: Ad groups with keyword counts and performance
SELECT
campaign.name,
ad_group.id,
ad_group.name,
ad_group.status,
ad_group.type,
metrics.cost_micros,
metrics.impressions,
metrics.clicks,
metrics.conversions,
metrics.average_cpc
FROM ad_group
WHERE campaign.status = 'ENABLED'
AND ad_group.status != 'REMOVED'
AND segments.date DURING LAST_30_DAYSStep 3: Pull keyword inventory
-- GAQL: All keywords with match types and Quality Score
SELECT
campaign.name,
ad_group.name,
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
ad_group_criterion.status,
ad_group_criterion.quality_info.quality_score,
ad_group_criterion.quality_info.creative_quality_score,
ad_group_criterion.quality_info.post_click_quality_score,
ad_group_criterion.quality_info.search_predicted_ctr,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM keyword_view
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND ad_group_criterion.status != 'REMOVED'
AND segments.date DURING LAST_30_DAYSStep 4: Check RSA coverage
-- GAQL: Ads per ad group
SELECT
campaign.name,
ad_group.name,
ad_group_ad.ad.type,
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
FROM ad_group_ad
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND ad_group_ad.status != 'REMOVED'2. Ad Group Strategy Assessment
| Strategy | Keywords/Ad Group | Best For | Risk |
| SKAG (Single Keyword Ad Groups) | 1 | Maximum control, exact match focus | Over-segmentation, low volume per group |
| STAG (Single Theme Ad Groups) | 3-5 | Balanced control, theme consistency | Requires tight theme discipline |
| Themed (Broad Theme) | 5-20 | Scale, Smart Bidding compatibility | Diluted relevance, mixed intent |
| Alpha/Beta | Varies | Mining new keywords + proven performers | Complex management |
Assessment criteria:
IF keywords_per_ad_group == 1:
strategy = "SKAG"
IF using Smart Bidding: WARN "SKAGs limit Smart Bidding signal volume"
IF avg_impressions_per_ad_group < 100/month: WARN "Low volume SKAGs"
IF keywords_per_ad_group BETWEEN 2 AND 7:
strategy = "STAG"
CHECK all keywords share semantic theme
IF keyword themes diverge: WARN "Mixed intent in STAG"
IF keywords_per_ad_group > 15:
strategy = "Over-stuffed"
SEVERITY: HIGH
RECOMMEND: Split into themed groups of 5-103. Duplicate Keyword Detection
Cross-campaign duplicates (cannibalization):
-- GAQL: Find keywords appearing in multiple campaigns
SELECT
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
campaign.name,
ad_group.name,
metrics.impressions,
metrics.clicks,
metrics.cost_micros
FROM keyword_view
WHERE campaign.status = 'ENABLED'
AND ad_group_criterion.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY ad_group_criterion.keyword.textDuplicate classification:
| Type | Severity | Description | Action |
| Exact duplicate | HIGH | Same keyword, same match type, different campaigns | Remove from lower-performing campaign |
| Cross-match duplicate | MEDIUM | Same keyword, different match types, different campaigns | Ensure intentional funnel (broad→exact) |
| Near duplicate | LOW | Singular/plural or minor variants | Consolidate if same intent |
| Intentional split | INFO | Brand vs non-brand separation | Verify negative keyword coverage |
Cannibalization impact calculation:
wasted_spend = SUM(cost of losing auction participant)
cannibalization_rate = duplicate_impressions / total_impressions
IF cannibalization_rate > 15%: SEVERITY = HIGH
IF cannibalization_rate > 5%: SEVERITY = MEDIUM4. Match Type Distribution Audit
Recommended distribution by strategy:
| Strategy | Exact | Phrase | Broad | Notes |
| Conservative | 60-70% | 20-30% | 0-10% | Max control, lower reach |
| Balanced | 40-50% | 30-40% | 10-20% | Good for most accounts |
| Smart Bidding | 20-30% | 20-30% | 40-60% | Let algorithm optimize |
| Discovery | 10-20% | 20-30% | 50-70% | New account/market |
Match type health checks:
IF broad_match_pct > 50% AND NOT using_smart_bidding:
SEVERITY: HIGH
MESSAGE: "High broad match without Smart Bidding wastes budget"
IF exact_match_pct > 80%:
SEVERITY: MEDIUM
MESSAGE: "Over-reliance on exact match limits discovery"
IF phrase_match_pct < 10%:
SEVERITY: LOW
MESSAGE: "Phrase match underutilized for intent capture"
CHECK negative_keyword_count:
IF broad_match_active AND negative_keywords < 50:
SEVERITY: HIGH
MESSAGE: "Insufficient negative keywords for broad match protection"5. Naming Convention Enforcement
Recommended naming pattern:
Campaign: {Platform}_{Type}_{Objective}_{Geo}_{Audience}_{Date}
Example: GADS_Search_LeadGen_US_Remarketing_2026Q1
Ad Group: {Theme}_{MatchType}_{Modifier}
Example: CRM_Software_Exact_Desktop
Standard abbreviations:
Platforms: GADS, META, LNKD, RDDT, MSFT, TKTK, XADS
Types: Search, Display, PMax, DemGen, Shopping, Video
Objectives: LeadGen, Sales, Awareness, Traffic
Match: Exact, Phrase, Broad, BMM (legacy)
Geo: US, UK, CA, APAC, EMEA, GLOBALValidation rules:
RULE: No spaces in campaign names (use underscores)
RULE: No special characters except underscore and hyphen
RULE: Must contain campaign type identifier
RULE: Date or quarter suffix recommended
RULE: Max 100 characters
RULE: Consistent casing (Title_Case or lowercase)6. Empty Ad Group Detection
-- GAQL: Find ad groups with no enabled keywords
SELECT
campaign.name,
ad_group.name,
ad_group.status,
ad_group.id
FROM ad_group
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND metrics.impressions = 0
AND segments.date DURING LAST_90_DAYS-- GAQL: Find ad groups with no enabled ads
SELECT
campaign.name,
ad_group.name,
ad_group.id
FROM ad_group
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND ad_group.id NOT IN (
SELECT ad_group.id FROM ad_group_ad
WHERE ad_group_ad.status = 'ENABLED'
)Reference Data
Quality Score Impact by Structure Issue
| Issue | Avg QS Impact | CPC Impact | Recommended Fix |
| Keyword-ad mismatch | -2 to -3 | +30-50% | Align ad copy to keyword theme |
| Too many keywords per group | -1 to -2 | +15-25% | Split into themed groups |
| Missing ad extensions | -1 | +10-15% | Add sitelinks, callouts, snippets |
| Low RSA asset count | -1 | +10-20% | Add 10+ headlines, 4 descriptions |
| No negative keywords | 0 (indirect) | +20-40% wasted | Build negative keyword lists |
Ad Group Health Scorecard
| Metric | Good | Acceptable | Poor |
| Keywords per ad group | 3-10 | 11-20 | 20+ or 0 |
| RSAs per ad group | 2-3 | 1 | 0 |
| Headlines per RSA | 10-15 | 8-9 | <8 |
| Descriptions per RSA | 4 | 3 | <3 |
| Ad strength | Excellent/Good | Average | Poor/No ads |
| Negative keywords | 50+ per campaign | 20-49 | <20 |
Examples
Example: Full Audit Report Output
# Account Structure Audit Report
**Account:** Acme Corp (ID: 123-456-7890)
**Date:** 2026-03-06
**Period:** Last 30 Days
## Summary
- 🔴 3 Critical Issues
- 🟡 5 Warnings
- 🟢 12 Passed Checks
## Critical Issues
### 1. Keyword Cannibalization (HIGH)
- "crm software" appears in 4 campaigns (Brand, Non-Brand, Competitor, Remarketing)
- Estimated wasted spend: $2,340/month
- **Fix:** Consolidate to single campaign, use audience targeting for segmentation
### 2. Empty Ad Groups (HIGH)
- 14 enabled ad groups have 0 impressions in 90 days
- **Fix:** Pause or remove: [list of ad groups]
### 3. Missing RSAs (HIGH)
- 8 ad groups have 0 enabled responsive search ads
- **Fix:** Create RSAs with 10+ headlines and 4 descriptions
## Warnings
### 1. Match Type Imbalance
- Current: 72% Broad, 18% Phrase, 10% Exact
- Using manual CPC (not Smart Bidding)
- **Recommendation:** Shift to 40% Exact, 35% Phrase, 25% Broad
OR enable Target CPA bidding
### 2. Naming Inconsistency
- 6 campaigns use spaces, 4 use underscores, 2 use hyphens
- **Fix:** Standardize to underscore formatAbout this skill
Part of the Synter free skills collection — open-source agent skills for advertising, PPC, and marketing automation.
Want this skill (and 40+ more) running on autopilot against your live ad accounts? Try Synter — AI Agent Media Buyers that connect to Google, Meta, LinkedIn, TikTok, Reddit, Amazon, and 7+ more platforms.
- 🌐 syntermedia.ai
- 📚 All free skills
- 💬 Built by @syntermedia — questions? Open an issue.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

