Scalepact logoScalepact logo
Paid acquisition9 min readMay 20, 2026

Server-Side Conversion Tracking for FareHarbor, Bokun & Rezdy

By Hamza LiaqatScalepact · Direct Booking OS

You are probably making ad decisions on numbers that are wrong. Not slightly wrong, structurally wrong. If your tours book through FareHarbor, Bokun, or Rezdy, your conversion tracking almost certainly misses real bookings, counts clicks that never became bookings, or both. And Google and Meta are spending your budget against that bad data. Here is why, and what server-side tracking actually fixes.

Browser-side tracking quietly broke

The classic setup, a pixel on the page and a cookie in the browser, assumed two things: cookies last, and scripts always run. Neither is true anymore. Safari caps third-party cookies to a few days, Firefox blocks trackers by default, roughly a third of users run an ad blocker, iOS asks people to opt out, and every cookie-consent banner trims a little more. The result is consistent: client-side tags under-report conversions by 20–40%. You are not seeing a chunk of your bookings, and the chunk you lose is not random, it skews toward exactly the privacy-minded, higher-intent travelers you most want to find more of.

The booking-widget problem nobody warns you about

Here is the part specific to tour operators. FareHarbor, Bokun, and Rezdy do not complete the booking on your website. They embed the checkout in an iframe or hand off to a hosted page on their own domain. The confirmation, the exact moment a booking becomes real, loads on fareharbor.com or a Bokun or Rezdy domain. Your GA4 tag and your Meta pixel live on your site. They never see that confirmation.

So most operators “solve” it by counting the Book Now click as the conversion. That is not a booking. It is intent. You have just told Google to optimize for people who click Book Now and then abandon, and smart bidding obediently goes and buys you more abandoners. The number in your dashboard goes up while real revenue does not. That is the worst possible failure mode, because it looks like success.

What server-side tracking actually means

Move the source of truth out of the browser and into the booking system. When a booking is confirmed and paid, the booking system fires a webhook (or you read it from the API). That confirmed-booking event hits a server endpoint, usually a server-side GTM container, which forwards it to Google (Enhanced Conversions or the Google Ads API) and to Meta (the Conversions API). The event carries the real order ID, the real tour value, and the customer’s hashed email and phone. You attach a shared event_id so any client-side event is de-duplicated and nothing is counted twice.

In plain terms: the ad platforms learn about a booking when it truly happens, with the real dollar amount, from a source no ad blocker, cookie limit, or browser setting can strip away.

What you are actually losing

The damage is not just a smaller number in a dashboard. It is wrong decisions made with confidence. Picture an account that reports a 2.0× return on ad spend. The owner trims the campaigns that look weakest, and the agency reports a tidy, mediocre quarter. But a third of the bookings were never attributed, because they completed in the booking widget where the pixel could not see them. The true return was closer to 3.2×, and the “weakest” campaign that got cut was actually carrying the account. You did not just under-count. You optimized toward the wrong answer.

Now run the opposite failure. An operator who counts the Book Now click as a conversion sees a huge conversion rate and lets smart bidding chase it. The algorithm dutifully finds more people who click and bounce, spend climbs, and bookings do not. Both accounts feel data-driven. Both are driving on a cracked windshield. Server-side tracking is what clears the glass.

“But I already have GA4 installed”

Google Analytics is not conversion tracking, and conflating the two is the most common reason an account looks fine and performs badly. GA4 is a measurement tool; by itself it does not tell Google Ads or Meta which click produced a booking. Those platforms need their own signals, Google Ads conversions (ideally via Enhanced Conversions) and Meta’s Conversions API. You can have pristine GA4 dashboards and still be feeding the ad algorithms garbage, because they are different pipes for different jobs.

Enhanced Conversions and CAPI, in plain terms

Both Google and Meta now accept conversions sent server-to-server with hashed customer details, an email or phone scrambled so it cannot be read but can still be matched. Google calls its version Enhanced Conversions; Meta calls its pipe the Conversions API. The unlock for a tour operator is that a direct booking hands you exactly that detail: a real email and phone you are allowed to use. Hash it, send it server-side, and your match rates and attribution jump, because the platform can connect the booking to the click even when cookies and pixels failed. It is the same owned-customer advantage that powers your retention layer, pointed at measurement instead of messaging.

The flow, end to end

Here is the whole path a booking should travel. A traveler completes and pays in FareHarbor, Bokun, or Rezdy. The booking system fires a webhook to a server endpoint you control, usually a server-side GTM container on a subdomain like data.yourtour.com. That endpoint forwards the event to Google and to Meta with the order ID, the booking value, the currency, and the hashed email and phone. A lightweight client-side event fires too, tagged with the same event ID, so the platforms recognize it as the same booking and do not double-count. The result is one conversion, with the real dollar value, attributed to the right click, from a source no browser setting can strip. Once it is wired, it runs without anyone touching it.

FareHarbor, Bokun, Rezdy: one principle, three plumbing jobs

The principle is identical for all three: stop trusting the embedded widget’s client-side pixel, and treat the confirmed-booking event as the truth. The wiring differs.

Booking systemWhere the booking completesUse as your source of truthCommon gotcha
FareHarborLightbox iframe on fareharbor.comConfirmed-booking webhook / API, plus a parent-page callback for the client eventThe confirmation is cross-domain, so a site-only pixel never fires
BokunHosted or embedded checkout (Bokun is a Viator / TripAdvisor company)Booking webhook on paid status, sent server-sideGA and pixel set inside Bokun still fire client-side and get blocked
RezdyBooking widget iframe or hosted pageOrder webhook plus the API, keyed on the confirmed orderA “Book” click is not a paid order; dedupe on the order ID

