If GA4 says your bookings come from your own booking engine ("referral"), or from direct, while you know they came from ads, the visitor's session is breaking when they move to the booking site.
Short answer: add every domain in the booking journey to GA4's Configure your domains list (Admin → Data streams → web stream → Configure tag settings). Make sure the booking engine loads your GA4 tag. Then check that links to the booking engine carry a _gl= parameter. On a campground account we worked on, the whole problem was that list being empty.
What was happening
The setup is common for campgrounds, resorts, hotels and clinics:
- The marketing site on one domain, where ads send traffic.
- A second brand domain for another property.
- A third-party booking engine on its own domain, where the reservation and payment happen.
GA4 was installed on all three. Yet bookings were credited to the booking engine as a "referral", and ad campaigns looked like they produced nothing.
Why the source gets lost
GA4 identifies a visitor with a first-party cookie, and cookies belong to one domain. When the visitor clicks from yoursite.com to booking-engine.com:
- The booking engine's GA4 tag can't read the cookie from your site.
- It starts a new session for what looks like a new visitor.
- The referrer is your site, so the booking is credited to "yoursite.com / referral". The ad that started the journey is gone.
Cross-domain tracking fixes this by passing the visitor's identity through the link itself, in a _gl parameter, so the second domain can continue the same session.
The fix, step by step
1. Add every domain to "Configure your domains"
In GA4: Admin → Data streams → choose your web stream → Configure tag settings → Configure your domains.
Add each domain the visitor moves between, for example:
yoursite.comyour-second-brand.combooking-engine-domain.com
This is the step we found missing. The tag was installed everywhere, but the list was empty, so GA4 never added _gl to the links.
2. Load the same GA4 tag on the booking engine
Cross-domain tracking only works if the booking pages load your GA4 measurement ID, directly or through your Google Tag Manager container. Most booking engines have a field in their settings for a GA4 ID or a GTM container. If yours doesn't allow any tag, the booking engine's pages can't continue the session, and you'll need its own reporting or a server-side approach instead.
3. Exclude payment gateways
If the booking flow sends visitors to a payment page on another domain and back, add that domain to List unwanted referrals in the same tag settings. Otherwise the payment provider can show up as the source of your bookings.
4. Make sure the links are real links
GA4 decorates normal links (<a href>) and form submissions with _gl. If your "Book now" button opens the booking engine with JavaScript, or the booking engine sits inside an iframe, the parameter may never be added. Check each entry point, not just one.
How to test it
- Open your site from an ad-style link, for example with
?utm_source=test&utm_medium=cpcadded. - Click Book now and look at the booking engine URL. It should contain
_gl=followed by a long value. - Open GA4 Realtime or DebugView and confirm the session keeps your test source on the booking pages.
- Complete or simulate a booking, and check that the purchase or booking event carries the test source.
If _gl is missing, check step 1 (domains list) and step 4 (how the button opens the booking engine). If _gl is there but the source still breaks, check step 2 (the booking engine isn't loading your tag).
Booking engines that send people back to your site
Some engines finish on a thank-you page on your own site, with booking details in the URL. That's good news: you can fire the purchase or booking event there, from your own tag, with the value. We've set this up for cabin and RV park bookings through GTM. Make sure the thank-you page only fires once per booking, for example by checking the booking ID before sending, so refreshes don't create duplicates.
Common errors
- Bookings credited to "booking-engine.com / referral": the domains list is empty or incomplete.
- Bookings credited to "(direct)": the booking engine doesn't load your tag, or
_glis stripped. - Payment provider as the source: add it to unwanted referrals.
- Works on desktop, not mobile: a different button or menu opens the booking engine with JavaScript.
- Purchases counted twice: the thank-you page fires on refresh.
Testing checklist
- Every domain in the journey is in "Configure your domains".
- The booking engine loads your GA4 ID or GTM container.
- Clicking "Book now" adds
_gl=to the booking engine URL, from every entry point. - A test session keeps its UTM source through to the booking.
- Payment gateways are listed as unwanted referrals.
- Each booking fires its event once.
Related reading: platform-reported results vs real bookings: which numbers to trust.

