FFP Guides

Online bookings

How to track Cliniko online bookings in GA4 with Google Tag Manager

Paste your GTM container ID into Cliniko's Settings > Online bookings, the only field Cliniko gives you, covering GA4, Google Ads, Meta Pixel, AdRoll and Bing UET. A hosted booking page needs cross domain parameters on the GA4 tag. An embedded page needs Cliniko's postMessage workaround instead. Either way, mark the GA4 event as a key event before importing it into Google Ads.

Last checked 25 Sep 2026 against the sources listed at the end of this page.

Method
One GTM container ID pasted into Cliniko's Online bookings settings, with the tag setup in GTM itself differing for a hosted booking page versus an embedded one
On mobile
None of this setup is phone or desktop specific, GTM and GA4 fire the same way on both. What differs by device is the booking flow itself, an iframe embed or a hosted page, which is covered in the WordPress, Wix, Squarespace and Webflow guides for this cluster. Test the finished tag setup on a real phone booking regardless, since a tag that fires correctly in desktop preview can still be blocked by a mobile browser's own tracking protection.
Can you track bookings?
Partly. A hosted Cliniko booking page can keep the referral source with cross domain settings on the GA4 tag itself. An embedded page cannot, since an iframe blocks that entirely, so it needs Cliniko's postMessage workaround instead. Either route, Cliniko's booking pages push four dataLayer variables once a booking completes, cliniko.appointmentTypeId, cliniko.businessId, cliniko.bookingPrice and cliniko.bookingCurrency, which most Cliniko tracking guides do not mention and which let you build richer GA4 events than a plain page view.

Add Cliniko bookings to Any website (via Google Tag Manager)

  1. In Cliniko, go to Settings > Online bookings and switch on the businesses, practitioners and appointment types you want to take bookings for.
  2. Create a Google Tag Manager web container for your website if you do not already have one, and a GA4 property with a Data Stream for that site.
  3. Paste the GTM container ID into Cliniko under Settings > Online bookings and save. This one field covers the whole Cliniko account, Cliniko lists Google Analytics 4, Google Ads, Meta Pixel, AdRoll Smart Pixel and Bing Ads UET as the tag types it will run there.
  4. Decide whether patients book on a hosted Cliniko page or an embedded one before you build any tags, the two need different GTM setups, covered under Track the bookings below.

Track the bookings

  1. Hosted booking page: in GTM, add a new tag, choose Google Tag, enter your GA4 Measurement ID, and under Configuration Settings add cookie_flags set to samesite=none;secure and allowLinker set to true, alongside send_page_view set to true. These carry the visitor's Client ID across the jump from your domain to Cliniko's, which is what keeps the original source. Trigger it on All Pages.
  2. Embedded booking page: cross domain tag settings do nothing inside an iframe, so add Cliniko's postMessage listener instead, the script that catches the message cliniko-bookings-page:confirmed and pushes a clinikoBookingCompleted event to the dataLayer, placed on the page holding the embed.
  3. Add a GA4 Event tag, name the event something like booking_confirmed, and set the trigger to a Page View where Page Path contains bookings/confirmation for a hosted page, or the Custom Event clinikoBookingCompleted for an embedded one. Use only one of the two per site.
  4. For the four booking data layer variables, create a User Defined Variable in GTM of type Data Layer Variable for each one you want, named exactly cliniko.appointmentTypeId, cliniko.businessId, cliniko.bookingPrice or cliniko.bookingCurrency. Find the numeric appointment type or business ID in Cliniko by opening that item's settings and reading the ID from the page URL.
  5. Add the variables you need as event parameters on the GA4 Event tag, for example bookingPrice and bookingCurrency as value and currency, so GA4 can report revenue per booking rather than just a count, or businessId to split bookings by location without a second container.
  6. In GA4, go to Admin > Events and mark your event as a key event.
  7. In Google Ads, go to Goals, create a conversion action, choose Import, then Google Analytics 4 properties, and select the key event. You need at least Marketer access in Google Ads to do this.
  8. If tags are not firing, submit any unpublished GTM Workspace Changes first, check the container ID in Cliniko matches the one in GTM exactly, test in Chrome rather than a browser that blocks trackers by default such as Brave, and confirm the visitor accepted any cookie consent prompt, since Cliniko's booking pages show their own.

