Methodology

The Five-Dollar Counter That Google's Change Log Never Recorded

A flat five-dollar value on a phone-tap conversion moved an HVAC budget off Search and onto toddler YouTube in nineteen days. Google's change log has no record that anything happened.

A flat five-dollar value on a phone-tap conversion moved a Chicago HVAC budget off Search and onto YouTube in nineteen days. Google's change-event log has no record that anything happened.

That second sentence is the reason this post exists. Conversion-action changes do not appear in Google Ads' change-event log at all. Not as a sparse row, not under a generic label, not behind a filter you forgot to clear — the surface does not cover that object type. An auditor who pulls the change log for the window in which this collapse happened reads two unrelated touchpoints and concludes, correctly by the evidence in front of them, that nobody changed anything. The event that actually caused the collapse was recovered from somewhere else entirely: the daily series of counted conversions against all conversions, read day by day until the two lines met.

The account is ProComfortSolutions, an HVAC contractor in Chicago and an NBM client. Everything below was measured on 2026-08-11 through the Google Ads API, GAQL, version 25. The pattern it describes has a name we use internally and will use here: the Inverse-Quality Signature — when reported conversions rise while cost per click falls and traffic quality per click halves, the bidder has not found demand. It has found a cheap proxy and is buying as much of it as the budget allows.

The frame, and why four days are missing

Comparison frames: Pre = 2026-07-01 → 07-18 (18 days). Post = 2026-07-23 → 08-10 (19 days). Outcome = 2026-08-01 → 08-10.

The four days in between are excluded because the campaign was effectively dark: daily spend ran 07-19 at $88.86, 07-20 at $58.60, and 07-21 at $0.02, with recovery beginning 07-23 through YouTube. Including four near-dark days on either side of a comparison manufactures a swing the account did not have. Excluding them is a choice, it is stated here, and anyone re-running the query can put them back and see what changes.

Step 1 — Split spend by network across a frame that excludes the dark days

NetworkPre (07-01 → 07-18)Post (07-23 → 08-10)
Search$1,494.35 · 185 clicks · 16 conv$154.92 · 18 clicks · 2 conv
YouTube$187.00 · 958 clicks · 0 conv$3,342.44 · 8,284 clicks · 364 conv
Content$653.33 · 481 clicks$53.61 · 26 clicks
Discover$385.44 · 262 clicks$6.79 · 5 clicks
Search partners$375.67 · 186 clicks$14.63 · 2 clicks
Maps$79.94 · 36 clicks$34.63 · 7 clicks
Total$3,175.73 · 2,108 clicks · 50,954 impr$3,607.02 · 8,342 clicks · 211,213 impr

Search fell from 47.1% of spend to 4.3% — $83.02 a day down to $8.15 a day. YouTube rose from 5.9% to 92.7% — $10.39 a day up to $175.92 a day, a 16.9× increase. Blended cost per click fell from $1.51 to $0.43.

Total spend barely moved. That is what makes this hard to see from a summary view: the budget was not cut, the daily number looked normal, and the account was spending roughly what it spent the week before. It was simply spending it somewhere else.

Spend share by network before and after the promotion Grouped horizontal bars compare the share of spend by network across the pre frame, July 1 to 18, and the post frame, July 23 to August 10. Search falls from 47.1 percent to 4.3 percent and all other non-video networks fall with it, while YouTube rises from 5.9 percent to 92.7 percent. A callout marks 2026-07-20, when a five-dollar phone-tap conversion action was promoted into the bidding signal — an event the change log cannot record. SHARE OF SPEND BY NETWORK — PRE VS POSTPre 07-01→18PostSearch47.1%4.3%YouTube5.9%92.7%All other47.0%3.0%0%100% of spend2026-07-20 — the $5 tel-tap action is promoted into the bidding signal.The change-event log has no row for it: conversion-action changes are outside its scope.
Frames exclude the four near-dark days 07-19 → 07-22. Measured 2026-08-11 via the Google Ads API (GAQL, v25); the promotion is dated from the counted-vs-all conversion series, not the change log.

