agentleFS
adwarp-devadwarp-dev/paid-ads-skills/skills/google-ads-account-audit/SKILL.md

google-ads-account-audit

Skill0 starsChanged 26 days agoMITView on GitHub

Read-only Google Ads account audit with 50 checks across conversion tracking, auto-tagging, campaign settings, structure, keywords, search terms, negatives, responsive search ads, assets, Performance Max, AI Max, auto-applied recommendations and change history. Each check has a GAQL query, a pass, warn or fail rule and a source, and the report ends in fixes ranked by spend at risk. Works from Google Ads exports or live through GAQL. Use for "audit my Google Ads account", "Google Ads health check", "is my Google Ads set up right", "why is my Google Ads CPA high", "review my Google Ads account".

4 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

4 rules. 0 are common, 4 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 4 edited versions we read keep these.

  • 4

    Distinctive

    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
  1. Distinctive:

    Search, Performance Max and AI Max campaigns.

    line 14
  2. Distinctive:

    Every check has a GAQL query in references/gaql-checks.md.

    line 45
  3. Distinctive:

    Run the gate checks first: If C1 or C2 fails, mark every check that compares cost per conversion (S1, S2, S5 to S9, K1, K5, Q1, Q3, Q4, P4, …

    line 56
  4. Distinctive:

    All checked 2026-10-20, except source 10, checked 2026-11-07.

    line 252

“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Google Ads account audit

Runs 50 read-only checks on a Google Ads account and turns them into a scorecard plus a short list of fixes ranked by the money each one puts at risk. Tracking problems come first, because every cost per conversion below them depends on tracking being right.

Use cases

  • "Audit my Google Ads account", "health check", "is this account set up right", "what's wrong with this account", "why did our CPA jump".
  • A new account handed over by an agency or a colleague, or a quarterly review.
  • Search, Performance Max and AI Max campaigns. Display, Video, Demand Gen, App and Shopping campaigns are listed in the scorecard as out of scope.

It doesn't:

  • Change anything. Every fix is a step the user takes, or a separate confirmed action.
  • Mine search terms for every negative keyword. It sizes the waste (checks Q1 to Q4); use google-ads-search-terms for the full negative list and the upload file.
  • Build new campaigns. Use google-ads-search-campaign-builder.

Inputs

A date window (default: the last 30 days) and the target cost per acquisition. If the user has no target, use the account's own cost per conversion over the window and label it "account average, used as target".

Export mode

Download each report from the Google Ads web interface for the window: open the page, click the download icon above the table, choose Excel CSV [40]. Match columns by name, case-insensitive, and accept close variants ("Impr." or "Impressions", "Cost" or "Cost (USD)", "Conversions" or "Conv."). Downloads can begin with a report title and a date line and end with total rows, so find the header row by its column names and skip rows whose first cell starts with "Total".

FileWhere in Google AdsColumns usedChecks
Campaigns reportCampaigns > CampaignsCampaign, Campaign type, Campaign status, Budget, Bid strategy type, Impr., Clicks, Cost, Conversions, Conv. value, Search impr. share, Search lost IS (budget), Search lost IS (rank)S5 to S9
Campaigns by networkSame table, segmented by network with search partners shown separatelyCampaign, Network, Cost, Clicks, ConversionsS1, S2
Keywords reportCampaigns > Keywords, with the Quality Score columns added [24]Keyword, Match type, Campaign, Ad group, Status, Max. CPC, Quality Score, Exp. CTR, Ad Relevance, Landing Page Exp., Impr., Clicks, Cost, ConversionsS6, T2, K1 to K5
Search terms reportCampaigns > Insights and reports > Search terms; for Performance Max, the "Search terms and landing pages for Performance Max" view [27]Search term, Match type, Added/Excluded, Campaign, Ad group, Keyword, Impr., Clicks, Cost, ConversionsQ1 to Q4, P4
Ads reportCampaigns > AdsCampaign, Ad group, Ad type, Status, Ad strength, Cost, ConversionsR1, R2, R5
Conversions summaryGoals > Conversions > SummaryConversion action, Action optimization (Primary or Secondary), Source, Category or goal, Count, Status, All conv.C2 to C6
Change historyChange history in the Campaigns menu [39]Date and time, User, Campaign, ChangesH2, H3
Google Ads Editor exportEditor: Account menu > Export > whole account [41]Campaign rows: Networks, Targeting method, Exclusion method, Bid Strategy Type. Ad rows: Headline 1 to 15, Headline 1 position to Headline 15 position, Description 1 to 4. Keyword and negative rows: Keyword, Criterion Type [42]S1 to S4, R3, R4, N1 to N3, A1, A2

Some settings never appear in a report: auto-tagging (C9), enhanced conversions (C7), Consent Mode (C8), auto-apply recommendations (H1) and AI Max (X1 to X3). Ask the user for a screenshot of each setting page, or mark the check "not checked" in the report. Never guess a setting.

Connected mode

Every check has a GAQL query in references/gaql-checks.md. Run them with either tool:

  • Adwarp, a free open-source MCP server and CLI for LinkedIn Ads and Google Ads. MCP tools: gads_search (any read-only GAQL query), gads_list_conversion_actions, gads_list_campaigns, gads_performance (campaign, ad group, ad, keyword or search term rows). CLI: adwarp google query "<GAQL>", adwarp google conversions list, adwarp google report perf search_term -p last_30_days. Adwarp pins Google Ads API v25 unless ADWARP_GOOGLE_API_VERSION says otherwise, so use the v25 variant of query Q01 for check C7. Pages: Google Ads hub, reporting, setup.
  • Google's Google Ads MCP server (github.com/googleads/google-ads-mcp). Pass the same GAQL to its search tool, which only reads. Since version 0.0.6 (2026-11-02) the server also has 4 write tools for assets and labels (create_asset, upload_video_asset, manage_labels, manage_label_associations). Each one proposes a change first and applies it only on a second call that carries the proposal's checksum, and all 4 are on unless you turn them off. This audit uses only search, so set assets: false and labels: false in the server's tools_config.yaml. Since 0.0.3 (2026-09-10) the server no longer requires a developer token [10].

API access now belongs to a Google Cloud project: developer tokens were sunset on September 9, 2026 [9]. The audit only reads, so Explorer access (2,880 production operations a day) is enough. The full catalog is about 30 queries.

Method

  1. Set the frame. Confirm the account, currency, window and target cost per acquisition (CPA). Note which campaign types exist; out-of-scope types are listed, not scored.
  2. Pull the data. Connected: run the queries in references/gaql-checks.md in order. Export: load the files above. Divide every *_micros value by 1,000,000.
  3. Run the gate checks first. If C1 or C2 fails, mark every check that compares cost per conversion (S1, S2, S5 to S9, K1, K5, Q1, Q3, Q4, P4, X1) as "unreliable: tracking" and still report the raw spend.
  4. Run all 50 checks in the table below. Each gets pass, warn, fail, n/a (the account doesn't use the feature) or not checked (the data isn't available). Thresholds marked "default" are judgment calls the user can change; say so in the report.
  5. Price each finding with the spend at risk rules below, in account currency, for the window.
  6. Rank the fixes. Measurement findings (a fail or warn on C1 to C6) go first, because they corrupt every cost per conversion after them. Show the effect: the account CPA as reported, and the CPA counting only the primary action that matches the business goal. Then quantified findings by spend at risk, largest first. Then upside (S7, Q4). Then unquantified warnings ordered by the spend of the campaigns they touch.
  7. Score. Area score = (passes + 0.5 x warns) / (passes + warns + fails) x 100, rounded. The overall score uses the same formula over all scored checks. This scoring is a default. Never let the score outrank the fix list.
  8. Write the report in the format under Output.

Spend at risk rules

Finding typeSpend at risk
Zero-conversion spend (S9, K5, Q1, P4, the broad keywords in S6)The cost of the rows that fail. Count each keyword or search term once in the total, even if 2 checks flag it
Network leak (S1, S2)Network cost minus network conversions x Google Search CPA in the same campaign, floored at 0. If Google Search has no conversions, the whole network cost
Location leak (S3)Cost from people outside the targeted countries, plus area-of-interest cost when its CPA is worse than presence cost
Cost per conversion gap (K1, Q3, X1)Cost minus conversions x target CPA, floored at 0
Measurement findings (C1 to C6)No figure. Listed first, labeled "blocks bidding" with the spend of the Smart Bidding campaigns that learn from the action, "blocks reporting" otherwise
Budget-limited with CPA on target (S7)Upside, not risk: conversions x Search lost IS (budget) / Search impr. share, labeled a rough estimate

The checks

Sources are numbered as in ## Sources. Full rules, GAQL and fixes: references/gaql-checks.md.

Conversion tracking

IDCheckFailWarnSource
C1Conversion tracking is onStatus is NOT_CONVERSION_TRACKED[1]
C2A primary action is firingNo enabled primary action converted in 30 daysNewest primary conversion is 8 to 30 days old (default)[1], [11]
C3Primary actions are business outcomesEvery primary action is a page view, engagement or outbound clickAny such action is primary next to real outcomes[11]
C4No double counting2 or more primary actions with the same category both record conversions, such as a Google tag form fill and a GA4 generate_leaddefault
C5Counting matches the actionLead categories set to every conversion, or purchases set to one conversion[12]
C6Values exist when bidding on valueA value-based strategy with 0 conversion value in 30 daysEvery primary action always uses its default value[1], [20]
C7Enhanced conversionsEffective setting OFF, or customer data terms not accepted[2], [13]
C8Consent Mode is active (EEA, UK and Switzerland traffic)Diagnostics tab shows no active status. No API field: check the UI[14], [15]
C9Auto-tagging is onOff[16]

Campaign settings

IDCheckFailWarnSource
S1Search partners on Search campaignsPartners CPA above 1.5x Google Search CPA (default), or partners cost above 2x target CPA with 0 conversionsPartners on[17]
S2Display expansion on Search campaignsDisplay CPA above 1.5x Search CPA (default), or Display cost above 2x target CPA with 0 conversionsDisplay on[18]
S3Location option is presencePresence or interest, and over 5% of cost from outside the targeted countries or worse CPA on area-of-interest traffic (defaults)[19]
S4Location targeting existsA Search or Performance Max campaign has no positive location, or reports MISSING_LOCATION_TARGETING[1]
S5Bidding matches conversion volumeTarget CPA or Maximize conversions with a target under 30 conversions in 30 days; Target ROAS or Maximize conversion value with a target under 50[20], [21]
S6Broad match runs with Smart BiddingBroad keywords on manual or click bidding spent over 2x target CPA with 0 conversionsAny enabled broad keyword on manual or click bidding[22]
S7Budget-limited campaignsSearch lost IS (budget) at 10% or more (default). Upside when CPA is on target; fix efficiency first when it isn't[23]
S8Rank-limited campaignsSearch lost IS (rank) at 50% or more (default) on a campaign with CPA on target[23], [24]
S9Campaigns that spend without convertingCost above 2x target CPA, 0 conversions (default)Cost between 1x and 2x target CPA, 0 conversionsdefault

Structure

IDCheckFailWarnSource
T1Enabled ad groups can serveReason includes NO_AD_GROUP_ADS, NO_KEYWORDS or AD_GROUP_INCOMPLETE[1]
T2Brand and non-brand are splitA campaign holds keywords with and without the brand terms the user names (default)default

Keywords

IDCheckFailWarnSource
K1Cost per conversion by match typeA match type's CPA is above 1.5x the account CPA with cost above 2x target CPA (defaults)default
K2Quality Score components on top keywordsA keyword in the top 80% of spend has a Below average component[24]
K3Keywords that can't serveDisapproved keywordsRarely served (low search volume) or below first page bid[1], [25]
K4Duplicate keywordsSame text and match type enabled in 2 or more ad groupsdefault
K5Keywords that spend without convertingCost above 2x target CPA, 0 conversions (default)Cost between 1x and 2x target CPA, 0 conversionsdefault

Search terms

IDCheckFailWarnSource
Q1Wasted search term spendZero-conversion terms costing over 2x target CPA each make up over 10% of search term cost (defaults)5% to 10%default
Q2Share of cost you can seeSearch term cost under 70% of Search campaign cost (default)[26]
Q3Close variant and expansion driftCPA of close variant, broad and AI Max matches above 1.5x exact match CPA (default)[1]
Q4Converting terms not yet keywordsTerms with 2 or more conversions at or under target CPA that aren't keywords (upside)default

Negatives

IDCheckFailWarnSource
N1Every Search campaign has negativesNo negatives from any source and cost above 2x target CPANo negatives, lower cost[28]
N2Shared lists are attachedA negative list is attached to 0 campaigns, or to some Search campaigns and not others[28]
N3Negatives don't block keywordsA keyword reports CAMPAIGN_CRITERION_NEGATIVE, or a negative blocks an enabled keyword's own text[1], [28]
N4Account-level negatives cover Performance Max and AI MaxPerformance Max or AI Max runs and no account-level negative list is linked[29], [30]

Responsive search ads

IDCheckFailWarnSource
R1RSAs per ad group0 enabled RSAs1 enabled RSA. Google advises at least 2 rated Good or Excellent, and allows 3 enabled[31], [33]
R2Ad strengthAn RSA with spend is rated Poor or Average[31], [32]
R3Enough headlines and descriptionsUnder 8 headlines or under 3 descriptions (default; Google advises up to 15 and 4)[31], [32]
R4PinningOver half the headlines pinned, or a pinned position with only 1 headline in it (default)[31], [32]
R5Policy statusAn enabled RSA is disapprovedApproved (limited)[1]

Assets

IDCheckFailWarnSource
A1SitelinksUnder 2 eligible sitelinks at campaign or account levelUnder 6[34]
A2Callouts, structured snippets, business name and logoAny of the 4 missing (default)default

Performance Max

IDCheckFailWarnSource
P1Brand exclusionsBrand terms take over 10% of the campaign's search term cost with no brand exclusion (default)No brand exclusion while a brand Search campaign runs[35]
P2Asset group healthAd strength Poor or Average, or status Not eligible or Limited[1]
P3Search themesA theme repeats a phrase or broad keyword from a Search campaign[36]
P4Performance Max search term wasteZero-conversion terms over 2x target CPA each (default)Between 1x and 2x target CPA[27], [30]

AI Max for Search

IDCheckFailWarnSource
X1AI Max matches pay their wayAI Max matched terms spent over 2x target CPA with 0 conversionsAI Max match CPA above 1.5x keyword match CPA (default)[3], [4]
X2Auto-migrated campaigns reviewedA campaign has a broad match or automatically created assets migration date[2], [3]
X3Final URL expansion and pinsFinal URL expansion is on and RSAs rely on pinned text[3], [37]

Recommendations and change history

IDCheckFailWarnSource
H1Auto-apply recommendationsAuto-apply is on for broad match, search partners or Display expansionAuto-apply is on for keywords or bidding types[6], [38]
H2Changes made by Google recommendationsA recommendation changed networks, bidding or keywords in the last 30 days[5], [6]
H3Change churn on Smart Bidding campaignsMore than 3 bidding, target or budget changes on 1 campaign in 14 days (default)default

Judgment floors and caveats

  • Thin data. Don't call a cost per conversion check on fewer than 2x target CPA of cost in the slice. Below that, report the number and mark the check "too little data". Q3, K1 and X1 need at least 10 conversions in the comparison group (default).
  • Conversion lag. Recent days undercount conversions. When the window ends today, say so, or end it 7 days ago for long sales cycles (default).
  • Quality Score is a diagnostic. Google says it isn't an auction input and shouldn't be optimized or averaged as a KPI [24]. K2 reads the 3 components on high-spend keywords only.
  • Ad strength doesn't decide serving. Google says it isn't used for Ad Rank or Quality Score [32]. R2 is a warn, never a fail.
  • Presence or interest is Google's recommended default [19]. It suits businesses that serve people who travel to them. S3 warns only when the data shows leakage, or when the business can serve only people inside the area.
  • Hidden search terms. Google omits low-volume terms for privacy [26], so Q1 is a floor on waste, never a total.
  • What the API can't see. Consent Mode status (C8), the new Display channel priority tiers Google introduced in October 2026 [18], and auto-apply types the API doesn't support [6]. Check those in the UI.
  • Changes ahead. From February 2027 Search campaigns with Display expansion move to channel prioritization automatically, which can shift spend between Google Search, search partners and Display [18]. Flag S2 campaigns for a settings review before then.
  • API versions. The queries use v26 names. In v26 enhanced_conversions_for_leads_enabled was removed in favor of enablement_setting [2]; the catalog gives both forms.
  • Attribution. This audit doesn't judge whether a conversion is worth its cost to the business. CPA here means Google's reported cost per conversion.

Output

# Google Ads audit: <account name> (<customer id>)
Window: <start> to <end> | Currency: <code> | Target CPA: <amount> (<user target | account average, used as target>)
Data: <Export mode: files used | Connected mode: Google Ads API <version>> | Campaigns in scope: <n> Search, <n> Performance Max | Out of scope: <types>

## Scorecard
| Area | Pass | Warn | Fail | Not checked | Score |
| --- | --- | --- | --- | --- | --- |
| Conversion tracking | | | | | |
| Campaign settings | | | | | |
| Structure | | | | | |
| Keywords | | | | | |
| Search terms | | | | | |
| Negatives | | | | | |
| Responsive search ads | | | | | |
| Assets | | | | | |
| Performance Max | | | | | |
| AI Max | | | | | |
| Recommendations and history | | | | | |
| Overall | | | | | <score> |

Spend at risk in the window: <amount> (<x>% of <total cost>), counting each keyword and search term once.

## Fixes ranked by spend at risk
| # | Check | Finding | Spend at risk | Fix |
| --- | --- | --- | --- | --- |
| 1 | <ID> <name> | <what the data shows, with numbers> | <amount, or "blocks bidding"> | <exact setting or action, and where in Google Ads> |

## Upside
| Check | Finding | Estimate | Action |
| --- | --- | --- | --- |

## Warnings without a dollar figure
- <ID>: <finding>. Fix: <action>. Campaigns affected: <names and spend>.

## Not checked
- <ID>: <why, and what would let us check it>.

## Do these 3 first
1. <highest-ranked fix, 1 line, exact>
2. <second>
3. <third>

Each fix names the exact setting, for example "Campaign settings > Networks: untick Google search partners on Search - Field Service". Each finding quotes its numbers. Defaults used are listed once under the scorecard.

Safety

  • Reads only: GAQL SELECT queries through gads_search, adwarp google query or Google's MCP search tool, or CSV files the user provides. It never calls the asset or label tools on Google's MCP server.
  • Changes nothing. No step in this skill writes to the account.
  • If the user asks to apply a fix, show the exact change first and ask for confirmation. Adwarp can't edit existing Google campaigns, so most fixes are made by the user in Google Ads or Google Ads Editor. Negative keyword uploads are covered by google-ads-search-terms.

Sources

All checked 2026-10-20, except source 10, checked 2026-11-07.

  1. Google Ads API v26 field reference (every resource, field and enum used in the catalog): https://developers.google.com/google-ads/api/fields/v26/overview
  2. Google Ads API release notes (v26 enhanced conversions fields, v25.1 AI Max migration fields): https://developers.google.com/google-ads/api/docs/release-notes
  3. Google Ads API, Get started with AI Max for Search campaigns: https://developers.google.com/google-ads/api/docs/campaigns/ai-max-for-search-campaigns/getting-started
  4. Google Ads API, Reporting for AI Max for Search campaigns: https://developers.google.com/google-ads/api/docs/campaigns/ai-max-for-search-campaigns/ai-max-reporting
  5. Google Ads API, Change event (30-day window, LIMIT of 10,000 rows): https://developers.google.com/google-ads/api/docs/change-event
  6. Google Ads API, Recommendations (auto-apply subscriptions): https://developers.google.com/google-ads/api/docs/recommendations
  7. Google Ads API, Segmentation (core date segments): https://developers.google.com/google-ads/api/docs/reporting/segmentation
  8. Google Ads API, Query grammar: https://developers.google.com/google-ads/api/docs/query/grammar
  9. Google Ads API, Access levels and permissible use: https://developers.google.com/google-ads/api/docs/api-policy/access-levels
  10. Google Ads MCP server, README and releases (0.0.6 of 2026-11-02 added the asset and label tools with propose and confirm; 0.0.3 of 2026-09-10 removed the developer token check): https://github.com/googleads/google-ads-mcp
  11. Google Ads Help, About primary and secondary conversion actions: https://support.google.com/google-ads/answer/11461796
  12. Google Ads Help, About conversion counting options: https://support.google.com/google-ads/answer/3438531
  13. Google Ads Help, About enhanced conversions: https://support.google.com/google-ads/answer/9888656
  14. Google Ads Help, About consent mode: https://support.google.com/google-ads/answer/10000067
  15. Tag Manager Help, Verify consent mode implementation: https://support.google.com/tagmanager/answer/14218557
  16. Google Ads Help, About auto-tagging: https://support.google.com/google-ads/answer/3095550
  17. Google Ads Help, About the Google Search Network: https://support.google.com/google-ads/answer/1722047
  18. Google Ads Help, About Display Expansion on Search campaigns: https://support.google.com/google-ads/answer/7193800
  19. Google Ads Help, About advanced location options: https://support.google.com/google-ads/answer/1722038
  20. Google Ads Help, About Smart Bidding: https://support.google.com/google-ads/answer/7065882
  21. Google Ads Help, About Target CPA bidding: https://support.google.com/google-ads/answer/6268632
  22. Google Ads Help, About keyword matching options: https://support.google.com/google-ads/answer/2497836
  23. Google Ads Help, Get impression share data: https://support.google.com/google-ads/answer/7103314
  24. Google Ads Help, About Quality Score for Search campaigns: https://support.google.com/google-ads/answer/6167118
  25. Google Ads Help, Low search volume: https://support.google.com/google-ads/answer/2616014
  26. Google Ads Help, About the search terms report: https://support.google.com/google-ads/answer/2472708
  27. Google Ads Help, About the search terms report in Performance Max: https://support.google.com/google-ads/answer/16327396
  28. Google Ads Help, About negative keywords: https://support.google.com/google-ads/answer/2453972
  29. Google Ads Help, About account-level negative keywords: https://support.google.com/google-ads/answer/11396330
  30. Google Ads Help, Negative keywords in Performance Max campaigns: https://support.google.com/google-ads/answer/15726455
  31. Google Ads Help, About responsive search ads: https://support.google.com/google-ads/answer/7684791
  32. Google Ads Help, About Ad Strength for responsive search ads: https://support.google.com/google-ads/answer/9921843
  33. Google Ads Help, About your Google Ads account limits: https://support.google.com/google-ads/answer/6372658
  34. Google Ads Help, About sitelink assets: https://support.google.com/google-ads/answer/2375416
  35. Google Ads Help, About brand settings for Search and Performance Max: https://support.google.com/google-ads/answer/13721847
  36. Google Ads Help, Unlock new relevant traffic on Performance Max with search themes: https://support.google.com/google-ads/answer/14179631
  37. Google Ads Help, How AI Max for Search campaigns works: https://support.google.com/google-ads/answer/15910187
  38. Google Ads Help, About applying recommendations automatically: https://support.google.com/google-ads/answer/10279006
  39. Google Ads Help, About change history: https://support.google.com/google-ads/answer/19888
  40. Google Ads Help, Create, save, and schedule reports from your statistics tables: https://support.google.com/google-ads/answer/2404176
  41. Google Ads Editor Help, Export account data to a spreadsheet (CSV): https://support.google.com/google-ads/editor/answer/38657
  42. Google Ads Editor Help, CSV file columns: https://support.google.com/google-ads/editor/answer/57747

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.