Most independent hotels I audit have GA4 installed. Almost none of them have GA4 set up. There is a difference, and that difference is roughly the gap between “we have a smoke detector” and “the smoke detector has a battery in it.”
The default Google Analytics tag will happily count pageviews until the heat death of the universe and tell you basically nothing useful about whether people are booking rooms. No funnel. No revenue. No idea whether your organic traffic converts better than your paid traffic. You are flying a plane by looking at the seatbelt sign.
This post fixes that. We are going to set up GA4 the way a hotel actually needs it: a real booking funnel, proper events with revenue attached, clean channel attribution, and three reports you will genuinely open on a Monday morning. The goal of all this measurement, by the way, is not analytics for its own sake. It is to find where your direct bookings leak out, so you can plug the holes, claw back margin, and lean a little less hard on the OTAs charging you 15 to 25 percent per reservation.
Let’s get the battery into the smoke detector.
Why hotel GA4 is genuinely different (and harder)
A normal ecommerce site sells things on the same domain the whole way through. Add to cart, checkout, thank-you page, all on coolsocks.com. GA4 loves this. It works out of the box.
Hotels almost never have this. Your marketing site is on yourhotel.com. Your internet booking engine (IBE) — the thing that takes the actual reservation — is very often on a different domain owned by your booking-engine vendor. Something like secure-booking.somevendor.com or reservations.cloud.
Here is what that breaks if you do nothing:
- The session splits. A guest searches Google, lands on your room page, clicks “Book Now,” and crosses to the vendor domain. GA4 treats that crossing as the start of a brand new session by a brand new user. Your funnel snaps in half right at the most important moment.
- Attribution gets laundered. That second session often gets credited as “direct” or as a referral from your own site. So the organic visitor you worked so hard to earn shows up in your reports as direct traffic that converted out of nowhere. You under-credit the channels that are actually working.
- Revenue goes missing. The purchase happens on the vendor domain. If GA4 isn’t measuring that domain, the booking simply does not exist in your data.
So before you touch a single event, you have to solve cross-domain tracking. This is the part everyone skips, and it is the part that matters most.
The number one reason a hotel’s GA4 undercounts bookings is unconfigured cross-domain tracking between the marketing site and the booking engine. If GA4 shows way fewer reservations than your PMS, check this first, before you blame anything else.
Step 1: Lay the plumbing (GA4 property + Google Tag Manager)
Do this once, correctly, and everything downstream gets easier.
- Create a GA4 property (if you somehow don’t have one). One property per hotel brand. If you run two properties, like a hotel and a separate spa or restaurant site, give each its own GA4 property and a shared “roll-up” later only if you really need it. Don’t over-engineer on day one.
- Install Google Tag Manager (GTM), not the raw gtag snippet. I know, another container, another thing to learn. But GTM is what makes the events below possible without bothering a developer every single time. Put the GTM container on every page of both your marketing site and, where your vendor allows it, your booking engine.
- Connect GA4 to GTM with a single GA4 Configuration tag firing on All Pages. This is your base tag. Everything else hangs off it.
- Turn off internal traffic. Add a filter so your own front desk, your home IP, and your agency don’t pollute the data. Nothing makes a 40-room hotel’s conversion rate look weird like the GM refreshing the homepage 60 times a day.
If your booking engine vendor flatly refuses to let you add GTM or a GA4 measurement ID to their pages — and some do — ask them specifically whether they support server-side conversion postback or a GA4 measurement ID passthrough. Many of the big booking engines now do. If yours genuinely supports nothing, that’s a real strike against it, and worth weighing the next time your contract is up.
Step 2: Configure cross-domain measurement
In the GA4 admin, under your data stream, open Configure tag settings → Configure your domains. Add every domain a guest can touch on the way to a booking:
yourhotel.comwww.yourhotel.com- the booking engine domain, e.g.
secure-booking.somevendor.com
This tells GA4 to pass the client ID across domains using a URL parameter (you’ll see _gl= appended to links — that’s the linker doing its job, leave it alone). Now the search-to-room-to-checkout journey stays a single session by a single user, and the booking gets credited to the channel that actually earned it.
Two gotchas worth a paragraph each:
The referral exclusion. Even with cross-domain set up, list your booking-engine domain under List unwanted referrals so GA4 doesn’t credit the booking engine itself as the traffic source. Otherwise half your bookings look like they came from your own reservation system, which is both useless and a little sad.
Test it for real. Open your live site, click Book Now, and watch GA4’s Realtime → DebugView. You should see one continuous user moving from yourhotel.com to the booking domain without a new session spawning. If a fresh user appears the moment you cross over, your cross-domain config isn’t live yet. Don’t move on until this works.
Step 3: Build the booking funnel as events
GA4 is event-based, which is great, because a hotel booking is a sequence of events. We’re going to map the guest’s path to a set of standard GA4 ecommerce events. Using the standard names matters — GA4 has built-in reports that only light up if you use them exactly.
Here’s the funnel, event by event:
| Guest action | GA4 event | Key parameters to send |
|---|---|---|
| Searches dates/availability | search (or view_search_results) | check-in, check-out, guests, nights |
| Views a specific room type | view_item | room name, room id, rate, currency |
| Selects a room / adds to cart | add_to_cart | room, rate, nights, value |
| Reaches the checkout/guest-details page | begin_checkout | total value, currency, items |
| Enters payment details | add_payment_info | value, currency |
| Completes the reservation | purchase | transaction id, value, currency, items |
That purchase event is the whole ballgame. It needs a unique transaction_id (use the confirmation number so you can dedupe against your PMS), a real value (the room revenue — decide once whether it’s pre-tax or post-tax and never change your mind), and a currency. Get those three right and GA4’s revenue reporting comes alive.
A few hotel-specific notes:
- Send dates as parameters, not as separate events. Length of stay and lead time (days between booking and check-in) are gold for understanding guests. Pass check-in and check-out on the search and purchase events and you can analyze them later.
- Treat room types like products. Put room name and rate plan into the
itemsarray. Now you can see which room type drives revenue and which rate plan converts — the kind of thing your channel manager data hints at but never quite shows. If you’re untangling how rates and content sync across systems, our piece on channel manager and SEO hygiene pairs well here. - Mark
purchaseas a Key Event. In GA4, conversions are now called “Key Events.” Flagpurchase, and probablybegin_checkout, so they show up in the reports and can be imported into Google Ads.
If you only do one thing from this entire post, make it this: get a real
purchaseevent firing with a real revenue value on the booking confirmation page. A funnel with no revenue at the bottom is just a list of things people didn’t buy.
Step 4: Fix channel attribution so you can trust it
Now that bookings flow in with revenue attached, you need to trust where they came from. Two jobs here.
Tag your own campaigns with UTMs. Any link you control that points at your site — email newsletters, your Instagram bio, a metasearch listing, a paid social ad — should carry UTM parameters so GA4 files it correctly. Untagged links fall into “direct” or “referral,” which is where good marketing goes to die uncredited. If you’re running Google Hotel Ads or metasearch, tag those links carefully; it’s the only way to prove they pay off. We go deep on that in metasearch for independent hotels and on the specific (and very winnable) fight of bidding on your own brand in Google Hotel Ads.
Understand GA4’s default channel groups. GA4 sorts traffic into Organic Search, Paid Search, Direct, Referral, Organic Social, Email, and so on. For a hotel, watch three of them like a hawk:
- Direct — should be mostly returning guests and brand typers. If it’s suspiciously huge, you have a tracking leak (untagged links or broken cross-domain).
- Organic Search — your SEO and AEO work showing up. This is the channel you’re trying to grow so you depend less on paid distribution. Strong local visibility feeds this directly, which is why local SEO and your Google Business Profile matter so much.
- Referral — watch for OTA domains here. Seeing meaningful traffic from an OTA to your site is actually a billboard-effect signal worth understanding, and it ties into the uncomfortable reality of how OTAs intercept your branded search.
The honest caveat: GA4 only ever sees bookings made on your own website. A reservation completed on an OTA never touches your domain, so it will never appear in GA4. That’s fine — treat GA4 as your direct-channel scoreboard. Your job isn’t to make the OTAs vanish from the picture (they won’t, and chasing that is a fool’s errand). Your job is to grow the direct column on this scoreboard quarter over quarter so your overall mix gets healthier. Our take on building a healthy OTA mix is the strategy that sits on top of this measurement.
Step 5: The three reports you’ll actually open
You don’t need 40 dashboards. You need three.
1. The Funnel Exploration
In GA4’s Explore section, build a Funnel exploration using the events from Step 3 in order: view_item → add_to_cart → begin_checkout → add_payment_info → purchase. Turn on “show elapsed time” and the open-funnel option.
This is the single most valuable report a hotel can have, because it shows you where guests fall out. Purely as an illustration of how to read it: imagine 1,000 people view a room, 300 add it to the cart, 120 begin checkout, and only 70 finish. That 300-to-120 cliff is screaming that something on your guest-details page is scaring people off — a surprise fee, a clunky form, a slow load. (Those numbers are made up to show the shape of the thing, not a benchmark to compare yourself against.) You fix the worst step, then re-check next month. That’s the entire game.
2. Traffic acquisition, segmented by Key Event
Go to Reports → Acquisition → Traffic acquisition and add purchase (and its revenue) as the metric. Now you can see, channel by channel, not just who visits but who books and how much they’re worth. Organic visitors might convert at half the rate of email but bring ten times the volume — you can’t make a single smart budget decision without seeing this side by side.
3. A simple revenue-by-room landing page view
Use the Landing page report (or a Free-form Exploration) crossed with purchase revenue. This tells you which entry pages — which room pages, which offers, which blog posts — actually lead to money. Spoiler: it’s usually not the pages you’d guess, and it will completely reorder your content priorities.
A sane setup checklist
Before you call it done, confirm all of these:
- GA4 installed via GTM on the marketing site and (where possible) the booking engine
- Cross-domain measurement configured and verified in DebugView
- Booking-engine domain added to unwanted referrals
- Internal traffic filtered out
- The full funnel of events firing, named with GA4 standard names
purchasecarrying a uniquetransaction_id, realvalue, andcurrencypurchaseandbegin_checkoutmarked as Key Events- Your own campaign links UTM-tagged
- Funnel, traffic-acquisition, and revenue-by-page reports built and bookmarked
Work that list top to bottom and you’ll have GA4 doing the one thing it’s for: telling you, in plain numbers, where your direct bookings are leaking and which channels deserve more of your money. That’s how you stop guessing, win back more direct reservations, and keep a little more of your own margin instead of handing it to a commission line.
If wiring all this up sounds like a weekend you’d rather spend running your actual hotel, that’s literally what we do. We set up clean, hotel-specific GA4 and the SEO and AEO work that fills the top of that funnel. See what an engagement looks like, or just book a call and we’ll start with your funnel.