All posts
MeasurementStep-by-step

Calendly Google Ads Conversion Tracking with GA4 and GTM

Calendly Google Ads conversion tracking in 9 checks: Calendly's GA4 integration, the embed's booking message in Tag Manager, and bookings on calendly.com.

October 2, 2026·6 min read·by Olexander Cheberko
Table of contentstap to expand

A Calendly booking reaches Google Ads through GA4 or through Google Tag Manager: Calendly's GA4 integration sends invitee_meeting_scheduled, which you import from GA4 as Calendly's help suggests, or the Calendly embed posts calendly.event_scheduled to your page, where Google Tag Manager fires the Google Ads conversion. When Calendly sits on your site, use the embed route, because the booking then counts on your domain, next to the ad click.

Calendly's own GA4 integration

Check 1: Is Calendly connected to your GA4 web stream?

WhereCalendlyAutomationsIntegrations & appsGoogle Analytics
Do: Select Edit, paste the Measurement ID of your website's data stream, which starts with G- (find it), and select Save.
You should see: The ID of your web stream in the integration. Calendly offers it to Owners and Admins on the Professional, Standard, Standard Plus, Teams, Teams Plus and Enterprise plans, takes one GA4 Measurement ID per organization and has no direct Google Tag Manager integration (Calendly + Google Analytics).
If not: On another plan, go to check 4: the embed and its messages are available on all plans.

Check 2: Does a test booking send invitee_meeting_scheduled?

WhereGA4ReportsRealtime
Do: Book a test meeting on your Calendly page, which is how Calendly says to test the integration.
You should see: invitee_meeting_scheduled in the event count by event name (Realtime report). Calendly also sends page, day, time and routing form events (full list); only the booking is a lead. Standard reports can take up to 24 hours.
If not: Compare the ID in Calendly with the Measurement ID under Stream details in GA4 (find it).
Careful: Calendly says that without UTM tags on the scheduling link, GA shows the source as (direct). Read what direct means in GA4 before you judge your ads by that report.

Check 3: Which booking event is your key event?

WhereGA4AdminData displayEvents
Do: Mark one event per booking as a key event (Google's steps): invitee_meeting_scheduled, or the event your page sends in check 6.
You should see: One booking, one key event. That key event is what Google Ads imports as a conversion, as set up in link GA4 to Google Ads.
If not: When Calendly is embedded, choose the event from check 6. Google calls an intact gclid crucial for attributing conversions back to Google Ads, Calendly's embed recipes name five utm_ parameters the embed reads from your page URL and no gclid, and without cross-domain measurement a visit to another domain is a new user and a new session.
Careful: If both events are key events, every booking counts twice. Picking lead events is covered in GA4 key events for leads.

The Calendly embed and Google Tag Manager

Check 4: Is Calendly embedded with widget.js, not a bare iframe?

WhereCalendlyScheduling•••Add to website
Do: Copy the inline, pop-up widget or pop-up text code for your event type and compare it with what your page runs (add Calendly to your website).
You should see: The page loads https://assets.calendly.com/assets/external/widget.js. Only that embed messages your page; an iframe pasted on its own does not support event tracking via postMessage.
If not: Replace the bare iframe with the copied code.

Check 5: Does your page push each booking into the data layer?

WhereGoogle Tag ManagerTagsNewTag ConfigurationCustom HTML
Do: Paste this listener, built on Calendly's parent window events, into a Custom HTML tag and fire it on All Pages:
<script>
  window.addEventListener('message', function (e) {
    if (e.origin !== 'https://calendly.com') return;
    if (!e.data || e.data.event !== 'calendly.event_scheduled') return;
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
      event: 'calendly_booking',
      booking_id: e.data.payload.invitee.uri.split('/').pop()
    });
  });
</script>
You should see: The tag accepts messages only from https://calendly.com, as Calendly's own example does, and pushes calendly_booking with booking_id, the last part of the invitee URI. No name or email leaves the embed: the calendly.event_scheduled payload holds only the event and invitee URIs.
If not: If calendly_booking never shows in check 9, go back to check 4.

Check 6: Do your conversion tags fire on that event?