Why this is the highest-leverage fix in your ad account

Three reasons it pays for itself fast.

  • Match quality. On a direct booking you own the customer’s email and phone. Server-side lets you pass them, hashed, into Google Enhanced Conversions and Meta advanced matching, so attribution stops guessing. That data is the upside of building the slice you actually own.
  • Value-based bidding. Send the real tour price, not a flat “1 conversion.” A $300 private charter and a $40 group ticket stop counting the same, and the platforms start optimizing for revenue instead of raw volume.
  • Clean signal for the 14-day window. Tour buying takes about two weeks, not one click. Confirmed-booking data fed back server-side lets smart bidding optimize for actual bookers across that window, instead of truncating it on last-click noise.

This is not theory. It is how the 2.8× blended ROAS at PrimeOne was measured: server-side tracked, fully attributed to confirmed direct bookings, not button clicks.

The setup, in order

  1. Pick the source of truth: the booking system’s confirmed-and-paid event, never a button click.
  2. Stand up a server-side GTM container (or your own endpoint) on a subdomain you control.
  3. Wire the FareHarbor, Bokun, or Rezdy webhook or API into it.
  4. Forward each booking to Google and Meta with order ID, value, currency, and hashed email and phone.
  5. Send a matching client event with a shared event_id so nothing double-counts.
  6. Validate with one real test booking: confirm exactly one conversion, with the right value, lands in both platforms.

How to tell your tracking is lying to you right now

You do not need to guess. Pull last month’s confirmed, paid bookings straight from FareHarbor, Bokun, or Rezdy, the real number, the one you actually got paid on. Then pull the conversions Google Ads and Meta reported for the same period and the same campaigns. If the platform numbers are within a small margin of the booking-system truth, your tracking is healthy. If they are 20%, 30%, or more adrift, or wildly higher because you are counting clicks, you have just found the leak. Most operators have never run this one comparison, and it is the fastest way to know whether you are flying blind.

Do the same check by value, not just count. If your booking system says you did $40,000 in ad-driven bookings and the platforms claim $58,000 of conversion value, someone is double-counting, usually a missing event ID. Numbers that are too good are as dangerous as numbers that are too low, because both push the algorithm and your budget the wrong way.

Run this reconciliation monthly and it becomes an early-warning system. A sudden divergence usually means something broke, a pixel removed in a site update, a webhook that silently failed, a consent banner that started blocking a tag. Catching that in week one instead of quarter three is the difference between a small fix and a season of misallocated spend.

When you need this, and when you can wait

If you spend nothing on ads and run purely on organic and word of mouth, this is lower priority, get your visibility and retention layers going first. The moment you put real money into Google or Meta, though, server-side tracking stops being optional, because every dollar is now being allocated by an algorithm that can only be as smart as the data you feed it. Spend plus bad data is the most expensive combination in the whole account.

Common mistakes that quietly break it

  • Counting the Book Now click instead of the confirmed, paid booking. You end up optimizing for people who abandon.
  • No shared event ID between the client and server events, so the same booking is counted twice and the numbers look better than reality.
  • No value passed, so a $40 ticket and a $400 charter count the same and the platform optimizes for volume instead of revenue.
  • Tracking on the wrong domain, expecting a pixel on your site to fire on a confirmation page that loads on the booking system’s domain.

Quick answers

Do I need a developer for this? For a server-side GTM container and a booking-system webhook, usually yes, or an agency that does it. It is a setup task, not an ongoing one; once wired, it runs.

Does this completely fix the iOS and ad-blocker problem? Not completely, nothing does. But it recovers most of what browser-side tracking loses, because the event originates from your server, not the user’s browser.

My checkout is on FareHarbor’s domain, can I still track it? Yes, that is exactly what the webhook is for. The booking system tells your server a booking was confirmed, regardless of which domain the customer was on.

Is this worth it if I only spend a little on ads? If you spend anything on ads, the platforms are making decisions with your money. Clean signal is worth more, not less, when the budget is tight, because every dollar has to count.

What good looks like

Conversions reported in Google and Meta match the confirmed bookings in your booking system, within a small margin. Reported ROAS matches the revenue you can actually see in FareHarbor, Bokun, or Rezdy. Smart bidding has clean signal, so it stops scaling campaigns that only produce clicks and stops pausing the ones that quietly produce bookings.

We don’t touch your OTAs, and we don’t touch your booking system’s checkout. We wire the truth, confirmed bookings, into the ad platforms so every dollar in the acquisition layer is attributable. Without it, you are optimizing on fiction.

11Book free audit · 30 min · No pitch

Let's find out exactly how much money your broken booking funnel is costing you.

Drop your details. We look under the hood of your booking system, OTA mix, ad accounts, and tracking, and send a written audit doc within 48 hours showing exactly where you're losing money. 100% free. Zero obligation. Tour operators only.

About 1 in 5 audits ends with us telling the operator “you don't need us yet”, and we send the audit doc anyway. That's by design.

Hamza LiaqatFounder · scalepact.co

Free audit, no pitch.

Three fields. Calendly link in your inbox same day.

Tour operators only. No pitch, no aggressive sales calls, just the audit doc. Reply within one business day.