Attribution & Analytics

How to Track Booked Calls Back to the Ad That Drove Them

A step-by-step guide to tying every booked sales call to the ad, ad set and campaign that produced it, across Calendly, Cal.com, GHL and other calendars.


If you sell on calls, the most useful number in your ad account is cost per booked call by ad, and the hardest one to get right. To track booked calls back to the ad that drove them, you have to carry one click through three systems that were never designed to share it: the ad platform, your landing page, and a scheduling tool that lives on someone else’s domain. Most setups lose the thread somewhere in the middle, and the booking lands in the CRM with “Direct” or no source at all.

This guide walks through how the chain breaks, the methods that actually hold up (from hidden fields to session passing), how to handle leads who book weeks after their first click, and how to check your setup is working. It applies whether you use Calendly, Cal.com, GoHighLevel calendars, iClosed or something else.

Why booked calls lose their source

A typical call funnel looks like this: someone clicks a Meta ad, lands on a VSL page, watches part of it, scrolls to an embedded calendar, picks a time, fills in name, email and a couple of questions, and books. Four things tend to go wrong.

The calendar is an iframe on another domain. Your pixel sees the page view. The booking itself happens inside Calendly’s or Cal.com’s frame, which your pixel can’t read. Unless something explicitly passes the visit into the calendar, the booking arrives in your systems with no memory of the ad.

UTMs don’t survive the hop. Many funnels move from an opt-in page to a separate booking page, sometimes on a different subdomain. Page builders, redirects and link shorteners strip query strings more often than people expect.

The person books later, from somewhere else. They clicked an ad on Tuesday on their phone, then booked on Friday from a reminder email on their laptop. Two devices, two sessions, no shared cookie.

Someone else books for them. A setter in the DMs sends a link or books the call directly from their own browser. Now the booking carries the setter’s session, not the lead’s.

If you’ve ever looked at a CRM full of booked calls and seen a third of them with no source, it’s one of these four.

Method 1: UTMs passed into the calendar

Most scheduling tools accept UTM parameters on the booking URL and store them on the booking. Calendly, for example, records utm_source, utm_medium, utm_campaign, utm_content and utm_term when they’re present on the embed or link.

To make this work you need to:

  1. Tag every ad with consistent UTMs, using dynamic values for campaign, ad set and ad. Our UTM parameters guide covers a naming scheme that won’t fall apart.
  2. Forward the landing page’s UTMs into the calendar embed or booking link, either with the scheduling tool’s own option or a small script.
  3. Send the booking, with its UTMs, to your CRM by webhook or native integration.

This is free and better than nothing. Its limits: UTMs only describe the last tagged click, they don’t survive a device switch, and they carry no click ID, so you can’t send a matched conversion back to Meta or Google.

Method 2: Click IDs on the booking

A step up is carrying the ad platform’s click ID (fbclid for Meta, gclid for Google) onto the booking. Some tools can be configured to accept these as hidden fields or custom questions. Once the click ID is on the booking record, two things become possible: an exact match to the ad click, and a server-side conversion sent back to the platform with that ID attached.

iClosed is a good example of a tool where this works well: a booking that carries the ad’s fbclid or gclid can be linked straight to the visit recorded for that click, without forcing the lead through a thank-you-page redirect.

Click IDs still have the device problem, and they’re only present when the person actually came from an ad on that visit.

Method 3: Pass the visitor’s session into the calendar

The most reliable approach is to pass your attribution tool’s session ID into the scheduling tool. The session already knows everything about the visit: landing page, UTMs, click IDs, referrer, device, and every earlier visit from the same browser. When the booking carries that session ID back, it can be credited to the full visit history, not just whatever made it into the URL.

In Callix, this is handled per calendar:

  • Calendly: when a Calendly calendar is embedded on, or linked from, a page with the Callix pixel, the pixel passes the visitor’s session to Calendly automatically. Each booked call is credited to the visit and ad that brought it in. Nothing to set up, and it can be turned off per page.
  • Cal.com: pass the Callix session to the embed as metadata[callix_sid] and each booking is credited to its visit and ad.
  • Typeform applications: add a hidden field named callix_sid and the pixel fills it on embedded forms and links, so the application lands on the visit too.
  • Other form and booking tools: custom webhooks can map a Facebook click ID, Google click ID or Callix session ID, so the lead links to the visit it came from.

