Google Ads · continuous review

Your ad account,
beaten thin.

Goldbeater reviews your Google Ads account every week, finds what is costing you money, and drafts the exact changes — line by line, for you to approve.

Read-only to start · No changes without your approval · Disconnect any time

Run 0412
Recoverable · monthly

Findings

5

  • Check
    search-terms/brand-overlap
    Evidence
    412 terms · 19% of spend
    Area
    Search terms
  • Check
    pmax/asset-group-thin
    Evidence
    3 of 7 groups · 4 headlines each
    Area
    Performance Max
  • Check
    conversions/double-counted
    Evidence
    Form_Lead · Contact_Thanks
    Area
    Conversions
  • Check
    budget/capped-search
    Evidence
    Lost IS (budget) 0.22 · 28d
    Area
    Budget
  • Check
    geo/spill
    Evidence
    2 campaigns · 6% of clicks out of area
    Area
    Locations
Sample accountNothing applied without approval
26
deterministic checks before a model sees anything
Every
operation diffed, current value against proposed
Zero
changes applied without a human approving the item
Read-only
by construction — the write path is a separate, gated step
26 deterministic checks
brand-overlapsearch-term-wastenegative-conflictduplicate-keywordmatch-type-driftquality-score-droplanding-page-mismatchconversion-double-countconversion-action-staleattribution-mismatchbudget-cappedbudget-starvedbid-strategy-churntarget-cpa-unreachableimpression-share-lostasset-group-thinasset-rejectedheadline-duplicationsitelink-missingextension-coveragegeo-spillpresence-only-offschedule-blind-spotdevice-bid-gapaudience-unattachedtracking-template-broken

The problem

Most of your spend is fine. The problem is the part that isn’t.

Nobody audits an account every week, because doing it properly takes a day and finds the same five things four times out of five. So it gets done quarterly, and the waste compounds in between.

Goldbeater does the boring pass every week and only tells you what changed. The checks are deterministic — regex and dataframes, not a model guessing — so the same account produces the same findings twice.

Total spendWasted spend
$25k$12.5k0CONNECTED$22,600$1,190WK 1WK 12
Sample account · 12 weekswaste −69% · spend held flat

How it works

One agent. It queries, it writes Python, it follows its own leads.

A weekly review and a question you type are the same agent turn opened with a different first prompt. There is no second pipeline, which is why what it finds on a schedule is exactly what it finds when you ask.

Cadence

Weekly, or on demand

First pass

Deterministic

Tool surface

11 tools, flat

Output

Findings + change sets

Step 01

It pulls the account

Thirty-seven queries against the Google Ads API, paginated and retried, written to working files that expire on their own. We keep conclusions, never a mirror of your account.

Scorecard · vs. last review
Sample
  • Search terms

    6214up 14
  • Performance Max

    489up 9
  • Conversions

    91no change
  • Budget pacing

    773down 3
Step 02

It runs the checks, then follows the thread

Twenty-six deterministic checks first — the same ones a human analyst runs, no model involved. Then the agent writes its own pandas over the same frames and chases whatever the checks turned up.

Agent turn · live
Sample
  1. gaqlSELECT search_term_view.search_term, metrics.cost_micros …4,182 rows · 1.9s
  2. run_pythonmewads.run_audit(manifest, profile)26 checks · 3.4s
  3. run_pythonbrand_overlap(terms, profile.brand_tokens)412 matched
  4. gaql… WHERE campaign.id IN (17 ids) AND segments.date …1,204 rows · 0.8s
  5. propose_change_set4 operations · validate-onlydrafting
Step 03

It drafts the change, you approve the line

A finding is an observation. A change set is a proposal. You see the per-operation diff — what each value is now, what it would become — and accept or reject item by item.

Change set 0412-a · validate-only
Sample
ResourceFieldCurrentProposedDecision
Search — Brandnegative_keyword+412 termsApproved
Search — Corecampaign_budget.amount_micros$120.00 / day$168.00 / dayApproved
PMax — Retailasset_group.headlines4 headlines11 headlinesPending
Search — Coregeo_target_constanteverywhere3 metrosRejected
2 approved · 1 pending · 1 rejectedRollback artifact written before execution

Safety

The guardrails are structural, not a prompt asking nicely.

A model instruction is a preference it can reason around. Everything below is a boundary in the code, evaluated on every call.

The account ID is not in the query
GAQL has no account identifier in its syntax. The target account comes from a signed, minutes-long capability token the proxy sets. There is no string the agent can write that reads someone else's data — the code path to express it does not exist.
The sandbox cannot reach Google
Egress is deny-by-default with exactly one allowlisted host: our own proxy. Your OAuth refresh token and our developer token never leave the server, and the proxy only calls the search service.
Nothing applies without a rollback
A change set runs validate-only first and is refused outright unless a rollback artifact was written. After it executes we re-run the diff as a read-back check, and mark it applied only when that comes back empty.
Your account data is treated as untrusted
Search terms are what strangers typed into Google. They arrive as data, structurally separated from instructions — and the backstop is architectural: the agent can only propose, so the worst case is a bad suggestion you decline.

Free first review

Connect an account. Get the findings before you decide anything.

Start a review