Most hotel websites hand guests over to a booking engine run by a separate company, usually on a separate domain. The guest searches on Google, clicks your ad, browses your rooms, presses “Book now” — and lands on a different website to choose dates and pay.

By default, analytics treats that as two different visits. The booking is recorded, if at all, as coming from your own website. The ad, the search and the Instagram post that actually brought the guest disappear from the report. You end up cutting the campaigns that work and keeping the ones that do not.

Symptoms of broken booking tracking

What you seeLikely cause
Most bookings come from “referral” or your own domainCross-domain tracking not set up
Bookings attributed to a payment gatewayPayment domain not listed as an unwanted referral
Google Ads shows almost no conversionsBooking event not reaching Google Ads
Revenue in GA4 is far below the booking engine reportPurchase event missing, duplicated or firing without value
Conversions counted twice on refreshNo transaction ID on the purchase event

Step 1: Find out what your booking engine allows

Before changing anything, ask your booking engine provider three questions:

  1. Can we add our own Google Tag Manager container or GA4 tag to the booking steps?
  2. Does the engine send a purchase or booking event, with value, currency and a booking reference?
  3. Does it run on its own domain, or inside an iframe on our website?

The answers decide which of the steps below are possible. Most established hotel booking engines support at least a GA4 or GTM integration; some offer it only on higher plans.

Step 2: Configure cross-domain measurement

Cross-domain measurement tells GA4 that your website and the booking engine are one journey. In GA4, go to Admin → Data streams → your web stream → Configure tag settings → Configure your domains, and add both your website domain and the booking engine domain.

The same GA4 measurement ID must be installed on both. When it works, links from your website to the booking engine carry a “_gl” parameter in the address bar, and the session continues instead of restarting.

Step 3: List unwanted referrals

When a guest leaves for a payment page (a payment gateway or bank page) and returns, GA4 can start a new session credited to that payment site. In the same tag settings, use “List unwanted referrals” to add your payment gateway domains and, if needed, the booking engine domain.

Step 4: Send a proper purchase event

The booking confirmation should send one purchase event containing:

  • transaction_id — the booking reference, so refreshes and repeat visits are not counted twice
  • value — the booking value; decide once whether this includes taxes, and keep it consistent
  • currency — INR, or the currency the guest paid in
  • items — the room type or rate plan, if the engine can pass it

Useful extras, where available, are check-in date, number of nights and number of guests, sent as custom parameters. Mark purchase as a key event in GA4.

Step 5: Send bookings to the ad platforms

GA4 reporting is only half the job. Google Ads and Meta need to receive the booking so their bidding learns which clicks turn into guests.

  • Google Ads — import the GA4 purchase key event, or install the Google Ads conversion tag on the confirmation step, with value. Use one or the other as the primary conversion, not both.
  • Meta — send a Purchase event through the pixel and the Conversions API, with an event ID so the two are deduplicated.

Once this is in place, the platforms can optimise for revenue instead of clicks. We cover the wider version of this in how to track bookings back to Google Ads.

If the booking engine runs in an iframe

Iframes make tracking harder because the booking happens inside a separate frame that your tags cannot see directly. Options, in order of preference: ask the provider to send booking events to your page (many can post a message your GTM container listens for), move to a hosted booking page on its own domain with cross-domain tracking, or fall back to the engine’s own reports, using UTM parameters to record the source of each booking.

Reconcile every month

Tracking will never match your booking engine or PMS exactly. Consent choices, ad blockers and guests who switch devices all create gaps. What matters is that the gap is stable and understood. Each month, compare direct bookings and revenue in GA4 with the booking engine report. A gap of 10–20% that stays steady is normal; a sudden change means something broke.

Good tracking is what turns hotel marketing from opinion into arithmetic. It is part of our tracking and attribution service, and the first thing we check when a hotel asks why its campaigns “aren’t working”. For the bigger picture, read how to increase direct bookings for your hotel.

Want this applied to your own funnel?

The Free Growth Audit reviews your ads, website, tracking and follow-up, and tells you which of these is currently costing you the most.

Book a Free Growth Audit