# How to track lead source in GoHighLevel Calendar

See exactly which marketing channel sourced every appointment booked through your GoHighLevel calendar, ad, organic, email, or referral.

Source: https://sourceloop.ai/help/track-lead-source-in-gohighlevel-calendar/
Updated: 2026-05-28

---

GoHighLevel is the platform of choice for agencies, coaches, and local-business operators, and meeting-booking is one of its most-used features. The problem most users hit: GoHighLevel can tell you that an appointment was booked, but it can't tell you which Facebook ad, Google search, or blog post got that prospect to your booking page in the first place. This guide closes that loop.

You'll be done in about five minutes, no API connection or OAuth required.

## What SourceLoop captures from GoHighLevel

Every appointment booked through your embedded GHL calendar arrives in SourceLoop with:

- **Acquisition channel** and the full UTM set (`utm_source`, `utm_medium`, `utm_campaign`, `utm_content`, `utm_term`) from the visitor's first session
- **Last channel touched** in the session that produced the appointment
- **Every page the visitor browsed** on your site before booking, in chronological order
- **Original landing page and referring URL**
- **Session count** before the prospect finally booked (high count usually means a longer, content-driven journey)
- **Time elapsed** between first visit and the booked appointment
- **Contact email and name** captured from the booking form
- **Device, country, and browser** so you can see how mobile vs desktop perform

## Before you start

You'll need:

- A **SourceLoop workspace** ([free trial](https://app.sourceloop.ai/sign-up))
- **Edit access** to the website where your GoHighLevel calendar widget is embedded
- An active **GoHighLevel sub-account** with at least one calendar set up

## Step 1: Install the SourceLoop tracking script

Inside SourceLoop, click **Setup** in the left navigation and select the **Tracking code** tab. Copy the snippet shown there.

![SourceLoop Setup page showing the tracking code snippet ready to copy](/help/screenshots/sourceloop-tracking-code-script.png)

Add the snippet to the `<head>` of every page on your site, including (and especially) the pages where you embed your GoHighLevel calendar. If you manage multiple client sites, repeat this for each: each website should have its own SourceLoop workspace and its own snippet.

## Step 2: Embed the GoHighLevel calendar on your booking page

In GoHighLevel, open **Calendars -> your calendar -> Settings -> Form & Payment -> Calendar Embed**. Grab either the iframe embed code or the booking widget link, then drop it onto your landing page.

Common embed patterns inside GoHighLevel:

- **Inline iframe**: pastes a full calendar view directly on your page
- **Popup widget**: opens the calendar as an overlay when a visitor clicks a CTA
- **Funnels & Websites**: drop the Calendar element directly into a GoHighLevel funnel page

Whichever you choose, the rule is the same, the page that displays the calendar must have the SourceLoop snippet in its `<head>`. Once that's true, every appointment booked through the widget will flow into SourceLoop automatically, with the lead's full marketing journey attached.

> **Off-platform booking links aren't trackable**
> If you share your raw GoHighLevel booking link directly through SMS blasts, email campaigns, or DMs (skipping your website entirely), those appointments won't show up in SourceLoop. The visitor never lands on a page that has the tracker, and the integration has no off-site path to fall back on. Always route campaigns through a landing page that embeds the calendar.

## Step 3: Verify it's working

Open your booking page in an **incognito window**, add `?utm_source=test&utm_medium=verify&utm_campaign=ghl-check` to the URL, and book a test appointment with a real email you control.

Inside SourceLoop, head to the **Contacts Hub**. The test appointment should appear within seconds, with the test UTM values visible on the lead record.

## Where to see GoHighLevel appointments

After setup, every GoHighLevel booking lands in three places inside SourceLoop:

### Contacts Hub

Head to [app.sourceloop.ai/contacts](https://app.sourceloop.ai/contacts) to see each appointment as a contact row. Expanding a row reveals the entire timeline: the ad that brought them in, the case studies they read, the pricing page visits, and finally the booking. Useful for both qualification calls and post-mortem analysis.

![SourceLoop Contacts Hub showing a GoHighLevel appointment lead with their full pre-booking journey](/help/screenshots/sourceloop-lead-journey-demo.webp)

### Attribution dashboard

Open [app.sourceloop.ai/dashboards/traffic](https://app.sourceloop.ai/dashboards/traffic) to see your GoHighLevel appointments grouped by source, medium, and campaign. Especially valuable for agencies managing paid spend, you can see which Facebook ad set or Google campaign drove the most booked calls per dollar.

![SourceLoop attribution dashboard with GoHighLevel appointments grouped by source and campaign](/help/screenshots/sourceloop-attribution-dashboard.webp)

### Funnel reports

In [app.sourceloop.ai/funnels](https://app.sourceloop.ai/funnels/), build a funnel ending in "GoHighLevel appointment". Layer it by `utm_source` or by landing page to see exactly where you're losing prospects on the path to a booked call, and where you're converting them.

![SourceLoop funnel report ending in a GoHighLevel appointment conversion step](/help/screenshots/sourceloop-funnel.png)

You can also push your GoHighLevel appointments back to **Google Ads, Meta, and LinkedIn as offline conversions**, so the bidding algorithms optimize for booked meetings instead of vanity clicks. See [Connect your Google Ads account](/help/connect-google-ads/) to wire that up.

## Common issues

> **Tracking only works for one client's site**
> If you're an agency managing multiple GoHighLevel sub-accounts, each client's website needs its own SourceLoop workspace and its own tracking snippet. Reusing a single workspace's snippet across multiple client sites will jumble attribution data across accounts, which makes the reports unreliable.

That's the full setup. Every GoHighLevel appointment is now tied to the marketing channel that actually drove it, so you can stop guessing what's working.

## Frequently Asked Questions

### Does this work for sub-account calendars in GoHighLevel?

Yes. Whatever sub-account is hosting the calendar widget is irrelevant to SourceLoop, what matters is that the SourceLoop script is on the page where the widget is embedded. Each client website you manage needs its own SourceLoop workspace and tracking script.

### I use a white-label or custom subdomain for my GHL booking widget. Will tracking still work?

Yes. Custom domains have no effect on attribution. Just make sure the SourceLoop script is in the `<head>` of whatever page hosts the widget, whether that page lives on `bookings.youragency.com`, a client site, or anywhere else.

### Do I need to connect GoHighLevel's API or OAuth?

No. There's no API connection to set up. The integration is fully driven by embedding the GHL calendar widget on a page that already has SourceLoop installed.

### My clients send the GHL booking link directly via SMS or email. Will those bookings show up?

No. Bookings made through a raw GoHighLevel booking link (without first visiting a page that has the SourceLoop tracker) won't appear in SourceLoop. To attribute SMS or email campaigns, point them at a landing page on your domain that embeds the calendar.

### Can I track bookings across multiple client sub-accounts at once?

Each client should have their own SourceLoop workspace. Mix tracking across clients in a single workspace would muddy the attribution data. Use a workspace per client (or per agency-owned property).