Step 2 — Date the promotion from counted-versus-all, not from the change log

Google Ads reports both all conversions and counted conversions. When an action is excluded from the bidding signal, the two series diverge. When it is promoted into the signal, they converge, and the day they converge is the day the change happened.

The series for this account:

  • 07-14 → 07-19: counted 0 per day, against 8–15 all-conversions per day.
  • 07-20: counted 1, against 3 all.
  • 07-22 onward: counted equals all, at 15–37 per day.

The action was promoted into the bidding signal on 2026-07-20. No change-log row exists for it, because no change-log row can exist for it. This is the one piece of tradecraft in the post that is genuinely hard to copy: if you are auditing an account and the change log looks quiet, you have not established that the account is quiet. You have established that the log's scope excludes whatever happened.

The audit that would have found nothing

Run the standard competitive-audit motion on this account and it comes back clean. Pull the change-event log for July and August: nothing in it accounts for the collapse. Check daily spend: $176 a day across the pre frame, $190 a day across the post frame — barely moved. Check the bid strategy: unchanged, target CPA, the same number it carried the month before. Check campaign status: enabled throughout. Every surface a practitioner is trained to check reports that the account was left alone, and every one of those reports is accurate.

The reconstruction exists only because someone pulled the daily conversion series in both variants and watched the gap between them close. That is not a step in any audit checklist we have read, including the ones we used to run ourselves. We arrived at it by working backwards from a symptom nothing else explained, which is a courteous way of saying the change log embarrassed us into it.

The wider lesson has nothing to do with this vendor. Every observability surface you did not build has a scope boundary, and the boundary is almost never printed next to the data. A log that returns rows is telling you what it covers, not what happened. We catalogue this one again in our Instruments That Lie series, as the worked example of the log that does not log — the family in which a vendor's observability surface carries a scope boundary nobody documents.

Step 3 — Check the target CPA against the proxy's actual cost

The promoted action was a tel: tap. Counting ONE_PER_CLICK, always_use_default_value set, flat value: $5. That combination means every tap reports five dollars regardless of what the call turned out to be worth, capped at one per click — a counter with a price sticker on it rather than a measurement of anything.

The campaign's target CPA was $130, and it was left in place. Against an action that costs roughly $9–14 to produce, that is about 14× headroom. A target CPA set that far above the achievable cost per action is not a target. It is permission — the bidder will never encounter the constraint, so it optimizes without one, and the only remaining instruction is acquire more of the thing that counts.

Delivery collapsed on 07-21 to $0.02, and what came back on 07-23 was not the old campaign. It was a bidder with a new and much cheaper objective.

Step 4 — Read the conversion split, not the conversion count

364 conversions in the post frame is a real number that measures almost nothing. Split, it stops being flattering.

In the outcome frame — 2026-08-01 → 08-10, GAQL read 2026-08-11 — the Performance Max conversion split returns exactly three rows: the phone-click proxy at 202, an email-click action at 2 (uncounted), and YouTube channel subscriptions at 1. July, by contrast, carried 18 Calls from ads and one real form lead.

The other half of the signature is the tap rate. Roughly 8% of clicks produced a tap before the promotion; roughly 4% after. Per-click quality halved. Conversion count rose only because click volume rose about 4×. Rising conversions and falling per-click quality in the same window is the whole tell, and either number read alone tells you the opposite of the truth.

Where the money went

Named placements in the post frame include Mickey Mouse Clubhouse, CoComelon, Ms Rachel, Bluey, Baby Shark and Spidey and his Amazing Friends, alongside Spanish-language political clickbait and religious mass livestreams. The largest single named video row was Video no longer available, at 485 impressions — a placement that no longer exists still took impressions and still took money.

There is an honesty beat attached to this list. A measurement earlier in July put children's content at 254 impressions, 0.27% of the total, and explicitly warned against leading a finding with it. That caveat was correct for July. Against 209,062 YouTube impressions in the post frame, it no longer holds. The July finding was right for July; the account changed underneath it, and the same query returned a different world three weeks later.

