“Our GA4 says we get almost no bookings, but the phone doesn’t stop ringing and WhatsApp is full of fare enquiries. What’s wrong with our tracking?”
Nothing is broken — GA4 simply cannot see a phone call or a WhatsApp reply by default, because that “booking” happens off the page. Fix it by treating every click-to-call and click-to-WhatsApp tap as a GA4 key event, appending UTM/gclid/fbclid to every enquiry your CRM captures, and sending each closed booking back to Google Ads (via enhanced conversions for leads or the Data Manager API, since the older offline import route is being retired) and Meta Conversions API once the sale is confirmed. Do this and you stop optimising on the fraction of bookings that came through a web form, and start optimising on all of them.
What this guide covers
- Why your GA4 under-reports bookings
- Tracking click-to-call and click-to-WhatsApp in GTM
- Call tracking and dynamic number insertion
- WhatsApp Business API and click-to-WhatsApp ad attribution
- Passing UTM, gclid and fbclid into your CRM
- Closing the loop: offline conversions to Google Ads and Meta
- Filtering bot traffic in GA4
- A simple bookings-by-route-and-source dashboard
If you run paid or organic campaigns for a flight-booking or holiday-package brand, this sits alongside our travel marketing services — tracking is the first thing we fix before touching a campaign budget.
01Why your GA4 under-reports bookings
Most flight and holiday-package agencies run their business the same way: a paid search or Meta ad brings someone to a fare page, and instead of filling a form, the traveller taps “Call now” or “Chat on WhatsApp” because they want a real person to confirm availability and price before they commit. That’s exactly the moment standard GA4 tracking goes blind.
Out of the box, GA4 tracks page views, scrolls and form submits — it has no idea what happened after someone tapped a phone number or opened a WhatsApp chat, because that conversation happens off your website. The result: your ad platforms report a trickle of conversions from web forms, someone tells you the campaign “isn’t working,” and meanwhile your reservations team is juggling calls and WhatsApp threads that never get linked to the campaign that produced them.
This is the norm, not the exception, for enquiry-heavy, high-consideration purchases like flights and multi-city packages, where buyers want to talk to someone before paying. Fixing it isn’t about adding tracking for its own sake — it’s about making your ad platforms and CRM see the bookings that are already happening, so budget follows what actually closes.
02Tracking click-to-call and click-to-WhatsApp in GTM
The first fix is free and takes an afternoon: fire a GA4 event every time someone taps a phone number or a WhatsApp link on your site, and mark that event as a GA4 key event (GA4’s current term for what used to be called a “conversion”).
- Click-to-call links. In Google Tag Manager, set up a Click – Just Links trigger filtered to
Click URL contains tel:. Attach a GA4 Event tag firing on that trigger, namedclick_to_call, and pass the route or destination the visitor was viewing (e.g.DEL-DXB) as an event parameter where you can. - Click-to-WhatsApp / wa.me links. Do the same with a trigger filtered to
Click URL contains wa.meorapi.whatsapp.com, firing aclick_to_whatsappevent. For a JavaScript widget rather than a plain link, use a Click – All Elements trigger against the widget’s button ID instead. - Mark both as key events. In GA4 admin, under Events, toggle “Mark as key event” for both. That’s what makes them show up as conversions in Google Ads once you import GA4 conversions, and lets you build audiences and Smart Bidding around them.
- Don’t stop at the click. A tap is intent, not a booking. Treat these as leading indicators, and keep reading — the real fix is closing the loop back to what actually got booked, in Steps 5 and 6.
This one change routinely surfaces several times more “conversions” than a form-only setup, simply because it’s counting clicks that were always happening and never being recorded (Boei’s GTM + GA4 WhatsApp tracking guide).
03Call tracking and dynamic number insertion
Click events tell you someone tapped “call,” not whether it connected, how long it lasted, or whether it became a booking. For agencies with real phone volume, close that gap with call tracking.
- Dynamic Number Insertion (DNI). A call-tracking script swaps the number shown on your site with a unique tracking number per visitor, based on source, campaign or keyword. The call routes through to your real number while the platform logs the source and reports duration (and, with recording, outcome) back to you.
- Static per-channel numbers. A lighter option: one number for Google Ads traffic, another for Instagram, another for offline collateral. You lose keyword-level granularity but get clean channel attribution with no DNI setup.
- What to evaluate, not what to pay. Pricing models vary too widely across vendors to quote a number worth trusting here. What matters is whether a platform pushes call events into GA4 and Google Ads as conversions automatically, supports WhatsApp alongside voice, and integrates with the CRM you already run (Step 5).
- Keep it proportional. If most bookings close on WhatsApp rather than voice, prioritise Steps 4 and 5 first and treat DNI as a later refinement.
04WhatsApp Business API and click-to-WhatsApp ad attribution
If you run Click-to-WhatsApp ads on Meta (ads that open a WhatsApp chat instead of a landing page), Meta has a purpose-built attribution mechanism worth setting up properly rather than guessing.
ctwa_clid. When someone taps a Click-to-WhatsApp ad, Meta attaches a click ID to the referral payload delivered with that message via the WhatsApp Business API (Cloud API or a Business Solution Provider). That ID ties a chat thread back to the exact ad, ad set and campaign that started it — without it, every WhatsApp conversation looks identical regardless of which ad drove it.- Send it back via Conversions API. Once your WhatsApp integration or CRM captures the
ctwa_clidand the phone number, send booking and enquiry-quality events back to Meta through the Conversions API, so its algorithm optimises toward people who actually book, not just people who open a chat. - This sits on top of the regular customer-service WhatsApp Business API setup most agencies already have — you specifically need referral/click-ID capture enabled plus a Conversions API connection from wherever your chats land.
For the exact field names and payload shape, see a BSP’s own walkthrough (Whapi’s guide to tracking Click-to-WhatsApp ROI with ctwa_clid).
05Passing UTM, gclid and fbclid into your CRM
This is the step most agencies skip. Every fare enquiry your team logs — call, WhatsApp or form — needs to carry the campaign data that produced it, or Step 6 has nothing to attach a booking to.
| What to capture | Where it comes from | Why it matters |
|---|---|---|
| UTM parameters | URL the visitor landed on | Tells you campaign, source and medium at a glance in every report |
| gclid | Appended to the URL by Google Ads on click | Required to send offline conversions back to Google Ads (Step 6) |
| fbclid | Appended to the URL by Meta on click | Pairs with Conversions API to close the loop on Meta (Step 6) |
| Session/visitor ID + landing page | Your own site or a first-party cookie | Lets you reconstruct the journey even when clids expire or get stripped |
In practice: use a small script (or a GTM variable + hidden form field, or a data-layer push into your CRM‘s API) that reads these parameters from the URL or a first-party cookie the moment a visitor lands, and stores them against that visitor. When your team logs a phone or WhatsApp enquiry as a new lead, that stored attribution data should auto-populate onto the lead record — not get typed in manually, which is where most agencies lose the data in practice.
This is where a properly built CRM pays for itself: a system that holds a fare enquiry, a route, an attribution source and a booking status on one record is what makes call tracking, offline conversions and the dashboard in Step 8 actually usable rather than a spreadsheet exercise. This exact gap — enquiries with no attribution attached — is often the single biggest reason a travel brand’s paid budget looks like it’s underperforming when it isn’t; it’s a pattern we address directly in how we run travel accounts, and proper tracking took one flight-booking agency we work with from about 8 tracked bookings a month to 1000+.
06Closing the loop: offline conversions to Google Ads and Meta
Once a fare enquiry becomes a confirmed, paid booking in your CRM, that outcome needs to travel back to the ad platform that earned the click. This is the step that turns “we get a lot of calls” into “we know which campaigns and keywords produce paying bookings.”
Google Ads — and a real deadline to know about. Google is moving offline conversion tracking away from the classic offline conversion import and onto two newer paths: enhanced conversions for leads and the Data Manager API. Per Google’s own developer announcement, starting June 15, 2026, offline conversion and enhanced-conversions-for-leads uploads migrate to the Data Manager API and are blocked in the Google Ads API for new adopters (Google Ads Developer Blog: changes to offline click conversion import support). Build directly on enhanced conversions for leads or the Data Manager API rather than the legacy import (Google’s guide to upgrading to enhanced conversions for leads). In practice: capture the visitor’s email or phone at enquiry time (hashed, per Google’s spec), tag the gclid against the lead, and when the booking closes, send the conversion — with the actual fare value — tied to that hashed contact data and gclid.
Meta — Conversions API. Send the confirmed booking event server-side via the Conversions API, matched against the fbclid or WhatsApp ctwa_clid captured at enquiry time (Step 4), plus hashed contact details. This lets Meta’s optimisation learn from bookings instead of just clicks and chat-opens.
The common thread: both platforms now expect conversion data server-to-server, tied to hashed customer identifiers rather than only a browser click ID, because click IDs alone don’t survive a multi-day phone/WhatsApp sales cycle. That’s exactly why Step 5’s CRM capture (email, phone, gclid, fbclid on one lead record) is the prerequisite here.
07Filtering bot traffic in GA4
Before you trust any of the numbers above, make sure they’re not inflated by non-human traffic. GA4 applies a baseline layer of known-bot exclusion automatically, filtering traffic matched against the IAB/ABC International Spiders and Bots list (Google Analytics Help: known bot traffic exclusion) — but that list only catches well-known, declared crawlers, not scrapers or the low-grade automated traffic that hits phone and WhatsApp links directly.
- Watch for impossible click patterns. A spike of
click_to_callorclick_to_whatsappevents from a single session, from data-centre IP ranges, or with zero time-on-page beforehand, is worth filtering with a GA4 audience exclusion or a dwell-time check before the trigger fires. - Cross-check against your CRM. If GA4 shows a jump in click-to-call events with no matching jump in actual logged calls, that gap is your bot-traffic estimate.
- Keep bot filtering separate from lead-quality filtering. A real human who calls and isn’t a fit is a bad lead, not bot traffic — don’t let “improving numbers” become an excuse to exclude real enquiries that didn’t close.
08A simple bookings-by-route-and-source dashboard
Once Steps 5 and 6 are in place, every closed booking in your CRM carries a route, a source/medium, and a campaign. That’s enough for a genuinely useful dashboard without anything exotic:
- Bookings by route, by source. A simple pivot — rows are routes or destinations, columns are source/medium — shows which channels produce bookings for which routes, not just which channels produce clicks.
- Enquiry-to-booking rate by source. With every enquiry logged against its source, you can compute a true close rate per channel — the number that should drive budget decisions, not cost-per-click.
- Average fare value by source. Some channels bring cheaper domestic routes, others higher-value international bookings; blending these into one “cost per booking” hides which channel is worth the spend.
- Time-to-close by source. Phone and WhatsApp enquiries often close at different speeds than form leads — worth knowing before you set follow-up SLAs.
You don’t need a dedicated BI tool for this on day one — a CRM report or a connected spreadsheet pulling from the lead records in Step 5 gets you most of the value. The dashboard is only as good as the attribution data feeding it, which is why Steps 2 through 6 have to be solid first.
If you’d rather have this built and monitored than build it yourself, see how we grow travel brands — it pairs naturally with the lead generation work that fills the funnel these dashboards measure.
FAQs
Why does GA4 show so few conversions when we get dozens of calls and WhatsApp messages a day?
Do I need call-tracking software, or is a GTM click event enough?
Is the old Google Ads offline conversion import going away?
What is ctwa_clid and do I need it?
What’s the single highest-impact fix if we can only do one thing this month?
10+ years building growth systems for SaaS, fintech, healthcare and Web3. Ex-Head of Marketing at LCX — scaled 10K → 150K users and $50M+ raised across 12 token sales.
Want this built for your business?
We build AI growth systems for SMBs. Book a free 30-minute audit and we will map it to your funnel.
Explore Growth Systems →Book a free audit →