Advertising

Which Ads Actually Book Customers?

A boutique that books appointments online came to us with a question most small businesses running ads eventually ask: which of our ads actually bring in customers? They had run Facebook and Instagram campaigns, the ad platform showed plenty of clicks and views, and their calendar had appointments on it. What nobody could do was draw a line from one to the other.

The ad platform, the website and the booking system each held part of the answer, and none of them were connected. Linking them took a handful of fixes that any business can make, and in the end a dashboard that answers the question every week without anyone having to dig for it.

The first thing we look at on any project like this is whether the website can see a booking happen at all. On this site it couldn’t. The appointment calendar came from the shop’s booking software and sat inside an embedded frame on the page, which is a common and perfectly reasonable way to add online booking. Browsers keep a page from reading what happens inside a frame from another company’s site, though, so the analytics on the website could see someone open the booking page and nothing after that. The ads were being judged on page visits because that was the last thing anyone could measure.

The fix was to listen for the right signal. Many booking widgets announce their progress to the page they sit on, with short messages like “appointment type chosen,” “time picked” and “booking confirmed.” We set up the site to catch those messages and record each step, so a booking now counts as a booking only when the booking system itself says the appointment exists. If you use a booking tool, ask its support team whether the embed sends events or offers a confirmation page you can track. The answer determines how much of the rest is possible.

Next came the tracking codes themselves. The site’s builder had a box for the Facebook pixel, and at some point the pixel had also been pasted into the page by hand, so every visit was being counted twice. The site’s Google Analytics was reporting into an account nobody at the business could log into anymore. That kind of thing happens easily when a site changes hands a few times, and since nothing looks broken from the outside, it tends to go unnoticed. We moved everything into a single Google Tag Manager container, so each tool loads exactly once and there’s one place to check when something changes. If you’ve ever pasted a tracking code into your site, it’s worth looking at the page source for a second copy, or running Meta’s free Pixel Helper browser extension, which flags duplicates.

The cookie banner needed a decision too. It was set up so that no tracking ran until a visitor clicked Accept, and most visitors never click anything. That’s the right setup for some businesses and more than others need, depending on where you operate and who your customers are. After checking what applied to a business of this size and location, the owners chose a notice banner that tells visitors about tracking and links to the privacy policy. We set it to honor the Global Privacy Control signal that some browsers send, so anyone who has asked not to be tracked still isn’t. This is a call for each business to make with good information, and we wrote up the options for the owners before anything changed.

With bookings visible and the tags cleaned up, the remaining question was where the customers came from. The shop serves several towns, so the real question was which towns the ads were working in. Meta’s ad reports break results down by state and region, but not by city. We got around that with tagged links. Every ad sends people to the booking page with a few labels added to the end of the address, like utm_source=meta&utm_medium=paid&utm_campaign=johnson-city. Google Analytics reads those labels, so every visit and every booking from that ad is filed under that city. Of everything in this article, this is the most useful single change. Most ad platforms have a “URL parameters” field at the ad level where these go, and Google’s free Campaign URL Builder will put them together for you.

The last piece was on the booking side. The shop’s booking form already asked “How did you hear about us?” and which city the customer lives in. Both fields were optional, which is the right call, because every required field costs some bookings. They’re now used consistently, and that gives the business a second, independent record of where customers came from that doesn’t depend on any tracking code.

Before trusting any of it, we tested it the plain way. We made a real booking on the live site, watched it arrive in the booking system, in Google Analytics and in Meta’s test events, and then the shop deleted it. We also checked the shape of the numbers. Over the first two weeks, a couple hundred people clicked a booking button. About 60 percent of them went on to open the booking form, a little over half chose an appointment type, under a quarter picked a time, and roughly one in seven booked. Each step is smaller than the one before it, which is what a working funnel looks like. If any step had been larger than the one before it, we’d have known something was counting twice.

One more lesson came out of this, and it changes how the ads are set up. Booked appointments are a small number compared with clicks, and ad platforms learn best when they have dozens of results a week to work from. Asking Facebook to find people who book, at a modest budget, leaves it guessing. It does much better optimizing for an earlier step that happens more often, such as someone reaching the booking page. The booking still gets measured and reported, while the ad platform is pointed at the earlier step it can learn from. For the same reason, we look at results by week or by month. A single day of bookings is mostly noise.

All of this feeds the part the owners actually use, which is a dashboard. Every morning it pulls the previous days’ ad spend from Meta and visits and bookings from Google Analytics, and it lays them out by city and by week or month: what was spent, how many people came through, how many booked, and what each booking cost. The shop’s own appointment numbers go in alongside, typed in or uploaded as a spreadsheet from the booking software. Those are treated as the real count, and cost per booking is always calculated from them, never from the ad platform’s own conversion numbers, which appear on the screen for reference only.

The dashboard also checks itself. It compares the bookings the website recorded with the bookings the shop actually had, and shows that as a coverage percentage. Some gap is normal, since ad blockers and privacy settings hide a share of visitors and some appointments get booked over the phone. A steady number means the tracking is healthy. A sudden drop means a tag broke, usually after a website update, and it shows up on the screen before anyone has spent a month wondering why the ads stopped working.

What the owners have now is a weekly answer to the question they started with. They can see what a booked appointment costs in each town, and they can try a small, fixed budget in a few markets for a month to find out where more money is worth spending, without guessing. It runs on its own each morning, and the only regular task on their side is adding the week’s appointments.

If you’re spending money on ads and can’t say which ones bring in customers, the tagged links and a single booking event are the place to start. They’re useful on their own, and they’re what everything else here is built on. If you’d rather hand it off, this is work we do at Kirby Web Works, from cleaning up the tracking to building a dashboard like this one for your business, and we’re happy to take a look at what you have now.