# Read Google Ads campaign performance the right way

> Tier: recipe. Operating recipe: real tool sequence, core rules, known traps.

Campaign performance ranked by spend with statuses, so the account's story is readable in one table.

**Intent.** A clean campaign-level performance table, ranked by spend, with statuses attached.

## When to use

- Any 'how are the campaigns doing' question.
- The first read on an unfamiliar account.

## When not to use

- When the question is why something changed: use campaign-anomaly-investigation.

## Sources

Required: Google Ads

## Preconditions

- The account is ticked in the dashboard, confirmed via list_accounts.

## Inputs

- `window`: Analysis window. Default: last 30 days.

## Procedure

1. Pull campaigns with status, type and serving state. — tools: `google_ads_get_campaigns`
2. Pull performance over the window and rank by spend. — tools: `google_ads_get_insights`

## Decision rules

- **When** A paused campaign still shows spend in the window → **conclude** It ran during the window: date the pause before reading the numbers as current.
- **When** The top campaign by spend is 'Limited by budget' → **conclude** The account's ceiling is money, not demand: say so before any efficiency judgement.

## Evidence requirements

- Every figure carries its account, metric and window.
- Anything below a readable sample size is reported as unjudged, not as zero.

## Human approval boundary

- The readout changes nothing. Any change it motivates goes through Safe Writes: preview, human confirmation, then apply.

## Failure modes

- Reading removed campaigns' history as live performance.
- The last 72 hours under-report conversions on every read.

## Output

- **Readout**: The figures, with windows and accounts named.
- **Flags**: What deserves a deeper skill or a human decision.
