Who Audits the Verdict the Machine Produced?
In one week, three machines handed me a verdict.
The first was my own engine: the code that builds and reads Google Ads accounts through the API. It decides whether a target CPA ladder continues. The second was Google's "auto-apply recommendations" feature. The third was mine again. This time it was the draft of an article.
All three had a rationale. Under all three, the rationale was hollow.
Both cases below are from the same three weeks. Two accounts, all live account data, a July 25 to August 14 window. The numbers were re-pulled from the Google Ads API, and business names are withheld for client confidentiality.
When the decision was put on hold, the last step of the ladder had been live for six full days.
If a machine issues a verdict, it owes you the evidence behind its rationale.
At the end I will apply that rule to this article. That is where we find a sentence in my draft that was false.
1. My own engine picked the wrong window
At a diving center I run in Kaş we were stepping the target CPA down. The aim was simple. Lower cost per conversion, same volume. After each step a reading happens. That reading decides whether the ladder continues.
| Step | Target CPA |
|---|---|
| 0 | no target |
| 1 | ₺85 |
| 2 | ₺72 |
| 3 | ₺62 |
| 4 | planned |
The engine produced the last reading. Its verdict was clean: freeze the ladder, cancel step 4. It had a rationale too. It matched the same Saturday-Wednesday slice and put two targets side by side.
| The engine's comparison | Conversions/day | CPA |
|---|---|---|
| ₺72 (the window it claimed) | 11.60 | ₺76.25 |
| ₺62 | 11.80 | ₺77.00 |
The conclusion was one line: "No difference, the step is neutral." Matching weekdays was the right instinct. The problem was the range it called "the ₺72 window."
August 1-5.
But that target only went live on the afternoon of August 3. Two of those five days belonged to the previous step. The third was mixed. So the number presented as "this is what the target looked like" was a blend of two targets.
I rebuilt the windows by hand. The real timestamps came from Google's own change history: change_event, the record of who changed what and when. Not memory, not the dashboard summary. The hour lives only in that record.
| Step | Went live |
|---|---|
| ₺85 | July 29, 18:03 |
| ₺72 | August 3, 15:34 |
| ₺62 | August 7, 17:38 |
All three mid-afternoon. So those three days are mixed and must be dropped. Nothing else in the campaign settings changed in between.
Which step of the ladder do you think produced the best CPA?
The table below is clean full days only, as of August 14. Look at the bold row.
| Target | Days | CPA | Conversions/day | CVR | CPC |
|---|---|---|---|---|---|
| no target | Jul 25-28 (4) | ₺74.83 | 11.62 | 26.7% | ₺20.00 |
| ₺85 | Jul 30 - Aug 2 (4) | ₺70.86 | 11.00 | 29.3% | ₺20.79 |
| ₺72 | Aug 4-6 (3) | ₺63.81 | 14.50 | 27.9% | ₺17.79 |
| ₺62 | Aug 8-13 (6) | ₺76.45 | 11.83 | 23.5% | ₺17.97 |
I decomposed CPA into its parts: CPA = CPC ÷ CVR. On the first step down, clicks got cheaper and the conversion rate held. On the next one, clicks stayed flat. The only thing that fell was the conversion rate.
So nothing was left to make cheaper. Click quality looks like the only thing that moved. I say "looks like" because my own correction has to meet the same standard.
But this comes out of three days. Could it be a sampling artifact?
It could. That window holds only three days and 156 clicks. In a sample that small, the gap can come out of chance alone. Two separate tests say exactly that.
| Comparison | Test | Result |
|---|---|---|
| ₺62 vs ₺72, CVR gap of 4.4 points | two-proportion z | z = 1.02, 95% CI [−4.1, +12.9] points |
| Weekday to weekday: Aug 4-6 vs Aug 10-13 | two-proportion z | CPA ₺63.81 vs ₺76.11, z = 0.92 |
So the gap does not separate from measurement noise on its own.
What is a confidence interval?
The gap you measure in a small sample is not the real gap. A confidence interval tells you the range the real gap most likely sits in.
The range in the table above spills over both sides of zero. So the real difference could be a rise just as easily as a drop. The number I measured is only one point inside that range.
As long as zero sits inside the range, you cannot claim there is a difference. All you can say is that the data is not yet enough to decide.
And there was one more trap. On August 7 we deployed consent management on the same site. That date falls exactly between the two windows.
I wrote up how a consent configuration throttles ad measurement in the measurement post.
Was the bid lever exhausted, or did measurement change?
So "CVR dropped" has a ready alternative explanation. Maybe Ads simply started seeing fewer conversions after that date. To rule it out, I put what Ads counts next to what GA4 counts.
| Window | Ads conversions ÷ GA4 events |
|---|---|
| no target (Jul 25-28) | 0.93 |
| ₺85 (Jul 30 - Aug 2) | 0.98 |
| ₺72 (Aug 4-6, before consent) | 0.89 |
| ₺62 (Aug 8-13, after consent) | 0.96 |
The ratio does not break. It ticks slightly up, and that small rise sits inside the noise band too (Welch t = 1.12).
So the measurement-artifact explanation cannot stand on this data. The one exception is the switchover day itself, when the ratio falls to 0.55. That day sits outside both windows anyway.
Here is what I am left with. The metrics point the same way. The measurement change at the boundary is ruled out. No evidence says the last step produced a gain. That is not enough to say "₺62 is bad." It is enough to say "there is no reason to continue to ₺60." The decision was tied to the next full-day reading.
Two lessons came out of this. First, for the account: the lever that takes CPA below the ₺72 band is probably no longer the bid. It is conversion quality. Search terms, match types, landing page.
Second, for the engine. The one who made this mistake was not a human.
It was my own code.
2. The recommendation that rewrote a bid before dawn
The second verdict was not mine. On August 10 I looked at a beauty salon account in Kayseri. I had not touched the campaign's bid setting, yet a target CPA was written on it.
I opened the same change history a second time. Different account, different question. The record I wanted was a single line.
Who wrote it?
- Date: August 3, 04:45
- Source:
GOOGLE_ADS_RECOMMENDATIONS_SUBSCRIPTION
So Google's "auto-apply recommendations" feature had changed the economics of the campaign. Before dawn, without asking anyone.
The value it wrote happened to land in a reasonable band. So I did not revert it. But that does not make the way the decision was taken defensible. So I swept every account in the agency. I switched off every auto-apply class that touches bidding.
The two failures are not the same. The engine's was a wrong comparison. This one was an unlogged decision. What is missing is identical: if a machine issues a verdict, it owes you the evidence behind its rationale.
3. Auditing my own draft
I applied the same rule to this article. The draft said this: on one account I had found 22 open rules, thought I had switched them off, and the API still showed them all enabled. Before publishing I asked again and read both accounts' records one by one.
- First account: 22 subscription records exist, 21 of them
DISABLED. Only one is enabled, an ad copy recommendation from a class that does not touch bidding. - Second account: 15 records, none enabled.
So either the disable operation landed in between, or on the first sweep I counted rows and never read the status field.
Either way the result is the same: the sentence "22 open rules" is not true, and it would have shipped if I had not verified it.
The rule behaved the same way on all three machines. You have not switched something off until you have verified it. The way to verify is not the dashboard. It is asking the API and reading the status field.
Make the verdict carry its evidence
I wrote a rule into the engine. Any reading that claims a window comparison must list the days it compared, one by one, and show which setting each day belongs to. If the list does not hold, the verdict is blocked and the decision stays open.
Put the same requirement on your own account.
A checklist for your own account
- If a reading claims a window comparison, does it list the days? Was the transition day dropped?
- Where did the date and hour come from? Memory, or the
change_eventrecord? - Who can change bids in your account? Is "recommendations → auto-apply" switched off?
- How do you know it is off? From the dashboard, or from the status field in the API?
- If a verdict says "no difference", where is the confidence interval of that difference?
None of this list is about the verdict itself. It is about the rationale underneath. Reading the decision a machine made is easy. Reading the window under it is not.
If a machine issues a verdict, it owes you the evidence behind its rationale. Google's machine, yours, and your draft alike.
Frequently asked questions
How do I switch off auto-applied recommendations in Google Ads?
You can disable auto-apply classes from the Recommendations page, and the ones that touch bids and budgets should go first. But verify through the API rather than the dashboard: if the status field on the recommendation_subscription record is not DISABLED, the rule is still live.
What is the change_event log for?
It is the hour-level record of who changed what and when in the account. When you read the effect of a setting change, take the date from there instead of from memory or a dashboard summary. The hour matters, because a setting that goes live mid-afternoon turns that day into a mixed day.
Which days should be dropped from a bid-step or A/B reading? The day the setting went live. A target that starts in the afternoon collects part of that day's traffic under the old setting and the rest under the new one. Keep the mixed day in your window and you report the average of two settings as if it were one.
The numbers are real account data, re-pulled and verified through the Google Ads API and the Google Analytics data API before publication. Related post: what gains value as the levers close.
Share this post
Let AI Manage Your Google Ads
AI-assisted Google Ads campaign management over Slack with Hektera Ads. Optimize your performance.
Explore Hektera AdsRelated Posts
Google Keeps Closing the Manual Levers. What's Left of the Agency's Job?
Language targeting is going away too. As the control levers close, what actually gains value? Four real cases: measurement accuracy, causal discipline, and keeping ads aligned with business reality.
Half of Our Record Day Was Bots: How I Caught Fake Clicks in Google Ads
Half of the Display campaign's conversions were not human. How I caught and cut fake clicks with GA4 minute-level forensics, a placement blacklist and session-age gated conversions.
40% of the Budget Went to the Wrong Searches: Hunting Leaks with the Search Terms Report
A psychiatry practice's Google Ads account was paying ₺1,142 per appointment request. The search terms report showed 40% of the budget flowing into two classes of searches that never converted. After cleanup and restructuring, the cost dropped to ₺148 — a step-by-step account of how.
I can do this for your account too
I consult on Google Ads, measurement setup and conversion-focused websites. Let's start with a short intro call.
Write for consultingWeekly Newsletter
New analyses, experiments and case notes, straight to your inbox.