If your Facebook or Instagram ads show 0 bookings while your Boulevard calendar is full, the ads are probably working. The problem is that Meta can't see the booking happen.
The short answer: Boulevard's booking widget runs inside a separate window (an iframe) that belongs to Boulevard, not to your website. Your Facebook pixel lives on your website, so it never sees the booking. The fix is to report bookings to Meta from a server, using Boulevard's notifications and Meta's Conversions API.
We ran into exactly this with a US salon using Boulevard. They advertised on Meta, Google Ads, TikTok, Snapchat and Nextdoor, and every platform under-reported bookings. Here's what is going on, in plain language.
Why the Facebook pixel can't see Boulevard bookings
Think of your website as a shop, and the Boulevard widget as a booth from another company set up inside it. Your security camera (the pixel) films the shop floor. It sees people walk in and walk up to the booth. It can't see what they sign at the booth, because the booth has its own walls.
That booth is the iframe. When a client clicks Book Now, Boulevard opens its booking flow on its own domain, layered over your page. Everything that matters happens in there: choosing the service, the time, entering their details, confirming.
Three things make this worse:
- Boulevard doesn't pass the booking back to your page. Its widget only exposes basic loading functions. There is no "booking completed" signal your website can listen to.
- iPhones and browsers block tracking. iOS privacy features, Safari's tracking prevention and ad blockers stop many pixel events even on your own pages.
- Some "fixes" make it worse. We found a common setup that fired a fake "Add to cart" on every page load, because Boulevard quietly preloads its hidden widget when the page opens. That sends Meta false signals.
So Meta sees visitors and maybe some clicks on Book Now, then nothing. In Ads Manager, that looks like ads that bring traffic but no customers.
What happens when Meta can't see bookings
This is more than a reporting annoyance. It changes how your money is spent.
- You can't tell which ads work. Without bookings in Ads Manager, you're guessing which campaign, audience or creative fills your chairs.
- Meta optimizes for the wrong thing. The algorithm learns from the conversions it sees. If it sees none, it can only optimize for clicks or views, which bring cheaper but less valuable traffic.
- You might turn off a good campaign. A campaign that drives real bookings can look like a failure and get paused.
The fix: report bookings from a server
The reliable solution doesn't try to see inside the booth. It waits for Boulevard to say "a booking was made," then tells the ad platforms.
Here's the setup we built, without the technical details:
- Remember where the visitor came from. When someone lands on your site from an ad, a small script saves the ad's click ID (for example
fbclidfor Facebook,gclidfor Google,ttclidfor TikTok). - Boulevard sends a notification. Boulevard can notify a server whenever an appointment is created or completed. This is called a webhook.
- The server connects the booking to the ad. It looks up the booking and matches it to the visitor's click.
- The server tells each ad platform. It sends the booking to Meta's Conversions API, and to Google Ads, TikTok, Snapchat and Nextdoor through their equivalents.
- Bookings and revenue land in a dashboard. Every booking is logged with its source, so you see bookings and revenue by channel.
We send two different signals. When an appointment is booked, Meta receives a Schedule event: someone booked. When the appointment is completed and paid, Meta receives a Purchase event with the real amount. That second one is what makes ROAS (return on ad spend) real instead of a guess.
Be honest about one limit: matching
There's a catch most guides skip. Because the booking happens in Boulevard's iframe, the notification Boulevard sends doesn't say which visitor made it. The server has to work out which ad click the booking belongs to.
Our first version guessed by timing, and under real traffic it gave credit to the wrong campaigns. We wrote up the full story in our attribution bug case study. The short lesson: matching needs something that exists on both sides, such as the client's email or phone, or a booking flow you control. Ask whoever sets this up how they match bookings to clicks, and how they tested it.
What to ask your agency or developer
If someone is setting up Boulevard tracking for you, these questions separate a real setup from a pixel pasted in the wrong place:
- Are bookings sent to Meta from a server, using the Conversions API?
- Do browser and server events share an event ID, so bookings aren't counted twice?
- How is each booking matched to the ad click, and was it tested with several people booking at the same time?
- Do completed appointments send real revenue, or only a booking count?
- Is the same booking also reported to Google Ads, TikTok and the other platforms we run?
- Where can I see bookings and revenue by channel, outside the ad platforms?
Is it worth it for a single salon?
If you spend a few hundred dollars a month on ads, the platforms' own numbers plus a weekly check of your calendar may be enough. Once you spend more, or run several platforms, guessing gets expensive. The salon in this story was running five ad platforms at once, and without server-side tracking there was no way to know which one actually filled the chairs.
For the technical side of the problem, read why you can't track Boulevard widget bookings in the browser.
For the full build, step by step, read How to track Boulevard bookings in Meta, Google Ads & TikTok: the complete server-side guide.

