An ads agent that grades its own advice

A weekly Claude agent reviews AHA’s Google Ads like a senior manager but can’t touch the account. A person applies each idea, and the next run grades how last week’s advice worked.

27 Oct 2026 4 min readCase study · Growth intelligence platform

The problem

Ads advice is only useful if someone checks, a week later, whether it worked.

The solution

A Claude agent suggests at most 8 changes, a person applies them, and the next run grades each one.

≤ 8recommendations per weekly run
0changes it makes to the ad account
16recommendations logged by June

It’s easy to get a language model to suggest changes to an ad account. The hard part is knowing, a week later, whether any of them helped. So the ads agent I built for AHA, with Claude Code, has two jobs on every run: suggest a few specific changes, and grade the ones applied last time.

A senior ads manager with no edit access

The agent is Claude Sonnet 4.6 playing a “Senior Google Ads Manager”. Code builds it a dense brief from five reporting views plus its own recommendations from the last two weeks, and asks it two questions: what should we do this week, and how did last week’s advice work?

It can’t change the ad account. The prompt says the agent “does NOT push changes”, and its only output is rows in a database: recommendations and a run log. I review the recommendations and apply the good ones in Google Ads myself.

It runs inside the nightly sync, after the Meta step so it sees fresh data, but it skips itself until 6 days have passed since its last good run. In practice that makes it weekly. A dry-run mode prints the brief and Claude’s answer without saving any recommendations.

What it’s told to care about

Without context, an ads model would chase cheap clicks. This one gets AHA’s context first:

  • AHA sells only in Mumbai, Thane and Navi Mumbai, so a lead from anywhere else is wasted.
  • Lead quality beats volume: a cheap lead from a pincode we can’t serve is worse than a pricier one we can.
  • A booked demo is the strongest signal that arrives quickly, because deals take 30 to 90 days to close.
  • Attribution is messy. Campaign tags on leads don’t match Google’s campaign names, so it has to match them fuzzily.

Then its priorities: block search terms that get clicks but never convert (“how to …” searchers are researching, not buying), pause low-Quality-Score keywords that spend without converting, move budget away from campaigns whose leads fall outside the service area, flag ads underperforming their peers by more than 30%, and flag campaigns with missing tracking.

A form, not an essay

Every recommendation must name its exact target: the search term, the keyword or the campaign. Claude replies in JSON only:

weekly_summary      2 to 3 sentences on the week
follow_up_analysis  each earlier idea → worked | inconclusive | backfired | too_soon
recommendations     up to 8 × { type, exact target, reason, evidence,
                                expected impact, priority 1 to 5 }

There are eight kinds of action, from adding a negative keyword to fixing tracking, plus a plain note. The evidence field carries the clicks and conversions behind each idea. The cap is 8 per run, and the prompt asks for fewer when the data is too thin to be confident.

Grading last week’s advice

This is the part that matters. Each run, earlier recommendations come back in the brief with their status and the date they were applied. For each one marked as applied, the agent looks at what happened next and gives a verdict with its evidence: worked, inconclusive, backfired or too soon. The verdict is written back onto the original recommendation with a date, so every idea carries its own report card. Pending ideas that still matter can be re-prioritised.

A person in the loop

New recommendations land as Pending on a page called Senior Ads Manager. I move each one to Applied, Snoozed or Dismissed, and marking one applied stamps the date, which goes into the next brief.

Before applying anything, the evidence is one click away: 6 drill views over the last 30 days, covering wasted search terms, keywords, ad groups, ad copy, demo rate by lead source, and UTM lead quality over 90 days.

Every run is logged as well: the brief Claude saw, its raw answer, how many recommendations it made, and the reason if it skipped. When a recommendation looks odd, I can read exactly what the agent was looking at.

Where it stands

By June the log held 21 runs (it records skipped nights too) and the queue held 16 recommendations. I’m not quoting savings. Each recommendation states an expected impact, but an expectation isn’t a result, and that gap is what the grading is for.

Rules I’d reuse

  1. Advise, don’t act. The agent’s only output is a table of suggestions.
  2. Cap it. Eight ideas at most, fewer when the data is thin.
  3. Demand a target. “Improve targeting” isn’t a recommendation; a named search term is.
  4. Grade it. Last week’s advice comes back in this week’s brief.
  5. Log everything, including the runs that were skipped.

More problems, more solutions.

All posts

Non-brand clicks are the SEO number that matters

+183% non-brand clicks

A path-traced showroom in a TV browser

22 renders, path-traced offline in about 2 hours