Google Ads
Why your clinic can't track its Google Ads bookings
The booking software is usually the reason your numbers are guesswork, not the ads.
By Pete Flynn · 12 June 2026 · 6 min read
When a clinic owner tells me their Google Ads "aren't working", my first question is never about the ads. It's about the booking page. After years of auditing accounts across the Clinic Mastery community, I can tell you the single most common reason a clinic can't see whether Google Ads works has nothing to do with keywords, budget, or ad copy. It's the booking software. Embedded and iframe booking widgets quietly break the conversion signal, and once that signal is broken, every other number on the screen is guesswork. Here is what's actually happening, and what good tracking looks like.
Your booking software sets the ceiling
The clinic software tracking tier list.
Clean completion signal
Minimal setup
A real confirmation page or completion event fires the moment a booking finishes. You wire it to Google Ads through GTM, usually via GA4.
Trackable through GA4
Supported, less direct
Fires a native booking completed event to a GA4 property you connect, which imports into Google Ads. Solid and supported, just routed through GA4 rather than a tag you inject.
No native completion signal
Custom build needed
The container loads, but nothing fires when a booking finishes. Counting completions takes a custom trigger plus a cross domain fix. Developer work, not out of the box.
Where each system keeps the completed booking
Cliniko
Confirmation page URL on the hosted booking page
Nookal
Purchase event in the dataLayer from the hosted portal
Splose
A booking confirmed element on the single page flow
Zanda
Native GA4 booking completed event you connect
Halaxy
No native signal. A custom GTM trigger built by hand
None of these connect natively to Google Ads. Tag Manager, usually bridged through GA4, is the connector. The work is reading the completion signal wherever your software keeps it.
Embed or link out? It depends on the system
Cliniko and Splose
Embed it
The completion signal is readable right there on the page.
Nookal
Use the portal
The iframe breaks tracking, so the hosted page is the clean path.
Halaxy and Zanda
Either works the same
The booking runs on the vendor page, so only the tag you set inside the vendor counts.
The number on the screen doesn't matter
Before we touch the booking software, I want to be blunt about why this matters. If your conversion tracking is broken, the cost per booking in your Google Ads dashboard is a work of fiction. It might say $40. It might say $300. Neither figure is real, because the thing being counted isn't a booking. Until the signal is clean, you cannot optimise, you cannot compare, and you cannot decide whether to spend more or pull back.
This is why I tell owners that the booking page is usually the real bottleneck, not the ads. People spend weeks rewriting headlines and adjusting bids while the actual leak sits in the one place nobody looks. If you want to understand the wider picture of why cost per booking varies so much, it starts here, with whether you can measure a booking at all.
If the tracking is broken, the cost per booking on your screen is a work of fiction.
Why the widget hides the booking from Google
Here are the mechanics, in plain terms. Most clinic websites embed their booking system inside the page using an iframe or a widget. Cliniko, Halaxy, Nookal, MindBody and others commonly work this way. The patient fills in their details and confirms the appointment inside that little embedded box. The problem is that the box is usually a separate page running on the booking provider's domain, and the page wrapping it generally cannot see what happens inside.
Google Ads tracks a conversion by firing a tag when something happens, usually when a confirmation page loads. But in this setup the confirmation never loads on your site. It loads inside the widget, on someone else's domain, sealed off from your tracking. So your tag has nothing to fire on. The booking genuinely happened. Google just never heard about it.
This is also why a conversion and a conversion action are not the same thing. A real patient booked an appointment, but no conversion action recorded it. The two get conflated constantly, and the gap between them is exactly where clinics lose their ability to measure anything.
Nothing tracked, or everything tracked
When the widget hides the real booking, clinics tend to fall into one of two traps, and both are worse than they look.
The first is nothing tracked. The page can't see the booking confirmation, so no conversion fires at all. Your dashboard shows zero, or close to it, and the owner concludes Google Ads doesn't work. It works fine. The scoreboard is just unplugged.
The second is everything tracked. To get a number on the board, someone sets the conversion to fire on a button click, a page view, or a directions tap. Now every person who clicked the Book Now button counts as a booking, including the ones who opened the widget, saw the next available appointment was three weeks out, and closed the tab. This is the same trap I describe in the tap that doesn't quite turn off: a signal that's technically firing but measuring the wrong moment.
Tracking a button click counts the people who looked and left as if they booked.
Good tracking
- Fires on a verified booking completion, after the appointment is confirmed
- Counts one booking per patient
- Reflects fee for service patients you can actually serve
- Matches what you see in your practice management software
Broken tracking
- Fires on a button click or page view, before anyone has booked
- Counts intent, hesitation and abandonment as bookings
- Inflates conversions and produces a fake low cost per booking
- Has no relationship to what landed in your calendar
What good tracking actually is
Good tracking is a verified booking completion conversion. Not a page view. Not a button click. The signal should fire only after a real appointment is confirmed, and it should match what you can see in your practice management software at the end of the week. If your Google Ads conversions and your actual bookings don't reconcile, the tracking isn't done.
For an embedded widget, getting that clean signal usually takes custom development. Cliniko's embedded booking can often be tracked by listening for a message the widget posts back to the parent page when a booking completes, though the exact setup depends on how the widget is embedded. Halaxy can be harder, because some configurations only expose tracking at the practitioner level, so a common workaround is treating the Book Now page as the conversion point instead. Some platforms make direct conversion tracking difficult or block it, and pop up booking flows sit outside the page entirely. None of this is plug and play, and any agency that tells you it is hasn't met your booking system yet.
Common platforms and what they need
Cliniko
Listen for the booking message
Embedded booking can often be tracked by listening for a message the widget posts back to the parent page when a booking completes. Setup varies by embed.
Halaxy
Track the Book Now page
Some configurations only expose practitioner level tracking, which blocks a clean campaign signal. A common workaround is treating the Book Now page as the conversion point.
Locked down platforms
Direct tracking is hard
Some platforms make direct conversion tracking difficult or block it outright. Plan for a workaround or a different measurement point from the start.
Pop up flows
Sit outside the page
A pop up booking flow runs outside your page, so the booking completion is invisible without custom code.
Why this has to come first
Once the signal is clean, everything downstream becomes real. You can see that a healthy physio account costs roughly $80 to $100 per booking and check yourself against it honestly. You can spot the patient types who aren't actually reachable on Google. You can tell whether your website is even ready to take the traffic. None of that analysis means anything if the foundation is guesswork.
I'd go further. Fixing tracking before scaling spend is not optional. Putting more budget behind a campaign you can't measure is just spending faster in the dark. Get the booking completion firing first, reconcile it against your real calendar for a couple of weeks, and then make decisions. The number on the screen only matters once it's true.
Not sure if your tracking is real?
We audit clinic Google Ads accounts and check whether your booking page is actually reporting bookings.
If your conversions don't reconcile with your calendar, we'll find out why and tell you exactly what your booking system needs.
Get a free Google Ads auditCommon questions