One container ID, five supported tag types

Cliniko does not give you a field for GA4, a field for Google Ads and a field for a pixel. There is one Google Tag Manager container ID field, under Settings > Online bookings, and everything else happens inside that container. Cliniko names five tag platforms it supports there: Google Analytics 4, Google Ads, Meta Pixel, AdRoll Smart Pixel and Bing Ads UET. What it will not run, on the booking pages themselves, is the Custom HTML tag type, which Google Tag Manager uses for a lot of third party pixels, so anything that needs Custom HTML has to be rebuilt as one of the supported tag types instead, a Custom Image Tag standing in for a pixel being the usual pattern.

Hosted keeps the source, embedded needs a workaround, and the difference is cross domain tracking

A hosted Cliniko booking page is still your own tracking domain as far as Google is concerned, once the container is connected, so a Google tag with cookie_flags set to samesite=none;secure and allowLinker set to true carries the visitor's Client ID from your site across to Cliniko's, which is what lets GA4 keep the ad or search source through to the booking. An embedded page cannot use this at all, the booking runs inside an iframe on Cliniko's own domain, and cross domain settings do not reach into an iframe, which is why Cliniko's own embedded tracking guide reaches for a completely different tool, the postMessage listener that catches a booking confirmation from inside the iframe and reports it back to the parent page's dataLayer.

The dataLayer carries more than a booking count

Once a booking completes, Cliniko pushes four named values to the dataLayer: cliniko.appointmentTypeId, cliniko.businessId, cliniko.bookingPrice and cliniko.bookingCurrency. Most setups only ever use the page path or the confirmation event to count a booking as one conversion, and never touch these. Pulled in as GTM Data Layer Variables and attached to the GA4 event as parameters, bookingPrice and bookingCurrency turn a plain count into a revenue figure GA4 and Google Ads can report against ad spend, and businessId or appointmentTypeId let a clinic with several locations or several treatment types split its numbers without running a second GTM container for each one.

Sources

  1. The GTM container ID is entered in Cliniko under Settings > Online bookings. Supported tags include Google Analytics 4, Google Ads, Meta Pixel, AdRoll and Bing Ads UET. Cliniko Help, checked 25 Sep 2026.
  2. For the hosted Cliniko booking page, GA4 cross domain tracking is set on the Google Tag with cookie_flags as samesite=none;secure and allowLinker as true, alongside send_page_view as true, triggered on all page views. Cliniko Help, checked 25 Sep 2026.
  3. Cliniko's GA4 conversion setup adds a GA4 Event tag in Google Tag Manager, triggered on a Page View where Page Path contains bookings/confirmation. Cliniko Help, checked 25 Sep 2026.
  4. Cliniko's booking pages push cliniko.appointmentTypeId, cliniko.businessId, cliniko.bookingPrice and cliniko.bookingCurrency to the dataLayer on booking completion. These can be read in Google Tag Manager as Data Layer Variables, and the appointment type or business ID can be found in the URL of that item's settings page in Cliniko. Cliniko Help, checked 25 Sep 2026.
  5. Cliniko's workaround script listens on the parent page for a message containing cliniko-bookings-page:confirmed and pushes a clinikoBookingCompleted event to the dataLayer. Cliniko says it can be hit and miss and that it cannot offer troubleshooting support for it. Cliniko Help, checked 25 Sep 2026.
  6. Common reasons Cliniko's GTM tags do not fire include unpublished Workspace Changes in GTM, a mismatched container ID between Cliniko and GTM, a cookie consent prompt the visitor has not accepted, and browsers such as Brave that block tracking by default, with Chrome recommended for testing. Cliniko Help, checked 25 Sep 2026.
  7. A GA4 event must be marked as a key event before it can be imported into Google Ads as a conversion, and importing requires at least Marketer access. Google Ads Help, checked 25 Sep 2026.