PAID ADS SKILL PACK BY ADDITION

Google Ads audit from your exports

Check measurement and spend. Review the evidence before changing your account.

For Google Ads practitioners with account exports, normalised to the pack’s column names. Install with Node.js and npm; run the audit with Python 3.10 or newer.

Install this pack
npx skills add addition-labs/skills --skill google-ads-audit

google-ads-auditby Additionv2.0.0released 2026-09-15commit 931d10bMIT licencereport a problem

Use your Google Ads exports to investigate conversion setup, query spend, brand traffic and product performance. Start with the conversion-action, search-term and campaign CSVs; add product, margin or audience exports for the checks that need them. The local script produces a review report and candidate changes for your approval. It does not connect to or modify your account.

What comes back is a findings file with the spend and the source fields on every row, a campaign-scoped list of negative candidates marked for review, a review list in plain prose and a manifest of the run. Nothing is paste-ready: a query with zero recorded conversions is a signal to check against the catalogue, the business brief and the conversion lag, not a negative. The agent writes the summary from the findings file and lists every area the exports could not answer.

No developer token, no API access, nothing written back to the account. A malformed export stops the run and names the file and row; a second run into the same directory is refused. The review list is yours to act on, and the checklist says which review to finish before any other.

When to use it

Ask for the review you need

Ask in your own words or name the installed skill explicitly. Requests like these load it:

  • audit this Google Ads account
  • where is the waste
  • what should I change first
  • search terms that spent without converting

What you can review

Review conversion setup, query spend and product performance

  • Conversion configuration

    Normalises every action to Primary or Secondary and flags names that suggest a micro-conversion set to Primary, or a purchase set to Secondary, for review. Names do not verify a definition; campaign goal usage is not measured unless supplied.

  • Search terms

    Query rows with cost and zero recorded conversions, plus rows above three times the aggregate CPA of the returned rows (not account CPA). Writes negative_candidates.csv, campaign-scoped, brand excluded, status review.

  • Brand activity in Shopping and PMax

    Query rows matching the brand phrases inside campaigns typed Shopping or Performance Max in campaigns.csv. Attributed cost on reported queries; not incremental sales, not savings.

  • Product contribution

    Products ranked by reported value × supplied margin − ad cost when margins.csv covers every item; by revenue − cost otherwise, and the report says which. Not verified accounting profit.

  • Repeat buyers

    Reported as not measured. Repeat-buyer spend needs verified customer-list definitions, membership windows and non-overlapping audience costs; an audience-name export cannot establish it.

  • Silent killers

    Campaigns and products with positive cost and zero recorded conversions, in the top fifth by cost or carrying at least 5% of that report’s cost. An Addition screening rule, not a statistical test.

What the inputs cannot establish

  • Which conversion action each campaign bids on: the exports carry the account-level Primary or Secondary setting, not the campaign goals.
  • Incremental sales, or the effect of a proposed exclusion or negative: an export shows what was spent and recorded, not what would have happened.
  • Whether a zero-conversion query is irrelevant: intent has to be checked against the catalogue and the business before a negative is approved.
  • Repeat-buyer spend, in any case; and contribution without a complete margins.csv. Both are reported as not measured, never filled.

See it in action

One real run, in full

Executed on synthetic inputs written for a fictional store (Northwind Candles). No live account results are shown. The five CSVs were written by hand in the pack's normalised schema; a run against an export taken from the Google Ads interface has not been done yet.

Start with the request, then read the complete result. The input and output files are linked below the run.

You ask

The normalised exports are in input/ (conversions.csv, search_terms.csv, campaigns.csv, products.csv, margins.csv). Run scripts/audit.py into a new run directory for Northwind Candles, GBP, window 2026-08-16 to 2026-09-14, brand phrases northwind / north wind / northwind candles. Then read findings.json and write the review. Copy every number; say what is not measured.

The skill delivers
$ python3 scripts/audit.py --input input --out runs/northwind-2026-09-15 --brand "northwind,north wind,northwind candles" --currency GBP --account "Northwind Candles (synthetic)" --window-start 2026-08-16 --window-end 2026-09-14
conversion actions 3 primary / 2 secondary · zero-conversion query rows 7 (1034.6 GBP) · brand activity in Shopping/PMax 434.6 · silent killers 2 · review actions 12 · not measured 7 → runs/northwind-2026-09-15

Google Ads review, Northwind Candles (synthetic), 2026-08-16 to 2026-09-14, GBP

