Clinic Mastery Marketing

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.

A

Clean completion signal

Minimal setup

Cliniko (hosted)Nookal (portal)Splose

A real confirmation page or completion event fires the moment a booking finishes. You wire it to Google Ads through GTM, usually via GA4.

B

Trackable through GA4

Supported, less direct

Zanda

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.

C

No native completion signal

Custom build needed

Halaxy

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 audit

Common questions

The questions that come up most often.

Which practice management software has the best Google Ads tracking?

Cliniko via its hosted booking page is the cleanest, because the confirmation page URL marks a completed booking. Nookal's hosted portal is just as clean, pushing a purchase event to the dataLayer. Splose is tracked off a booking confirmed signal on its single page flow. Zanda is fully trackable through a native GA4 event you connect and import. Halaxy is the hardest, trackable only with a custom trigger built by a developer. None connect natively to Google Ads, so Google Tag Manager, usually through GA4, is the connector.

Can Zanda track a completed Google Ads booking?

Yes. Anyone who told you otherwise was wrong. Zanda, formerly Power Diary, fires a native booking completed event to a GA4 property you connect by entering a 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. It's not the most direct setup, there's no container you inject and no confirmation URL, but the completed booking is fully and natively trackable.

Do I have to switch software to track my Google Ads properly?

Almost never. Every major system, Cliniko, Nookal, Splose, Zanda and even Halaxy, has a documented path to track a completed booking. The work is wiring it up to the real completion signal your software exposes, not changing systems. The most common failure isn't the brand, it's tracking left on defaults that counts page loads as bookings.

Should I embed the booking widget or link out to the portal?

It depends on the system, there's no universal rule. Embedding works for Cliniko and Splose, because the completion signal is readable on the page. For Nookal the hosted portal is the clean path and the iframe is unreliable, because third party cookie and storage restrictions break embedded tracking. For Halaxy and Zanda it doesn't matter, the booking runs on the vendor's own page either way, so only the tag or Measurement ID you set inside the vendor counts.

Why is my conversion rate over 100%?

A conversion rate above 100% is mathematically impossible for real bookings. It means non bookings are being counted as conversions, things like contact page loads, book now page loads, or returning patients hitting your ad twice. It's a sign your tracking was pointed at a page view instead of the real completion signal, not that your account is performing brilliantly.

How do you track phone bookings if the software can't?

Phone bookings never complete inside a tracking pixel, so I use a proxy: counting calls longer than 90 seconds. Short calls are rarely bookings, longer ones often are. The owner can apply a sensible assumption, like half of those calls booked, so even offline demand carries an honest estimate.

Want this for your clinic?

We'll show you what good looks like for your account.

Send us your Google Ads account access. We'll send back a written audit covering wasted spend, missed opportunities, and the fixes we'd make first.

More insights

Keep reading.