Three things the API did that no playbook warns about

1. include_in_conversions_metric is immutable in v25. A direct mutate returns IMMUTABLE_FIELD. Control over whether an action feeds the bidding signal has moved to the conversion-goal model. This matters beyond one account: a large amount of published guidance still instructs practitioners to flip that field directly, and that instruction is not executable as written against API v25. If you have a runbook with that step in it, it will fail, and it will fail in a way that reads like a permissions problem rather than a design change.

2. Only one of the four video-automation enums is settable on this campaign type. The other three return ENUM_VALUE_NOT_PERMITTED. There is no advance list; you discover the boundary by hitting it.

3. Google blocked API v21 on 2026-08-11 as a partial rollout. Of three identically shaped calls, one succeeded and two failed. It presents as flakiness rather than deprecation, which is exactly the failure mode that costs an afternoon of retries before anyone suspects the version.

What was changed, and what is not yet known

Six remediations were applied on 2026-08-11 and read-back-verified the same day: the campaign was paused; the CONTACT~WEBSITE goal was set non-biddable; the target CPA was removed; three auto-created YouTube videos were paused; content-label exclusions went from 1 to 12; and enhanced YouTube video generation was set to OPTED_OUT.

At the freeze on 2026-08-12, all three legacy Performance Max and Smart campaigns were removed, with read-back showing exactly one non-removed campaign remaining in the account. A clean slate, verified rather than assumed.

No remediation outcome has been measured. Verification is scheduled for Monday 2026-08-24: average cost per click over 2026-08-18 → 08-24 must read under $10.00 against a $15.16 baseline. Until that read exists, nothing in this post confirms that any of the six changes did what it was designed to do, and this post does not claim that it did. Publishing the diagnosis before the verification is the only version of this we are willing to write.

Say the negative result precisely

"Zero calls from ads" is true in the outcome frame and is weaker than it sounds. Call assets serve on Search, and Search was starved to 18 clicks over 19 days, so zero calls is a downstream consequence of starvation rather than an independent finding. Stating it as though it stood alone would be a small dishonesty that a competent reader would catch.

What does stand alone: in 2026-08-01 → 08-10, 3,760 clicks produced zero form submissions. And across the two campaigns live in that window, $1,895.94 produced one verifiable lead.

What would prove this wrong

  • A change-event row for a conversion-action edit, in the v25 change log, for this account, in this window. That is the central claim and it is the easiest one to attack. One row breaks it.
  • An alternative explanation for the counted-versus-all convergence — an attribution-window change, a conversion-goal reassignment at the account level, a reporting lag. Any of those would move the date of the promotion or remove it entirely.
  • A post-promotion tap rate that held near 8%. If per-click quality had not halved, the signature is absent and the correct diagnosis is a volume shift, not a proxy the bidder learned to farm.
  • The 08-24 verification reading at or above $15.16. If average cost per click has not fallen below $10.00 over 2026-08-18 → 08-24, the remediation did not do what it was designed to do — and that read gets published in the same register as this one.

The transferable part

Two lines, and neither one is about HVAC. A vendor's observability surface has scope boundaries that the vendor does not enumerate, so silence in a log is not evidence of stillness. And a conversion action with a flat default value is a target the bidder will optimize toward with total sincerity, whatever you intended it to represent. If you carry a flat-value proxy action and a target CPA set well above what that proxy costs, the Inverse-Quality Signature is available to you as a four-step read today, on your own account, without waiting for anything to break. We will happily walk a team through the queries.

  • #blog
  • #google-ads
  • #performance-max
  • #conversion-tracking
  • #bidding
  • #audit
Share X LinkedIn
Build it yourself?

Get the kit, not just the theory.

We'll send the build checklist behind this post — and the next pillar when it ships. One email, no drip sequence. Unsubscribe in one click.

Want this built for you?

Book a discovery call. We'll walk your numbers.

20 minutes. Tell us what's broken, hear what we'd ship in the next 90 days. No pitch deck.