GHL calendars, HubSpot scheduling pages and YouCanBook.me booking pages can each be mapped to their own Callix event, so a “Discovery call booked” and a “Strategy call booked” stay separate.

First touch, last touch, and the call that matters

Once bookings carry their source, you hit a reporting question: credit the ad that first brought the person in, or the ad that got them to book?

Both are useful, and they answer different questions. First touch tells you which ads are opening the door. Last touch before the booking tells you which ads are closing the gap to a calendar slot. For a deeper treatment, see first-touch vs. last-touch attribution.

The trap is reporting only the contact’s first source on every call. Say a lead first arrived from a broad video ad in March, went cold, and booked in May after clicking a retargeting ad with a case study. If your calls report shows the March video ad, the retargeting campaign looks like it books nothing.

Callix’s Calls tab has a Booked From column for exactly this. It shows the campaign that brought the person to that call, not just where they first came from. A call held before the person’s first tracked visit shows a dash, rather than borrowing a campaign they only clicked later. If you’ve customized your columns, tick Booked From in the column picker.

Handling setters and DM bookings

Setter-booked calls are where most attribution setups quietly corrupt themselves. When a setter books from their own browser, a naive pixel sees the setter’s session and stamps it on every lead they book. Suddenly one campaign the setter clicked once is credited with 60 calls.

Two rules help:

  1. The setter’s browser should never pass its visit to the lead. In Callix, leads booked from a setter’s browser are still added as prospects, but no longer inherit the setter’s landing page, campaign, ad click or location.
  2. Get the lead’s own source from where the conversation started. For Instagram DM funnels, that’s the ad that started the DM thread. Callix can create prospects from Instagram DMs in GHL with the ad that started the conversation attached.

We go deeper on this in attribution for setter-closer teams.

A worked example: what the report should look like

Say you spend $18,000 in a month across four Meta ad sets into a Calendly funnel. With bookings tied to the ad, the report reads like this (illustrative numbers):

Ad set Spend Booked calls Cost per booked call Show rate Cost per showed call
Broad, founder video $6,000 60 $100 50% $200
Lookalike, case study $5,000 38 $132 71% $185
Interest, carousel $4,000 22 $182 64% $284
Retargeting, testimonial $3,000 30 $100 77% $130

On cost per booked call, the broad video ties for best. On cost per showed call, it’s third. And this is before you add closes and cash. Booked calls are the first link in the chain, not the last; how to tie ad spend to closed-won revenue covers the rest of it.

How to check your setup is working

Don’t trust a booked-call setup you haven’t tested end to end. Once a month, or after any funnel change:

  1. Click a real ad (or a link with test UTMs and a fake click ID) on a phone in a fresh browser.
  2. Book a call through the exact path a lead would take.
  3. Find the booking in your attribution tool and check it has the right campaign, ad set, ad and landing page.
  4. Repeat with a second device: click on mobile, book on desktop from a follow-up email. See what’s credited.
  5. Book one as a setter would and confirm the setter’s session didn’t leak onto the lead.

Then look at the share of booked calls with no source over the last 30 days. If it jumps after a change to the funnel, that change broke something. Callix’s funnel testing agent can run the first three steps for you in a real browser and report what reached Callix; more on that in using AI agents to QA your funnels.

The short version

  • Pass something durable into the calendar: a session ID beats click IDs, which beat UTMs.
  • Report the campaign that drove this booking, not just the contact’s first source.
  • Stop setter browsers from stamping their own visits on leads.
  • Measure cost per showed call, then cost per close, not just cost per booking.
  • Test the whole path after every funnel change.

Get these right and “which ad books calls” becomes a question you can answer from a table instead of a guess.

Book a demo