Acuity Scheduling Conversion Tracking Perfection
⚠️Warning. This is an insanely advanced technical post. I’ve spent the last 3-4 years focusing on a razor-thin niche — tracking Acuity Scheduling conversions. Measuring and improving ad performance for businesses that use Acuity. I’ve tracked 150-200 Acuity accounts, and lost count, but improved the setup with every round.
A couple of years ago I used to think I had an amazing setup when I added enhanced conversion tracking with the Acuity email. Compared to those days, this setup is from a different planet 🪐
What’s this about?
I will laugh at this though in a year or two — but today I believe I’ve reached Acuity tracking perfection for Google Ads.
Let me explain.
(Ok, there are still things to improve, like finding a scaleable way to do 2-year persistent server-sent cookies without cname-cloaking to counteract Apple Intelligent Tracking Prevention, possibly combining with server-side fingerprinting)
Acuity Conversion Tracking for Google Ads - Levels
1) Basic cookie-based tracking
The classic conversion tracking works like this.
User Googles a thing, let’s say “Puppy Yoga London”
They see our ad
Ad URL contains Google Click ID (gclid), like example.com?gclid=12345
Conversion Linker gtag turns gclid into a cookie. The browser will now remember gclid=12345
When the user converts, we send a message through the Acuity Scheduling iFrame widget, use JavaScript messaging and send the conversion to Google Ads.
Downsides:
Apple Intelligent Tracking Prevention will kill the cookie.
User may find your ad on their phone but decide to book on their computer
Browsers like Brave don’t even allow gclid in the URL.
Other cookie issues
2) Enhanced conversion tracking
Read explanation here
Here, we enhance the cookie-based tracking by telling Google Ads a hashed version of email, phone number, name and possibly address from the Acuity booking.
If Google has seen mike@gmail.com logged-in, Google knows Mike clicked on our ad and we then tell Google: “Hey, mike@gmail.com just converted for $100. Has he clicked on any of our ads recently?”
Google knows he has. We track a conversion regardless of cookies, devices, Apple Intelligent Tracking Prevention etc.
3) Custom Acuity tracking app, based on local storage and hidden fields
This version stores the glid and other info like user agent, in browser’s local storage (instead of cookies) and remembers them 7x longer. We send the info through Acuity vai hidden fields and use Google Ads Conversions API to track conversions.
Benefits are
We can do offline conversion tracking
Full control of conversions, re-adjusting, knowing if they were sent
In my testing often more reliable than enhanced conversion tracking
If you use Acuity quantity selector, this is the only way to track all conversions, as all previous method would only track one “seat” per booking even if there are 10
The only problem is that we cannot do enhanced conversion tracking via Google Ads API ☹️
Combining Enhanced conversions with a custom Acuity tracking app!
So far I’ve had to make an annoying choice. Either use the local storage -app method with it’s significant pros but lose cross-device enhanced conversion tracking.
Or visa versa.
Today I ran a test. What if I do both. Use the Google Ads conversions API and local storage as the main “base” for our Acuity Scheduling conversions.
Then, also do the hybrid approach, where I combine the Google Tag Manager iFrame JavaScript conversions tracking with the a Google Ads API “conversion enhancement” with the same Acuity appointment ID.
But! Then add a new conversion action in Google Ads, where I add a filter in Google Tag Manager to only fire this Acuity conversion tag if we do not have a gclid. E.g. use a first-party cookie variable and check if it contains “.”, as the format of the Google Ads main gclid cookie (called _gc|_aw) is:
GCL
.
timestamp-UNIX time
.
gclid itself
For example:
GCL.1736745499.CjwKCAiA7Y28BhAnEiwAAdOJUJlvBoUoX2GvdpNHvfq8REoRKvQiPZajS6z5nUrMXkZZ3HBd-3OFZRoCzncQAvD_BwE
Does not contain “.” = no gclid available.
This should finally bridge the gap.
Scenarios
1) We have a gclid
If we have a gclid, then our custom tracking app should remember it in local storage for a week. We can do API tracking which is the best method if possible
2) We don’t have a gclid
We send a conversion and use API conversion enhancement to tell Google Ads the email, phone + more. Google can match logged-in users and track conversions
Now we can just set both conversions as Primary and account default and improve our Acuity Conversion Tracking accuracy.
Testing - does it really work
I came up with the idea a few days ago. Kept checking. It should work.
And finally today got the proof. That sweet number “1” of a fresh new conversion. Tracked with certainty using the Enhanced Conversion tracking instead of gclid or cookies, as we had a filter where this only runs if we don’t have a gclid.
After years or work, I’ve finally reached a level of tracking I’m quite happy with. As simple as the solution was (simple being a relative term here) I was really annoyed at having to leave the huge benefits of either of the methods unused and knowing that some % of those sweet Acuity conversions would be left untracked.
🕊️ I’m finally at peace.
Google Ads columns
For a long time, my focus was purely on sending the best data. Now, I’m also including other parts, like making it as easy as possible for my clients to actually see and use the data. For the “Acuity Perfection” setup, we’ll add a cherry on top 🍒 and make a custom column that combines conversion results of the API and Web-Hybrid conversions
Here’s how pretty it looks.
I also added micro conversion of the Acuity booking steps, as well as a custom Acuity ROAS (“return on ad spend” calculated by Acuity conversion value / Acuity ad costs) column. But those are child play compared to actually getting the hybrid-hybrid tracking data which was the real point of this post.
What about Meta conversions?
Meta has not had this issue, as Facebook conversion tracking works differently. It combines of Meta Pixel and Meta Conversions API (CAPI) where Meta wants us to use both methods for each conversion event.
So we don’t need to be as creative, we just send each Acuity booking using both methods, with Acuity ID as our “deduplication keys”, making sure to use the same event name of course (you shouldn’t use Pixel to send ‘Schedule’ and CAPI to send ‘Purchase’ of course)
…and Meta will take care of the rest
Will be looking for the perfect 10 but that’s probably out of reach for Acuity. Most visitors do not provide their date of birth, or ZIP code via their Acuity appointment and asking for too much would lower conversion rates. If we did e-commerce we’d have more detailed address info.
*Note, the low Click ID count of 6.45% is due to most Acuity bookings coming from Google – not due to a faulty tracking setup.
Interested?
Do you want the absolute-hands-down best Acuity Scheduling conversion tracking setup ever created on planet earth? Tailor-made, mostly handcrafted (with a bit of AI) in Helsinki, Finland.
A setup that will boost your digital marketing to the highest level theoretically possible, and gets small and medium businesses to a level of analytics where normally only huge corporations get?
Current Google Tag Manager
Just for fun, here’s the current GTM template I use as a starting point to track Acuity. Google Tag Manager is just one part of the Acuity tracking setup – most of the code is now on server side as well as custom script added to the website.
But the GTM is now starting to look like a pretty pro setup –version number 53. I’d have to go back and check the version 1 for a good cringe.