Google Ads
Why most agencies cannot track your clinic's Google Ads
There are 68,040 ways a clinic can be wired together, and your tracking has to be rebuilt against yours. Most agencies never find out which one you are.
By Pete Flynn · 14 August 2026 · 10 min read
Most agencies cannot track your Google Ads properly. Not because the people are lazy. Because the job is far bigger than anyone tells you, and almost nobody has priced in what it actually takes.
Count the ways a clinic can be wired together. Fifteen booking systems. Six ways each one attaches to a website. Nine form stacks, three kinds of phone measurement, seven page layer hazards, four tag manager situations. Multiply it out and you get 68,040 combinations, and your clinic is exactly one of them.
Tracking that works is rebuilt against your specific combination. Two clinics both on Cliniko are still two different builds, because the other five dimensions never match. Same booking system, different mountain.
We have spent an enormous amount of time and money learning to climb it reliably, and we could only justify that because clinics are all we work with. This article shows you the whole mountain. I would rather do that than pretend it is flat.
One ad click, one booking, counted once
Ten links stand between a click and a booking you can trust. All ten have to hold, and every one of them fails without an error message.
This example breaks at link four, which is one of the commonest breaks we find. Any of the ten will do it, and the report reads the same either way.
The ad click carries a tracking id
HoldsBreaks when the id is missing or stripped before the page loads.
The id survives the landing page
HoldsBreaks on a redirect, a www hop, or a plugin that rewrites the address bar.
Cookie consent lets the tag run
HoldsBreaks when the banner defaults to deny and nobody knew it had a setting.
The speed plugin lets the script execute
Breaks hereBreaks under delayed javascript. The script is on the page and never runs.
And then, quietly
The click
Still billed
The ad platform
Reports the tag as delivered
The account
Shows nothing
Links five to ten below never get the chance to run. Nothing anywhere raises an error, so everyone concludes the ads are not working.
The tag manager container loads, and it is ours
Never happensBreaks when the page loads one of the clinic's old containers.
The booking widget fires a real completion event
Never happensBreaks when the only event is the widget opening, which is browsing.
That event crosses the iframe boundary
Never happensBreaks when the booking runs on the vendor's domain and the message never arrives.
It reaches the right conversion action
Never happensBreaks when it lands on one of fifteen stale actions nobody retired.
That action counts, and it trains the bidding
Never happensBreaks when the booking is recorded but left as observe only.
Nothing double counts it
Never happensBreaks when an old tag fires too and one booking reports as two.
Why it is a trap
A chain with a silent failure at every joint does not report as broken. It reports as quiet. That is the same picture as ads that are not working, and it is the reason most clinics get told the wrong story about their own account.
A pixel measures a page view
A pixel is a piece of code that fires when a page loads. For an online shop that is nearly enough, because the thank you page is the sale. Someone bought a jumper, the receipt page loaded, the pixel fired, done.
A patient does not book on a page view. They book inside one of fifteen different booking systems, often on someone else's domain, inside an iframe, behind a cookie banner, after a speed plugin has held back every script on the page. Or they book on a phone call, which no pixel has ever been able to see.
So the pixel was never the problem. The problem is the distance between an ad click and a real person with a real appointment, and almost nothing about that distance is standard from one clinic to the next.
I have written before about why a clinic cannot track its Google Ads bookings, and about how your booking software sets the ceiling on what you can measure. This article sits underneath both of those. Not what breaks, but what doing it properly actually takes, at scale.
A pixel measures a page view. Nobody has ever booked a physio appointment by loading a page.
Ten links, and every one of them fails without an error
The chain above is the whole argument. Between an ad click and one booking counted once there are ten links, and every one of them is a separate thing somebody had to get right.
The click has to carry a tracking id. The id has to survive the landing page. Consent has to allow the tag to run, and the script has to actually execute.
Then the booking widget has to fire a real completion rather than the widget opening. That event has to cross the iframe boundary and land on the right conversion action. That action has to count and train the bidding, and nothing else can double count it.
All ten. For one booking. Counted once.
The trap is not the number of links. It is that every one of them fails silently. No error message, no red banner, no email to anyone.
The platform keeps taking the money and keeps reporting the tag as delivered, so the account just looks quiet. Quiet is exactly what ads that are not working look like, which is why so many owners get told the wrong story about their own campaign.
Ten links would be manageable if every clinic were the same
They are not. The chain does not get installed once and reused. It gets rebuilt against whatever that particular clinic happens to be running, and the range of things a clinic can be running is wider than anyone expects.
We run Google Ads for over 120 Australian clinics, and across those accounts there are fifteen different booking systems. Cliniko, Nookal, HotDoc, Halaxy, Zanda, Splose, Jane, Mindbody, Calendly, HealthEngine, Pracsuite, Gensolve, Pogozo and Snapforms are the ones that come up most often. Each of them can be wired into a website in six different ways, and the way it is wired changes the entire job.
Then there is everything sitting on top of the page. The form stack. The phone measurement. The speed plugin, the consent gate, the firewall. And the politics of whose tag manager container is on the site at all.
This is why the build never transfers. You cannot lift the tracking off one Cliniko clinic and drop it onto the next, because the booking system is the only dimension that matches. The consent banner, the speed plugin, the form stack and the container situation are all still different.
One note on the phone, because two numbers below look like they contradict something I have published. Those durations are the bar for counting a call in the account. What I report to an owner as a likely booking is a higher bar again, and that is the 90 second rule.
Six dimensions, and a clinic is one specific point in all six
Fifteen
Booking systems
Cliniko, Nookal, HotDoc, Halaxy, Zanda, Splose, Jane, Mindbody, Calendly, HealthEngine, Pracsuite, Gensolve, Pogozo, Snapforms and more. Every one of them keeps the completed booking signal somewhere different.
Six
Ways a booking system gets wired in
Embedded in an iframe on the clinic's own site. Hosted on the vendor's domain. An outbound link to the vendor. A lightbox or single page flow. A popup window. And the case where no completion signal can exist at all.
Nine
Form stacks
Contact Form 7, Elementor, Formidable, Ninja Forms, Gravity, hand written HTML, Framer, Google Forms behind a sign in wall, and Snapforms iframes. Each one hands over a submission in its own way, or does not hand it over at all.
Three
Kinds of phone measurement
A number swapped on the website, counted once the call runs past 30 seconds. Call assets on the ad itself, counted past 60 seconds. And taps on a plain phone link, which are not leads and are never counted, though a lot of reports count them anyway.
Seven
Page layer hazards
Speed plugins that hold scripts back. Consent gates. Firewalls that block a probe. Site builders with no editable head. Single page sites where the tag dies on navigation. Security headers that block tracking outright. Caching that serves an old copy of the page long after the tag changed.
Four
Container politics
Our tag manager container. The clinic's container. Both on the same page, fighting each other. Or a container nobody alive can log in to, still loading on every page, still firing whatever was in it in 2022.
Fifteen times six times nine times three times seven times four
That is 68,040 combinations.
I want to be honest about what that number is. It is straight arithmetic, not a claim that we have met all of them. Nobody has met 68,040 of anything. The point is the shape of the number, not the value.
Every new clinic that comes to us is one specific combination out of that space. You cannot find out which one by asking. The owner does not know, the web developer left three years ago, and the booking system was chosen for clinical reasons by someone who has since moved on. You find out by looking.
Every clinic is one specific combination out of tens of thousands, and you cannot find out which one by asking.
What doing it properly actually looks like
Here is the shape of the run we do on an account before I will put a number from it in front of an owner. Almost none of it is changing things. Most of it is proving things.
The rule underneath the whole run is that a success message is not evidence. A tag sitting in the page source is not evidence that it runs. A platform saying the change was applied is not evidence that it landed. Evidence is a read back from the account itself, or a rendered browser looking at the live page, and nothing else counts.
Even fully automated, that is roughly ninety minutes of machine work per clinic, and most of the ninety minutes is spent proving rather than changing. There is no version of this that is quick, and there is no way to skip to the end.
The run, in order
Step one
Read the account before touching it
Every conversion action, what each one counts, which ones train the bidding, and which ones are dead but still recording. You cannot fix a chain you have not read.
Step two
Audit every container, including the stale ones
Every tag manager container on the site, and every workspace inside them. A stale workspace is a loaded gun. One person clicking Publish out of an old workspace silently deletes the entire tracking build, with no warning and no error.
Step three
Probe the live pages in a real browser
A script being present on a page proves nothing about whether it runs. The only honest test is a rendered browser on the real page, doing what a patient does, watching what actually fires.
Step four
Write the plan down before anything changes
Every change, named, in order, with what it should look like afterwards. If it was not written down first, there is nothing to check the result against.
Step five
Review the plan adversarially, with authority to stop
Someone whose job is to find the flaw rather than to agree, and who can halt the run. A review that is not allowed to say no is not a review.
Step six
Prove it landed, then come back at 24 hours and 7 days
Read the change back out of the account instead of trusting the confirmation. Then check again the next day and the next week, because tracking gets quietly reverted by hands nobody can identify.
What we found when we opened the accounts
This is the part that is hard to say politely. When we take an account on, we grade every counted conversion in it as it arrived, before we change anything.
Roughly 58 percent are genuine bookings and calls. About 17 percent are approved proxies, which is a stand in for a booking that we count on purpose and disclose as a proxy. About 18 percent are junk counted as leads, and the remaining 7 percent we cannot classify from the outside.
So nearly one in five counted conversions, in accounts as they came to us, was not a lead. And every one of them was sitting in somebody's monthly report as a patient.
Nobody was being dishonest. The numbers were measuring the wrong events, and no part of the system was built to notice. A conversion rate over 100 percent is the loud version of this. The quiet version is an account that looks completely fine.
The payoff for fixing it is not a prettier report. It is two things. An honest denominator, so the three numbers your agency reports actually mean something. And bidding that learns from real patients, because smart bidding learns from whatever you tell it a conversion is. Ours learns from bookings. An account that counts button clicks gets better and better at finding people who click buttons.
Run the same grading on your own account
You do not need us to see the shape of this. The calculator below takes what your account reports, asks how many of those conversions you believe are real confirmed bookings, and shows you the cost per booking underneath. That second number is the one every budget decision should be made on.
Real cost per booking estimator
What your dashboard reports vs what your phone does.
Plug in your last 90 days of spend and reported conversions, then tell the calculator how many of those reported conversions are actually confirmed bookings. The gap between the two CPA numbers is the gap between the dashboard and reality.
Pull this from Google Ads > Campaigns > last 90 days.
Whatever the Conversions column shows in Google Ads.
Pick how clean your tracking is to see your real CPA.
Why most agencies will not do this
Not because they cannot understand it. None of this is clever. It is just long.
They will not do it because doing it properly costs money, produces smaller numbers to show the client, and none of the work is visible from the outside. There is no screenshot of a certified tracking chain. There is no slide for it.
I will be straight about the consequence. A competitor looking at one of our accounts sees a report with smaller numbers in it than their own report has. That is the trade, and I would make it again every time, because the alternative is charging a clinic owner to optimise toward events that were never patients.
There is one more reason we could afford to build this properly, and it is not that we are smarter. Every account we manage is a clinic, so the same fifteen booking systems keep coming up, and every combination we solve gets written down and used again.
A generalist agency meets a Cliniko iframe once a year and improvises. We have met it hundreds of times, and the answer is already on the shelf. That is what obsession with one industry buys, and it is the only way the maths of doing this ever works.
Here is the difference in practice.
The usual way
- One default tag, installed once, whatever the clinic happens to be running.
- Button clicks and taps on a phone link counted as leads.
- Junk excluded by name, so a rename smuggles it straight back in.
- The tag was installed, so it must be working.
- Never checked again after the day it went in.
- When something cannot be measured, report a number anyway.
What we do instead
- A certified pattern per booking system, matched to the clinic's actual setup.
- Completed bookings, and calls that ran long enough to be real.
- Junk excluded by mechanism, so renaming it changes nothing.
- A rendered browser probe on the live page, with the evidence archived.
- Checked again at 24 hours and 7 days automatically, plus a standing watch for silent reverts.
- When something cannot be measured, document the limit, agree the best honest measure with the owner, and say so in the report.
The mountain is not the pixel
If you take one thing out of this, take that sentence. The mountain is not the pixel. The mountain is proving that the number in the report is a real person who booked.
You do not have to climb it yourself. You do have to know it is there, because an agency that does not know it is there will hand you a number and call it a patient.
So ask three questions. What exact event fires when a patient finishes booking. When did somebody last open the live page in a browser and watch it fire. And what happens if it stops firing tomorrow. What you can afford to spend acquiring a patient is a maths problem, and every input to it comes off the chain in this article.
The mountain is not the pixel. The mountain is proving that the number in the report is a real person who booked.
Find out what your account is actually counting
We grade every counted conversion in your account before we change a thing.
Genuine bookings, disclosed proxies, and junk that has been reported to you as patients. You get the split, the true cost per lead underneath it, and what your specific booking system needs.
Get a Google Ads auditCommon questions