WhereGoogle Tag ManagerTriggersNewTrigger ConfigurationCustom Event
Do: Create a Custom Event trigger with the Event name calendly_booking (custom event trigger) and attach it to a Google Ads Conversion Tracking tag with your Conversion ID and Conversion Label (Google's setup) and to a Google Analytics: GA4 Event tag (GA4 events in Tag Manager).
You should see: A Data Layer Variable for booking_id in the Ads tag's Transaction ID, which Google uses to skip duplicate conversions, and a Google tag or Conversion Linker tag on every page, which keeps the ad click in first-party cookies on your domain.
If not: Get the ID and label from find your conversion ID and label; the full tag build is in Google Ads conversion tracking with Tag Manager.
Careful: Google caps a transaction ID at 64 characters and bars anything that identifies the customer. The invitee id fits; never push the invitee's name or email.

Bookings on calendly.com

Check 7: Does a booking on calendly.com return to your site?

WhereCalendlyScheduling•••EditMore optionsConfirmation page
Do: Under After booking, select Redirect to an external site, enter a thank-you page on your domain and select Save changes (redirect after booking). Then add a page view trigger for that page to the tags from check 6.
You should see: A test booking lands on your thank-you page. Calendly offers the redirect on the same plans as the GA4 integration.
If not: Point the ad at your site, not at calendly.com: the tags read the ad click from cookies on your domain, which are set from your landing page URL.
Careful: Leave Pass event details to your redirected page off. It can add the invitee's name and email to the URL, and Google requires page URLs and parameters free of PII.

Check 8: Is calendly.com an unwanted referral?

WhereGA4AdminData collection and modificationData streamsWebConfigure tag settingsShow allList unwanted referrals
Do: Choose a match type, enter calendly.com under Domain and click Save.
You should see: calendly.com in the list. Google built it for visitors who return to your site from a third-party domain, such as a payment processor; without it, the redirect from check 7 shows calendly.com as a referral source.
If not: The setting needs the Editor role or above at the property level.

Test

Check 9: Does one test booking count once?

WhereGoogle Tag ManagerPreview
Do: Click Preview, enter your page's URL, click Connect (preview and debug) and book a test meeting.
You should see: calendly_booking, or the thank-you page view, once in Tag Assistant with both tags fired on it, then one key event in GA4 Realtime. Reading the tags is covered in checking conversion tags in Tag Assistant.
If not: If a tag fired twice, look for a second trigger or a second key event (check 3). When it fires once, submit and publish the container, then cancel the test meeting in Calendly.

After each booking counts once

A booking is a lead, not a patient or a sale. The next step is telling Google Ads which bookings showed up and paid, so bidding learns from those, which is where closed-loop attribution starts. The system I deliver for that sends Google only a click id, a conversion value and a timestamp.

Tags

calendly-google-ads-conversion-trackingcalendly-ga4-trackingcalendly-embedgoogle-tag-managerga4-key-eventscross-domain-measurement

Frequently asked questions

Does Calendly integrate directly with Google Ads?

Its help routes Google Ads through GA4: Calendly documents a Google Analytics (GA4) integration and points to Google's steps for importing GA4 conversions into Google Ads. For bookings in an embed, the calendly.event_scheduled message the embed posts to your page can fire a Google Ads conversion tag from Google Tag Manager.

Can I track a Calendly embed with Google Tag Manager?

Calendly says it has no direct Google Tag Manager integration, but its embed posts calendly.event_scheduled to your page with window.postMessage. A Custom HTML tag can listen for that message and push a data layer event that triggers your tags. An iframe pasted on its own sends no such messages.

Why do Calendly bookings show as direct in GA4?

Calendly's help says GA shows the source as (direct) when the scheduling link carries no UTM tags. The booking also happens on calendly.com, and without cross-domain measurement GA4 counts a visit to another domain as a new user and a new session.

Which Calendly plans include the Google Analytics integration?

Professional, Standard, Standard Plus, Teams, Teams Plus and Enterprise, and only Owners and Admins can set it up. Each Calendly organization connects one GA4 Measurement ID, which cannot differ by user or team.

Related posts