Connecting Cal.com to Google Ads
Cal.com holds the booking and, unusually, will let you self-host and query the database directly. Google Ads knows what you spent and which click it came from, and nothing at all about what happened afterwards. The join between them succeeds or fails on one thing: whether the GCLID reaches the Cal.com booking before the conversion happens, because Google Ads can only match a conversion it can tie back to a click it recognizes.
Free30 minutesNo obligation
Specific to this pair
Cal.com bookings to Google Ads with the gclid in a booking question
Add hidden Cal.com booking questions for gclid, gbraid and wbraid, prefilled from the URL and passed through routing forms. Upload to import-type actions: booking created within hours, and meeting held once the start time passes uncancelled. Retract cancellations with adjustments, use attendee email for Enhanced Conversions for leads, and value paid bookings or use a fixed proxy.
For Google Ads, the field you need on the Cal.com booking is the gclid, plus gbraid or wbraid for iOS traffic where Google sends those instead. Add one hidden booking question per parameter, prefill them from the URL your page builds, and the BOOKING_CREATED payload carries them in the booking responses. Routing forms have to pass the same parameters through to the event type they route to, or routed traffic arrives without them.
Upload against import-type conversion actions. Two make sense: booking created, uploaded within hours, and meeting held, uploaded once the start time passes with no BOOKING_CANCELLED received. Bookings often sit two or three weeks out, which is fine against Google's 90-day click window, but the held-meeting action lags enough that the last fortnight of any report undercounts. Use conversion adjustments to retract bookings that are later cancelled or rejected.
Cal.com always collects the attendee's email, so Enhanced Conversions for leads works as the fallback when the gclid is missing, which helps with people who click an ad, leave, and later book from your Cal.com public profile page with no landing page in between. Paid event types should carry the amount charged as value; free consultations need a fixed proxy value you set once and keep.
Cal.com → Google Ads · what breaks
Why this join usually fails — Cal.com → Google Ads
- 01
The GCLID never reaches Cal.com
As with any hosted booking page, the identifier must be passed on the booking URL and captured into a booking question. Cal.com's routing forms add a second surface that also needs to carry it, and they are commonly missed.
- 02
Routing forms are a second capture surface
Cal.com routing forms sit in front of the booking and are easy to forget. An identifier captured on the booking page but not on the routing form leaves a hole in exactly the traffic that used routing.
- 03
The conversion action is the wrong type
Uploads against a standard website conversion action fail. The action has to be created as 'Import' — and existing actions cannot be converted, so this is discovered late and requires starting a new action with no history.
- 04
Nothing reconciles afterwards
Google Ads reports uploads in Goals → Conversions → Uploads, with rows accepted and rows failed. A green result means the file parsed, not that the clicks matched. The number to watch is how many conversions actually appear against campaigns afterwards.
Cal.com → Google Ads · the fix
What working looks like — Cal.com → Google Ads
The GCLID on every booking
Conversions arriving in Google Ads
Conversions appear against the campaign, ad group and keyword that produced the click, with the value you sent — which is what lets Smart Bidding optimize toward revenue instead of toward form fills.
Reconciled against the source
Cal.com → Google Ads · architecture
How Cal.com and Google Ads actually connect
- 1
Cal.com holds the truth
The booking carries the attendee, the event type, the time and any custom booking-question responses. Self-hosted instances give you direct database access, which makes reconciliation genuinely easy compared with every other booking tool.
- 2
Google Ads needs a click to match
Google Ads matches an uploaded conversion back to a click using the GCLID. The conversion action must be created as an import type — an upload against a website-tag conversion action is rejected. Uploads must also land inside Google's window: the click has to be within the last 90 days.
- 3
The identifier is the bridge
The GCLID, captured at the visit and carried into the Cal.com booking.
- 4
The event source decides reliability
Send from your server on the webhook, and handle BOOKING_CANCELLED for reversals. Self-hosted instances can read from the database instead, which is the most reliable option available on any booking platform.
- 5
Deduplication at the destination
Google deduplicates on the combination of GCLID, conversion action and conversion time. Uploading the same click twice against the same action at the same timestamp is rejected rather than double-counted, but uploading it against a second conversion action counts twice — which is how most double-counting here actually happens.
Cal.com → Google Ads · normal or broken
Working vs. broken, side by side — Cal.com → Google Ads
Normal, not a fault
The GCLID present on the booking
Sent from the BOOKING_CREATED webhook
Deduplicated correctly
Google deduplicates on the combination of GCLID, conversion action and conversion time. Uploading the same click twice against the same action at the same timestamp is rejected rather than double-counted, but uploading it against a second conversion action counts twice — which is how most double-counting here actually happens.
Reconciles with the source
Actually broken
The GCLID missing on most records
As with any hosted booking page, the identifier must be passed on the booking URL and captured into a booking question. Cal.com's routing forms add a second surface that also needs to carry it, and they are commonly missed.
Sent from the browser
Cal.com routing forms sit in front of the booking and are easy to forget. An identifier captured on the booking page but not on the routing form leaves a hole in exactly the traffic that used routing.
Counted twice, or not at all
Uploads against a standard website conversion action fail. The action has to be created as 'Import' — and existing actions cannot be converted, so this is discovered late and requires starting a new action with no history.
Nobody has reconciled it
Cal.com → Google Ads · diagnose
Diagnostic order — Cal.com → Google Ads
- 01
Count bookings carrying the GCLID
- 02
Follow one real conversion end to end
- 03
Query recent bookings for the identifier field
Direct database query on self-hosted, API on cloud. Then repeat for bookings that came through a routing form specifically.
- 04
Check the conversion action type and the upload diagnostics
In Google Ads, Goals → Conversions → Uploads shows every upload with its error rows. Read the errors rather than the success count; a file can import successfully with most rows rejected.
- 05
Read the match rate, not the success message
Google Ads reports uploads in Goals → Conversions → Uploads, with rows accepted and rows failed. A green result means the file parsed, not that the clicks matched. The number to watch is how many conversions actually appear against campaigns afterwards.
Cal.com → Google Ads · prove
How it gets proven — Cal.com → Google Ads
Source of truth
Cal.com's bookings list for the same window, with cancellations separated.
- The GCLID confirmed present on a live booking.
- The Uploads diagnostics read row by row, with the accepted count reconciled against conversions appearing in campaign reporting.
- Coverage confirmed separately for direct bookings and for routing-form bookings.
Cal.com → Google Ads · free audit
What we check in the free audit
- Count bookings carrying the GCLID
- Follow one real conversion end to end
- Query recent bookings for the identifier field
- Check the conversion action type and the upload diagnostics
- Read the match rate, not the success message
Checked against
Cal.com's bookings list for the same window, with cancellations separated.
Free30 minutesNo obligation
Cal.com → Google Ads · when not to buy
When you don't need this — Cal.com → Google Ads
- Measure identifier coverage yourself first — pull your last hundred bookings and count how many carry the GCLID.
- Self-hosting Cal.com already gives you the data. If you have engineering capacity in-house, this is one of the few integrations a competent developer can genuinely do alone.
- If your sales close inside a few days and your website tag already reports accurately, you may not need offline import at all. It exists to solve the delay between click and revenue.
Cal.com → Google Ads · what we deliver
What gets built — Cal.com → Google Ads
Identifier capture into Cal.com
Add a hidden booking question, append the identifier via Cal.com's prefill query parameters, and verify through the API or directly in the database on a self-hosted instance.
Event source: the BOOKING_CREATED webhook
Send from your server on the webhook, and handle BOOKING_CANCELLED for reversals. Self-hosted instances can read from the database instead, which is the most reliable option available on any booking platform.
Dispatch to Google Ads
Offline Conversion Import through the Google Ads API, or a scheduled upload. Enhanced conversions for leads where GCLID coverage is poor and you have consented email addresses.
Reversals where they exist
BOOKING_CANCELLED and BOOKING_REJECTED both fire with the reference, so reversals are straightforward.
Written guarantee
95%+ tracking accuracy
Measured against Cal.com's bookings list for the same window, with cancellations separated.. Miss it and we keep working at no cost.
From $400 · See packages
FAQ
Cal.com → Google Ads questions, answered
Into a hidden booking question prefilled from the URL. It then appears in the booking responses on the webhook and through the API.
Upload both as separate import actions and bid on the one that better predicts revenue. Held meetings are the cleaner signal when no-shows are common.
Almost always because the GCLID never reached the Cal.com booking. As with any hosted booking page, the identifier must be passed on the booking URL and captured into a booking question. Cal.com's routing forms add a second surface that also needs to carry it, and they are commonly missed. Measure coverage before debugging the dispatch.
The GCLID — the click ID Google appends to your landing page URL when auto-tagging is on. For iOS App campaigns and some Shopping traffic you will see GBRAID or WBRAID instead, and those behave differently: WBRAID cannot be used with user-provided data in the same way, and neither joins to an individual user. Enhanced conversions for leads is the alternative path, matching on hashed email or phone rather than a click ID, and it is the right choice when GCLID coverage is poor.
The BOOKING_CREATED webhook. Send from your server on the webhook, and handle BOOKING_CANCELLED for reversals. Self-hosted instances can read from the database instead, which is the most reliable option available on any booking platform.
Google Ads reports uploads in Goals → Conversions → Uploads, with rows accepted and rows failed. A green result means the file parsed, not that the clicks matched. The number to watch is how many conversions actually appear against campaigns afterwards.
More on Cal.com → Google Ads
- Cal.com + GoogleGoogle Ads and GA4 tracking for Cal.com
- Cal.com → Microsoft AdsConnecting Cal.com to Microsoft Ads
- Cal.com → Apple Search AdsConnecting Cal.com to Apple Search Ads
RELATED GUIDES
Where Cal.com → Google Ads fits in the rest of your tracking
- Google Ads · Local servicesGoogle Ads conversion tracking for local service businesses
- Google Ads · Coaches & consultantsGoogle Ads conversion tracking for coaches and consultants
- Google Ads × CRM DealsHow to reconcile Google Ads against your CRM's closed-won deals
- Google Ads · Booked call → closed wonHow to track booked call to closed won for Google Ads
- Appointy → Google AdsConnecting Appointy to Google Ads
- Cal.com → MetaConnecting Cal.com to Meta Conversions API
- Coaches & consultantsConversion tracking for coaches and consultants, where every booked call counts
- Square Appointments → Google AdsConnecting Square Appointments to Google Ads
Free · 30 min
Get Cal.com and Google Ads joined properly
Free30 minutesNo obligation