Every number below is copied from findings.json. Nothing here is paste-ready; each line is a review candidate.

What the exports show
  • Conversion configuration. 5 actions: 3 Primary, 2 Secondary. Two Primary actions have names that suggest a micro-conversion: Add to cart (3,188 conversions, 0.00 value) and Phone call (under 30s) (61, 0.00). Names do not verify an action's definition; which campaigns use which goal is not measured.
  • Search terms. 14 query rows returned, 3,747.40 spent, 248 conversions; aggregate CPA of the returned rows 15.11 (not account CPA). Brand rows: 3, 847.20, 170 conversions. Non-brand rows: 11, 2,900.20, 78 conversions. 7 rows spent 1,034.60 with zero recorded conversions in the window, the largest candle making kit in Generic - Search at 388.70. One row is above three times the aggregate CPA: luxury candles uk, 354.00 for 4 conversions, CPA 88.50.
  • Brand activity in Shopping and Performance Max. 2 query rows matching the brand phrases: northwind candle sale in Shopping - All products (238.40, 41 conversions) and northwind in Performance Max - Catalogue (196.20, 33). 434.60 attributed cost, 74 conversions, 5,180.00 value. This is observed brand activity; incremental effect and displaced sales are not measured.
  • Product contribution. 7 products, basis: reported conversion value × supplied margin − reported ad cost. 3 below the line: NW-401 Candle making kit −396.10 (0 conversions), NW-402 Refill wax 1kg −199.90, NW-501 Birthday candles pack −88.60. Above the line: NW-301 Wick trimmer 10.20, NW-102 Sea Salt 796.98, NW-101 Fig & Cedar 1,244.84, NW-201 Trio gift set 1,369.70. Not verified accounting profit: the value has to be on the same tax, refund and currency basis as the margin.
  • Repeat buyers. Not measured: audience names alone do not identify purchasers or prospecting spend.
  • Silent killers (positive cost, zero recorded conversions, top fifth by cost or at least 5% of the report's cost): campaign Display - Prospecting 640.50 (8.3%); product NW-401 396.10 (15.2%).
What it means

Two of the three Primary actions are candidates for a configuration review, because their names read as micro-conversions; whether Smart Bidding is optimising to them depends on campaign goal settings the export does not carry. Seven queries spent without a recorded conversion in this window; each needs an intent check against the catalogue and the business brief, and a look at conversion lag, before a negative is approved. Brand queries are being served inside Shopping and Performance Max; what would happen if they were excluded is a question for an experiment, not for this export. Three products are below the line on the supplied margins, one of them with zero recorded conversions in the window.

What to review, in this order
  1. CONV-001, CONV-002: review the definitions and goal usage of Add to cart and Phone call (under 30s) before changing any optimisation setting.
  2. QUERY-003 to QUERY-009: review the seven zero-conversion queries for product fit, conversion lag and goal quality; preserve the campaign scope for any approved negative (negative_candidates.csv, status "review").
  3. BRAND-010: review the campaign roles for brand queries in Shopping - All products and Performance Max - Catalogue; run an incrementality test before changing brand coverage. Do not forecast transferred spend.
  4. SILENT-011, SILENT-012: report the window and conversion lag for Display - Prospecting and NW-401, then review before proposing a pause.
  5. Product contribution: confirm the margin basis, then review NW-401, NW-402 and NW-501 against their role in the range.
Not measured
  • Conversion configuration: campaign goal usage, custom-goal membership, conversion definitions, configured call duration.
  • Search terms: the account-level brand/non-brand split (hidden terms, campaign types, goal differences).
  • Brand activity: incrementality of brand coverage (requires a test).
  • Repeat buyers: needs verified list definitions, campaign purpose and non-overlapping reporting.

Files from this run

What this run could not do

A live account read; the repeat-buyer area and the account-level brand split, which the exports cannot establish and the report lists as not measured.

Before you install

Files you can inspect before installing

The agent loads this skill when your task matches its description. Supporting files are read when the workflow calls for them.

google-ads-audit/SKILL.md
The workflow SKILL.md: which exports, which columns, the six checks, and the write-up rules the agent follows.
scripts/audit.py
The six review areas as one Python script; standard library only; validates every file first, then writes findings.json, negative_candidates.csv, change_list.md and manifest.json into a new run directory.
PROMPTS.md
The prompts for the intake record, the run, the write-up in the house format, reviewing the negative candidates, and the second reading.
CHECKLIST.md
Before the run, after the run, and before pasting anything into the account.
README.md
What it does, inside, needs, safety, example run and limits, in one page.
LICENSE
MIT licence text as installed with the folder.
CHANGELOG.md
What changed in each version.

First run

  1. Create a working folder for the account and install the pack into your agent from there.
    npx skills add addition-labs/skills --skill google-ads-audit
  2. Export the reports from the Google Ads interface in English and normalise them to the column names in the SKILL.md table: conversions.csv, search_terms.csv, campaigns.csv are required; products.csv and margins.csv optional. No currency symbols, no total rows, decimal points.
  3. Run the review with the account label, currency and export window from your intake record, into a new run directory.
    python3 "/path/to/google-ads-audit/scripts/audit.py" --input "/path/to/account/input" --out "/path/to/account/runs/2026-09" --brand "acme,acme store" --currency USD --account "Acme US" --window-start 2026-08-16 --window-end 2026-09-14
  4. Ask the agent for the write-up with the run prompt in PROMPTS.md; it reads findings.json and lists every area the exports could not answer.

Reading the results

What you can conclude from these results

Check which conversion actions each campaign uses before interpreting performance. Review query spend and product economics against the account’s business goal and conversion lag. These exports do not establish incremental sales or the effect of a proposed exclusion.

The review list is a review list. Nothing in it is judged inside the conversion lag, and a second reading is compared against this one before any structural conclusion.

Google’s Recommendations tab is not read or repeated anywhere in the pack. The checks come from the exports, not from the interface’s suggestions.

Background: How Google Ads works: the six auction inputs

SKILL.md

The file the agent reads

MIT licence, copyright Addition Labs LLC; the file as it is in addition-labs/skills, commit 931d10b.

Open SKILL.md (1,070 words)
---
name: google-ads-audit
description: >-
  Review Google Ads conversion setup, search-term spend, brand traffic and
  product performance from local CSV exports. Use when the user requests an
  account audit or asks which queries, campaigns or products need investigation.
  Validate export schemas and reporting scope, run the local audit, and return
  evidence with campaign-scoped review candidates. Requires conversion-action,
  search-term and campaign exports; product, margin and audience data support
  additional checks. Does not retrieve or modify a Google Ads account.
metadata:
  version: 2.0.0
  released: 2026-09-15
  author: addition-labs.com
---

# Google Ads audit: six review areas, one pass

The script reads normalized CSV exports, validates them, and writes evidence. It proposes nothing paste-ready: every
line in its output is a review candidate with the spend behind it, and areas it cannot support are marked not measured.

## Input contract

Export in English and normalize the files to the column names below. Use UTF-8 CSV, one header row, no report-title or
date preamble, and no total or subtotal rows. Use a decimal point for numeric values; commas may separate thousands. No
currency symbols. Do not replace unavailable values with zero. Keep the original exports beside the normalized copies. A
missing required column, duplicate header, malformed row, total row or empty required table stops the audit and names the
file and row to fix. Nothing is guessed.

| file | required | columns (exact names; listed aliases are normalized explicitly) |
|---|---|---|
| `conversions.csv` | yes | Conversion action · Action optimization (`Primary` or `Secondary`; the legacy `Include in "Conversions"` Yes/No column is accepted and mapped) · Conversions · Conv. value |
| `search_terms.csv` | yes | Search term · Campaign · Cost · Conversions · Conv. value · optional Match type |
| `campaigns.csv` | yes | Campaign · Campaign type · Cost · Conversions · Conv. value. Every campaign named in search_terms.csv must appear here |
| `products.csv` | no | Item ID · Title · Cost · Conversions · Conv. value, one row per item |
| `margins.csv` | no | Item ID · Margin as a fraction from 0 to 1, one row for every item in products.csv |

Audience-name exports are not read: audience names alone do not enable the repeat-buyer calculation (see area 5).

## Run

Locate `scripts/audit.py` relative to this SKILL.md. Use an absolute script path and explicit input and output directories.
Use a fresh output directory for every account and run; an existing output directory is an error. Account label, currency
and the export window come from the intake record, never from a guess about when the script ran.

```bash
python3 "/absolute/path/to/installed/google-ads-audit/scripts/audit.py" \
  --input "/absolute/path/to/account/input" \
  --out "/absolute/path/to/account/runs/run-name" \
  --brand "acme,acme store" --currency GBP \
  --account "Acme UK" --window-start 2026-08-16 --window-end 2026-09-14
```

Outputs: `findings.json` (every finding row, no display slices), `negative_candidates.csv` (campaign-scoped, brand
excluded, status "review"), `change_list.md` (review candidates in plain prose) and `manifest.json` (account, window,
currency, file row counts, version).

## The six review areas

1. **Conversion configuration review.** Normalizes each action to Primary or Secondary. Flags names that suggest a
   micro-conversion set to Primary, or a purchase set to Secondary, for human review; names do not verify the action's
   definition. Campaign goal usage, custom-goal membership, conversion definitions and configured call duration are
   reported as not measured unless supplied. Do not change an action's optimization setting from its name alone.
2. **Search terms.** Query rows with positive cost and zero recorded conversions, and positive-conversion rows whose CPA
   is greater than three times the aggregate CPA of the returned search-term rows. That aggregate is not account CPA.
   Hidden search terms, campaign types and conversion-goal differences limit the comparison; the multiplier is an
   Addition screening rule. Zero recorded conversions is a review signal, not a negative: check the query against your
   products, business goal and conversion lag before approving it. Create an upload file only from approved rows,
   retaining the campaign and exact-match setting. The brand/non-brand split covers the returned query rows only.
3. **Brand activity in Shopping and Performance Max.** Query rows matching the brand phrases (whole words) inside
   campaigns whose supplied type is Shopping or Performance Max. This is attributed cost on reported queries. It does not
   measure incremental sales, organic substitution or savings from exclusions. Review campaign roles and run an
   incrementality test before changing brand coverage.
4. **Product contribution ranking.** Contribution means reported conversion value multiplied by the supplied margin
   fraction, minus reported ad cost. Confirm the value is revenue on the same tax, refund and currency basis as the
   margin. If any product lacks a margin, supply it or rerun without the margin file so the entire ranking uses revenue
   after ad spend. This is not verified accounting profit.
5. **Repeat buyers.** Not measured. Repeat-buyer spend requires verified customer-list definitions, membership windows,
   campaign purposes and a report whose audience costs can be aggregated without overlap. An audience-name export cannot
   establish it.
6. **Silent killers.** Campaigns and products with positive cost and zero recorded conversions when they are in the first
   `max(1, floor(number of rows / 5))` rows sorted by descending cost, or carry at least 5% of that report's cost. An
   Addition screening rule, not a statistical test. Keywords are not checked. Report the date window and conversion lag
   before proposing a pause.

## Write-up rules for the agent

- Copy numbers from `findings.json`; every summary there names its source fields. If an area is `not_measured`, say so in
  one line; do not fill it.
- The six areas overlap: the same spend can appear in several lists. Never sum them as independent waste.
- Some queries are withheld for privacy, so visible search-term rows do not necessarily reconcile to campaign totals.
- Say "contribution" only when margins were supplied for every product; otherwise "revenue after ad spend".
- No recommendation from Google's own Recommendations tab is used or repeated here.

## Safety

The Python script reads local CSVs and makes no network calls. It reads no credentials and launches no subprocesses. It
creates a new output directory per run and refuses an existing one. The agent's write-up sends the data it reads to the
model service configured in your agent. No Google Ads account changes are made by this script.

## Limits

- One export window hides seasonality; compare two readings before drawing structural conclusions, and say "two readings",
  not "a trend".
- Interface exports round currency to two decimals.
- This reviews. It does not push changes to the account.

Questions

Requirements and troubleshooting

What do I install first?

Node.js with npm for the installer and Python 3.10 or newer for the script. The installer adds the instructions and the script to your agent; it does not configure Google credentials or produce your exports.

Where do my files go?

Choose a working folder for the account and keep the normalised exports, the original exports and the runs apart. Pass --input and --out as absolute paths; --out must be a directory that does not exist yet.

Why did the CSV check stop?

Read the file, row and column named in the error, then fix the header or the numeric value in the original export. Do not turn a missing value into zero to make the run pass; the check exists so that a malformed export cannot become a finding.

What does an empty result mean?

One of three things, and the report names which: no rows in the export, no row that met a check’s threshold, or a check that could not run because its file was not supplied. Only the last is listed under not measured.

Will installing this connect my Google Ads account?

No. Installation adds files to your agent. The audit reads the CSVs you export by hand; nothing in the pack authenticates to Google or writes to the account.