In this guide.
- 01Get the plumbing in
- 02Define the conversion
- 03Consent
- 04Connecting it to the ad platforms
- 05When it goes sideways
What you will have at the end.
A tag manager live, one conversion per real booking, consent respected, and a written verification you have run yourself and can rerun in ten minutes.
Before you start
What you need open
Every decision in this whole catalogue depends on one question: did that booking come from anywhere we can name. If the answer is no, you are not optimizing, you are redecorating.
Get the plumbing in
Install one tag manager container, on every page
A tag manager is a single piece of code on your site that lets you add and change measurement without touching the site again. Install it once and every later change is a five minute job instead of a ticket with your provider.
One container. Two containers on one site is a real and common mess, usually the fossil of a previous agency.
The snippet goes on every page, including the thank you page and the booking confirmation.If your booking tool is on another web address, it needs the same container or its own, and you need to know which.Before installing, search your site for existing measurement code and write down what you find. Removing it later is easier than discovering it during a discrepancy.In practice
A tag manager does not measure anything by itself. Installing it and stopping is the most common half-finished state we see. It is a delivery mechanism, not a measurement.
Create the analytics property yourself
Create it under an account you own, not under a provider's. Clinics that inherit a property lose it when the relationship ends, along with every year of history.
Set the time zone and the currency on day one. Both are painful to change later and both silently corrupt comparisons if they are wrong.
Define the conversion
Decide what a conversion actually is
Write it in one sentence before touching any tool. For most clinics it is one of two things: an appointment was booked, or an enquiry was submitted. Those are different and you should not merge them.
Things that are not conversions and are constantly configured as though they were: a page view of the contact page, a click on the booking button, time on site, a scroll depth.
A click on a booking button is an intention. Counting it as a booking inflates everything downstream.A page view of the confirmation page is a good proxy, provided the page cannot be reloaded or reached directly.If you take bookings by phone, a tap on the phone number is the closest measurable signal. Count it as its own thing, named as its own thing, not as a booking.Make it count once
One booking equals one conversion. This sounds trivial and it is the failure we find most often when a clinic's reported numbers do not match their schedule.
If the confirmation page can be refreshed, the event fires again. Set the counting to once per session at minimum.If you send the same event from the browser and from your server, they must carry a shared identifier so the platform can deduplicate.If two tools both fire on the same page, one of them is a leftover. Find it.Exclude your own clinic's network address, and your provider's, from the analytics property. Your team reloading the confirmation page is real and it is measurable.In practice
Test by booking one appointment and counting. If you see two, stop and fix it before you build anything on top.
Keep the event payload empty of people
The event carries the fact that a booking happened and, at most, which service category it belonged to at a level too coarse to identify anyone. Nothing else.
No email, hashed or otherwise. Hashing is not anonymization when the set of possible inputs is small.No name, no phone, no date of birth, no postal code at full precision.No symptom, no diagnosis, no treatment name attached to an individual event.No value amount if the amount would reveal which treatment was booked.Check your URLs. A confirmation URL containing a name or an appointment reference sends that to analytics automatically, because the page path is part of every page view.
Consent
Make the banner actually control the tags
A consent banner that appears but does not gate anything is worse than no banner, because it documents that you knew and did it anyway.
The tags that set identifiers must not fire before consent. Your tag manager can hold them until the signal arrives.
Verify by loading the site in a fresh browser, declining, and checking that nothing fired.Then accept, and check that everything fired once.Both halves matter. Most clinics test only the accept path.Know what an iframe does to consent
If your booking flow lives inside an embedded frame from another provider, your consent decision does not necessarily reach it, and the identifiers your ad platforms rely on often do not cross into it either.
This produces a specific and confusing symptom: the tags are published, they look correct, and they report nothing, because consent was never granted inside the frame and the platform silently discards the event.
Ask your booking provider whether they receive your consent signal.Ask whether the advertising click identifier is preserved when the frame loads.If both answers are no, either move the booking onto your own domain or accept that this path is unmeasurable and say so out loud rather than reporting a number you know is wrong.
Connecting it to the ad platforms
Send the conversion back, once, to each platform
Each advertising platform needs to know the booking happened so it can learn. Send it once per platform, from one place.
Fire from the tag manager rather than from code pasted into the page, so you can see and change it.One tag per platform. Two tags for the same platform is the standard cause of doubled numbers.Never send the conversion from both a platform plugin and the tag manager. Pick one.Reconcile monthly against the schedule
Once a month, put three numbers side by side: appointments your software recorded as new patients, conversions your analytics recorded, and conversions each ad platform claims.
They will differ. The point is that the differences are stable and you can explain each one.
Ad platform higher than analytics: expected, because platforms credit views and longer windows.Analytics higher than the schedule: something is counting more than once, or counting your own team.Schedule higher than everything: people are calling instead of booking online, which is fine but means your online numbers are a floor, not a total.In practice
Write the explanation down next to the numbers. Next month you will not remember, and the month after that someone will present the gap as a new problem.
When it goes sideways
| Symptom | Probable cause | Fix |
|---|---|---|
| Conversions are exactly double | Two tags for the same platform, or a refreshable confirmation page | Remove the duplicate tag and set counting to once per session. Retest with one booking. |
| Tags are published and report nothing | Consent never granted on the path that matters, often inside an embedded booking frame | Test the decline and accept paths separately, and ask the booking provider whether your consent signal reaches them. |
| Traffic shows as coming from your payment provider | A hop to an external payment page starting a new session on return | Add the payment domain to the referral exclusion list in the analytics property. |
| Personal information is appearing in your reports | The confirmation URL carries it in the query string | Strip the query string before recording the page view, and ask the booking provider to stop putting it there. |
| Analytics shows far fewer bookings than the schedule | Phone bookings, which are invisible online, or an unmeasurable booking frame | Measure phone taps as a separate named event and state clearly that the online number is a floor. |
| Numbers changed sharply with no campaign change | Somebody edited a tag, or the consent banner was updated, or a provider republished the site | Check the tag manager version history first. It is dated and it names who changed what. |
| Two analytics properties both have data | A previous provider's setup is still running | Decide which one is canonical, and remove rather than ignore the other. Ignored properties get quoted back to you a year later. |
Before you trust a single number
Questions we get.
- Can we send hashed emails for better ad matching?
- In a clinic, treat that as a no. The fact that a specific person booked at a specific clinic is itself health information, and hashing does not change who the data is about.
- Do we need a consent banner at all?
- Depends on your jurisdiction, and the answer is moving in one direction everywhere. Build as if you do. A banner that genuinely gates tags is cheap now and expensive to retrofit.
- Our booking tool cannot be measured. What do we do?
- Measure the step before it, name the event clearly as a start rather than a booking, and reconcile against the schedule monthly. An honest proxy beats a dishonest total.
- How long until the data is usable?
- A month of clean data beats a year of dirty data. Start the clock from the day verification passed, not from the day you installed the container.
- Should we track phone calls?
- Track taps on the phone number, which is free. Call tracking numbers add attribution and also add a name and address mismatch risk with your listing, so weigh that before installing one.
This guide is general information for clinic owners. It is not clinical advice, and it does not replace the guidance of your professional body or your own advisers.


