Google Ads
Your booking software decides what your ads can measure
Before you blame your ads, find out where your software actually keeps the completed booking signal.
By Pete Flynn · 15 June 2026 · 10 min read
Most clinic owners think the quality of their Google Ads comes down to the keywords, the copy, or the agency running them. It doesn't, not entirely. A decision you made years ago, for reasons that had nothing to do with marketing, quietly set a ceiling on how cleanly your ads can ever measure a booking. That decision was your practice management software. The booking system you chose because it handled your clinical notes nicely, or your front desk liked it, governs how easily Google can see a completed booking and, just as importantly, where that completion signal lives. I run Google Ads for over 120 Australian clinics, I'm a physio of 15 years, and I'll tell you straight: before you blame your ads, find out what your software is actually letting you see. Because the answer is different in every one.
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 thing nobody tells you when you pick a booking system
When a clinic chooses its practice management software, the conversation is about clinical workflow. Does it do notes well, does it handle invoicing, does the front desk find it easy, does it talk to Medicare. Nobody in that room is thinking about Google Tag Manager or conversion tracking, because at the time there are no ads to track.
Then a year or two later the same clinic starts spending on Google Ads and quietly hits a wall. The reports look strange. The numbers don't reconcile with how many new patients actually walked in. The owner assumes the ads are broken, or the agency is hopeless. Often neither is true. The software is simply keeping the completed booking signal somewhere awkward, and nobody wired it up properly.
I was guilty of underrating this too. Early on I'd build a lovely account and then discover the booking system kept the completion signal in a place that needed real work to read, no matter how good the campaign was. So now it's almost the first thing I check. Which brings us to the uncomfortable part: not all software is equal, and the difference is not whether you can track a booking, it's how much custom work it takes and how clean the attribution stays.
Before you blame your ads, find out what your software is actually letting you see.
The honest tier list, named
I'll say the quiet part out loud, because a clinic owner deserves to know where their exact setup sits. And the honest version is better news than the scary version. Every major Australian practice management system now has a documented path to track a completed booking. None of them connect natively to Google Ads. Google Tag Manager, usually bridged through GA4, is the connector in nearly every case. What separates them is where the completion signal lives and how much work it takes to read it.
Cliniko and Nookal are the cleanest, as long as you use the hosted booking page rather than an embedded iframe. Splose is clean too, tracked off a confirmation signal that appears on its single page booking flow. Zanda, the system some people still call Power Diary and a few mishear as Xandr, is fully trackable through its own native GA4 event, just not via a tag you inject yourself. Halaxy is the genuinely hard one, where you can load your container but have to build the completion trigger by hand.
Here's the part that surprises people. None of this changes how good your clinic is, how many people book, or even your real conversion rate. It only changes how easily you can see it. A clinic on the cleanest system and a clinic on the hardest one can be performing identically while one needs five minutes of setup and the other needs a developer. The infographic below maps where each system keeps its completion signal. Once you've seen your own software on it, the next question is obvious: why is the booking page a clean signal in one system and a custom build in another?
Where each system keeps the completion signal
The whole game is one question: when a patient finishes booking, does the software fire something a tracking code can read, and where does it fire it. That single difference is what separates a five minute setup from a developer job.
Cliniko's hosted booking page is the gold standard. It has a real confirmation page whose URL marks the booking as done, so a simple page view trigger in Google Tag Manager fires the conversion. Nookal is just as clean from its hosted page: it pushes a purchase event to the dataLayer, fires natively to GA4 and the Facebook Pixel, and can even redirect the patient to a page on your own domain after they book. Splose has no confirmation URL because the whole flow lives on one page, but it exposes a booking confirmed signal you can catch with an element visibility trigger.
Zanda works differently again. Its Client Portal natively fires a booking completed event to a GA4 property you connect, you just enter a GA4 Measurement ID in its settings. You mark that event as a key event in GA4, link GA4 to Google Ads, and import it as a conversion. There's no container you inject and no confirmation URL, so it routes through GA4 rather than a tag of your own, but the completed booking is fully and natively trackable. Anyone who told you Zanda can't be tracked was wrong.
Halaxy is the one that earns its reputation. You can paste a Google tag or container ID into its tracking settings, so its hosted booking pages load your container. But there's no confirmation URL, no dataLayer event, nothing native that fires when a booking finishes. To count a finished booking you have to build a custom trigger to detect the completion step inside Halaxy's hosted single page app, and then solve cross domain attribution, because the booking completes on halaxy.com while the click ID sits on your own site. Doable for a developer, not out of the box.
Clean signal, minimal custom work
- Cliniko hosted: confirmation page URL fires a page view conversion. The cleanest of the lot.
- Nookal hosted portal: purchase event to the dataLayer, native GA4 and Pixel, plus a redirect to your own domain.
- Splose: a booking confirmed element appears on the single page flow, caught by an element visibility trigger.
- Zanda: native booking completed event to a GA4 property you connect, imported into Google Ads. Routes through GA4, not a tag you inject.
Trackable, but workaround heavy
- Cliniko embedded iframe: relies on a message passed to the parent page with a custom listener, and attribution degrades so bookings often report as Direct.
- Halaxy: container loads, but no native completion signal at all. Custom trigger plus cross domain attribution. Developer work, not out of the box.
- Any setup with no confirmation event wired up: you end up counting landings, not bookings.
- Anything left on default tracking: page loads and repeat visitors get counted as conversions.
Why a page load can masquerade as a booking
When nobody wires the completion signal up properly, tracking does not go quiet. It does something worse. It counts the wrong thing and reports it with total confidence. The booking page load gets counted. The book now button click gets counted. A returning patient hitting the ad twice gets counted. None of those is a finished booking, but the numbers look healthy, so the owner spends against them.
This is why the where matters so much. On Cliniko hosted the completion signal is a specific confirmation URL, so a page view trigger can only fire when someone genuinely finished. On Halaxy, with no native completion event, it is tempting to fall back on counting page loads, and that is exactly how an account ends up reporting nonsense. The fix is never to count the easy thing. It is to read the real completion signal wherever the software keeps it.
Which raises the cost of getting it wrong, because if you're counting the wrong event, you can't manage the money at all. You're optimising toward a number that was never real.
Embedded or link out? It depends on the system
There's a tidy rule that floats around: embed the booking on your own site and you track everything, link out to the portal and you lose a slice. It sounds clever and it's wrong as a blanket rule. The honest answer depends entirely on the system, because what matters is whether the completion signal is readable, not whether the widget sits on your page.
Embedding works for Cliniko and Splose, because the completion signal is readable right there on the page, a message to the parent page for Cliniko, a confirmed element for Splose. For Nookal it inverts. Nookal advises against iframe embedding, because recent third party cookie and storage restrictions break embedded tracking, so the hosted portal is the clean path and the embedded widget is the unreliable one.
For Halaxy and Zanda the question is moot. Whether you embed the iframe or link out, the booking runs on the vendor's own page either way, so your site's own tag can't see inside it. The only thing that counts is the tag or Measurement ID you set inside the vendor. So the right move is not a universal rule. It's reading what each system actually exposes and pointing the conversion at that.
How the setup changes the way you run the account
Cleanest path
Manage straight to the booking
Cliniko hosted and Nookal portal give a real completion signal with minimal work, the confirmation URL or the purchase event. You move budget toward what produces patients with confidence, because the number you're optimising to is the booking itself.
Trackable, light lift
Splose and Zanda
Splose fires a confirmed element you catch with a visibility trigger. Zanda fires a native booking completed event into GA4 that imports to Google Ads. Both are solid and supported. Zanda just routes through GA4 rather than a tag you inject yourself.
Workaround heavy
Cliniko embedded iframe
Still trackable, but it leans on a message to the parent page with a custom listener, and attribution degrades so bookings often report as Direct. The hosted page is the cleaner choice when you have it.
The hard one
Halaxy needs a build
The container loads, but nothing native fires on completion. You build a custom trigger inside its single page app and solve cross domain attribution. Doable for a developer, not something to count on out of the box.
The 90 second rule, for the part software can never see
Even on the cleanest software, one chunk of demand stays invisible: the phone. Nobody completes a phone booking inside a tracking pixel. So I report a proxy. I count how many phone calls lasted longer than 90 seconds, because a call that short is almost never a booking, and a call past 90 seconds has a real chance of being a new patient.
It's not perfect and I don't pretend it is. The owner can apply a sensible assumption, say half of those longer calls booked, and now even the offline slice has an honest estimate attached. That's the difference between a number you trust and a number you wish were true.
Stack it together and a picture forms. Your software sets where the online signal lives, the right trigger reads it cleanly, the 90 second proxy backfills the phone, and what's left is a measurement system you can actually steer by. The only thing missing is the question every owner asks once they understand all this: do I need to switch software?
Do you need to switch software? Almost never
Here's the reassuring part. For nearly every clinic the answer is no. Every major system on the market can track a completed booking now. Cliniko, Nookal, Splose and Zanda all have a clean or supported path, and the job is to wire it up properly, not to rip out a clinical system your team loves. Even Halaxy is trackable, it just needs a developer to build the completion trigger and sort out cross domain attribution.
The real watch out isn't the brand on your invoice, it's leaving the tracking on defaults or pointed at the wrong event. That's what produces a 148% conversion rate and months of spending against a number that was never real. The work is to read the completion signal where your specific software keeps it. On Cliniko that's a confirmation URL. On Nookal it's a dataLayer event from the hosted portal. On Zanda it's a GA4 event you connect and import. On Halaxy it's a custom build. Different craft for each, same goal.
And I'll be honest about who does that craft. The fiddly cases aren't something a clinic owner should attempt themselves, and I outsource the trickier code to a developer myself, because when I make a mistake in a custom trigger I can't always find it without starting from scratch. That's not a confession of incompetence. It's the reason a clinic shouldn't have to learn Google Tag Manager to know whether their ads are working. You should just get the truth, every month, in numbers you can trust.
See your real numbers
Find out what your software is actually letting you measure
A diagnostic that checks your tracking against your booking system and shows you where the completion signal lives, and whether anyone wired it up, before you spend another dollar.
Get a Google Ads auditCommon questions
