The guest chooses a room on the hotel website, moves to an external booking engine and completes the booking there. If measurement ends at the "Book" button, the hotel sees interest but has no reliable link between the campaign and confirmed bookings.
To track hotel bookings in GA4 through an external system, you need to connect permitted measurement between the domains, send an event on actual confirmation and use a unique transaction_id. If the provider doesn't allow the necessary integration, measure the transition separately and reconcile confirmed bookings through its report or API. Don't present clicks as purchases.
First clarify what a confirmed booking means
Creating a request, successfully paying a deposit and a confirmed booking can happen at different times. Agree with the hotel and the provider which state triggers the primary result. For a booking paid on site, the confirmation may be valid without an online payment; the value must have a clear business meaning.
Also record what it includes: the price of the stay, a deposit or another component. Don't add a deposit and the full value as two separate revenues from one stay. Analytics booking revenue is not the same as accounting-recognized revenue or nights actually stayed.
Event map for the hotel journey
| Action | Sample event | What it proves |
|---|---|---|
| Click to the booking engine | booking_engine_click — a custom event | Moving to the booking |
| Choosing a room and rate | select_item, if the data is available | A selection, not a purchase |
| Start of checkout | begin_checkout | A started procedure |
| Confirmed booking | purchase with transaction_id | A result by the agreed rule |
| Amount refunded | refund with transaction_id | An actual refund |
| Cancellation without a refund | booking_cancelled — a custom event | A change in operational status |
The map is a design template, not a promise that every system provides all the events. Don't send the guest's name, email, phone or notes to GA4.
What cross-domain measurement does
With a compatible setup, the _gl parameter helps GA4 keep the identifiers when moving between domains. Check whether the hotel website and the booking engine use the correct shared GA4 configuration and whether the provider supports this mechanism. Simply adding the external domain in the hotel's settings doesn't install measurement on the third-party system.
Test the actual link or form the guest goes through. Watch the redirects: the parameter may be removed before the final page. Excluding unwanted referrals doesn't replace connecting the user and doesn't create a missing purchase event.
Questions for the provider before implementation
- Can GA4 or GTM be added, and who manages the configuration?
- When exactly is the final confirmation available?
- Are the booking's identifier, value and currency provided?
- Are the parameters kept during redirects and payment?
- Is there an API or webhook for confirmation, change and cancellation?
- How are the cookie choice and permitted data transfer managed?
For a server-side integration, use a controlled process and verified identifiers. An API notification without a link to the original visit may give a count of bookings, but not enough data to reliably attribute the ad source.
A test protocol before you rely on the report
- Open the website with a known test source and go through the real booking path.
- Check
_gl, the setup of both domains and the available events in the diagnostic tools. - Make a test booking with the hotel's permission; record its identifier and the expected value.
- Check whether
purchasearrives after the confirmation and whether it has the correcttransaction_id,valueandcurrency. - Reload the confirmation page and repeat the server notification in a test environment. No new logical purchase should be created.
- Check a declined payment, a cancellation and an applicable refund.
In web streams, GA4 uses the transaction ID to deduplicate purchases. The identifier must be unique to the booking, non-empty and contain no personal information. This doesn't remove the need to prevent unnecessary sending of events in the integration itself.
How to reconcile GA4 with the booking system
Compare a list of identifiers and statuses for one period, time zone and currency. Separate confirmed, cancelled and actually completed stays. Note the bookings with no measurement because of the user's choice or a technical limitation; don't expect all systems to give identical numbers.
If you see a difference, first check the definitions and the timing of the event. The general diagnostics are in why GA4 and the business system show different results. For hotels and tourism businesses DigitaL+ combines measurement setup with integrations with external systems, first checking what the specific provider actually supports.
Frequently asked questions
Can everything be set up only on the hotel website?
Only if the provider offers a suitable mechanism for confirmation and measurement. A click to a third-party domain doesn't prove the booking was completed.
Should we use purchase for every availability request?
No. An availability request is a separate action. The primary result must match the explicitly defined state "confirmed booking".
Is a cancellation always a refund?
No. A cancellation and a refund are different events. For a cancellation without a refund, keep the operational status separately instead of sending a refund that doesn't exist.



