Skip to content
ABOVETHRESHOLD
← All insights

17 Aug 2026 · Measurement / Clinics

Why every clinic booking shows as 'direct' in GA4 — and how to fix it for Cliniko and Jane

Ask a clinic owner what a new patient costs them and you'll usually get a guess. Ask their Google Analytics and you'll get something worse: a confident wrong answer. Open GA4 in almost any UK clinic running Cliniko or Jane and the story is the same — a wall of bookings attributed to direct / (none), as if every patient typed the booking page URL from memory.

They didn't. Your analytics just lost the thread. Here's why it happens, what you can fix, and what you can't.

The mechanism: your booking system is another website

Cliniko and Jane don't run on your website. Your site lives at yourclinic.co.uk; the booking flow lives at yourclinic.cliniko.com or yourclinic.janeapp.co.uk. Whether you embed it in an iframe or link out to it, the moment a patient moves from your site to the booking flow, they cross a domain boundary.

That boundary is where attribution dies, for two compounding reasons:

  • Iframes are isolated. An embedded booking widget is a separate page in a box. Analytics running inside the iframe can't reliably see how the visitor arrived at the parent page — and browser privacy protections (Safari's ITP in particular) actively prevent the two contexts from sharing cookies. The booking gets recorded; the Google ad, the blog post or the Instagram bio link that produced it doesn't.
  • Cross-domain journeys reset the session. If you link out to the booking subdomain instead, GA4 treats the arrival as a brand-new session unless cross-domain measurement is configured — and because the referrer is your own site, the booking is filed under referral traffic from yourself, or direct. Either way, the campaign data is gone.

The result: your ads report says you spent £600 this month, your booking system says 42 new patients arrived, and nothing in between can honestly connect the two. Every "what's our cost per patient?" conversation is built on that gap.

Why this matters more than most SEO advice

Most clinic marketing decisions are budget decisions in disguise: keep the ads running or cut them, pay for SEO or don't, sponsor the local club or not. Every one of those decisions needs the same number — what a booked patient costs from each channel. If your bookings all read "direct", you can't calculate it, which means the decisions get made on vibes.

The industry data backs this up: surveys of UK private practice owners consistently find that only around a quarter can state their patient acquisition cost. It's not because clinic owners are careless. It's because the default tracking setup is structurally incapable of producing the number.

What's fixable

The good news: most of the value is recoverable without switching booking systems. In rough order of effort:

1. Track the handoff on your own domain

The click from your site into the booking flow happens on a page you fully control. Tag it. A GA4 event on every "Book now" click — with the page, the button and the campaign context attached — gives you a clean, attributable conversion proxy. It's not a completed booking, but the drop-off between handoff and completion is usually stable enough that the proxy is honest. This alone gets most clinics from "no idea" to "usable answer".

2. Use your booking system's native analytics support

Cliniko supports adding your GA4 tag to its booking pages, which lets you record the completed booking as an event. Jane's options are narrower, but the confirmation and completion URLs can still be captured with care. The key is doing this together with cross-domain configuration, not instead of it.

3. Configure cross-domain measurement

GA4 lets you declare your booking subdomain as part of the same measurement setup, so the session survives the crossing and the original source — the ad click, the search, the referral — stays attached to the booking. This is fiddly, browser privacy features still degrade it, and it needs testing rather than assuming. But configured properly, it's the difference between "42 direct bookings" and "18 from organic search, 12 from Google Ads, 7 from the physio who refers to you, 5 genuinely direct".

4. UTM discipline everywhere else

Booking links in Instagram bios, Google Business Profiles, email signatures and recall messages should each carry their own campaign tags. It costs nothing and it's the only way those channels ever show up as themselves.

What's not fixable

Honesty matters here, because plenty of agencies imply otherwise:

  • You will never get 100% attribution. Browser privacy protections, consent choices and cross-device journeys guarantee a residue of genuine unknowns. The goal is to shrink "direct" from 90% of bookings to a truthful minority — not to zero.
  • You can't fix what happens entirely inside the booking domain without the vendor's cooperation. If a patient bookmarks the booking page and returns next month, that journey belongs to the booking system's records, not your analytics.
  • Phone bookings need their own answer — call tracking or, more simply, a front-desk habit of asking and recording "how did you hear about us?" Low-tech beats no-tech.

The test that takes five minutes

Open GA4. Look at last month's booking-related conversions (if there are none configured, that's your answer already). Check the source/medium breakdown. If "direct / (none)" is more than about 40% of bookings, your measurement is below threshold — the effort is being spent, but the signal that would tell you whether it's working isn't coming back.

While you're at it, run your numbers through our free clinic baseline scorecard — two minutes, five inputs, and an honest readout of what a new client costs you and whether you can trust the answer.

This is exactly what the first hour of our baseline review looks at: what your tracking can currently see, what it's blind to, and what it would take to get you a real cost-per-patient number. It's £495, credited in full against your first month if we go on to work together — and if the only outcome is that you finally trust your own numbers, that's still a useful place to be.

Start with a baseline call →

Next step

Find out where your baseline is

A 30-minute call. We look at what your marketing — and the machinery behind it — is doing now, and tell you honestly whether we can move it. No deck, no pressure.