SRC- tag. The contact record also has a first-click and last-click attribution panel, which only works where GoHighLevel's tracking sees the visit. The honest limit: ad reporting shows spend for paid channels only and never joins it to the per-contact source data, so blended cost per customer still gets built outside the platform.
What "lead source" means in GoHighLevel
It is genuinely useful and it is also the single most over-promised feature in GoHighLevel marketing. Contact Source answers "how did this person get in?" It does not answer "which ad did they click?" Those are different questions, and the second one is the one that decides where your budget goes next month.
The five ways to track source, and what each one is for
| Method | What it captures | Setup effort | Use it for |
|---|---|---|---|
| Contact Source field | The entry mechanism (form name, lead ad, call, import) | None, automatic | Basic channel split, sanity checks |
| UTM values in custom fields | Exact source, medium, campaign, ad or keyword | ~15 minutes, once | Real campaign-level reporting |
| Attribution panel | First-click and last-click session source, referrer | None on GHL pages, code needed elsewhere | Seeing the full path, not just the last step |
| Dedicated tracking numbers | Which channel produced a phone call | One number per channel | Offline, print, GBP and direct-mail attribution |
| Source tags | A short label you control | One workflow | Fast filtering and triggering automation |
Setting up campaign-level tracking (the part that matters)
yoursite.com/offer?utm_source=google&utm_campaign=roof-repair and submits, those values write straight onto the contact record and stay there for the life of the lead.- Create the custom fields. Settings → Custom Fields → add single-line text fields for
utm_source,utm_medium,utm_campaignandutm_content. Full walkthrough: GoHighLevel custom fields. - Add hidden fields to the form. Open the form or survey in the builder, add a hidden field for each one, and point each at the matching query parameter.
- Apply a source tag in a workflow. Trigger on the form submission and add a tag like
SRC-GoogleAds. Tags are what you'll actually filter and automate on day to day. Convention guidance: GoHighLevel tags. - Tag every link you publish. Ads, email links, social bios, QR codes. If the link isn't tagged there is nothing for the hidden field to capture, and this is where almost every setup quietly fails.
- Build the reports. Smart lists filtered by source for lead counts, and opportunities grouped by source for revenue, which is the number that actually matters.
- Test it. Submit your own form through a tagged URL and check the values landed before you make a single budget decision on the data.
The attribution panel, and its one big condition
Tracking phone leads
Numbers cost roughly $1.15/month each at the time of writing, so channel-level call attribution is cheap. US texting from those numbers still requires A2P 10DLC registration first.
What GoHighLevel will not tell you
- Paid-channel spend only, and it lives in ad reporting rather than joined to the source field on each contact.
- No multi-touch attribution model beyond first and last click. Middle touches aren't weighted.
- Google Ads offline conversions need the click ID captured and sent back to Google to close the loop, which is manual. Covered in GoHighLevel and Google Ads.
- Imported and manually created contacts have no source and never will, which quietly skews early reports.
- Facebook lead ads arrive tagged as lead ads but without campaign detail unless you map it, see the Facebook Ads integration.
None of this makes the tracking useless. It makes it a lead-attribution system with paid-channel reporting bolted alongside, rather than a full ad-analytics platform, and knowing which one you bought saves an argument with a client later.
utm_source on your main form. That single change turns "we got 40 leads" into "we got 40 leads and 31 came from one campaign," which is usually enough to change where the next month's budget goes.Frequently asked questions
What is lead source in GoHighLevel?
The Contact Source field on each contact, set automatically from how they entered: form name, calendar booking, lead ad, inbound call, manual entry, import or API. It records the mechanism, not the campaign.
How do I track which campaign a lead came from?
UTM parameters on your links, custom fields for utm_source, utm_medium and utm_campaign, hidden form fields that read them from the URL, plus a workflow that adds a SRC- tag.
Does it show first-click and last-click attribution?
Yes, in the attribution panel on the contact record. It relies on GoHighLevel's tracking seeing the visit, so external embedded forms need the tracking code installed.
Can it show cost per lead by source?
For paid channels yes, ad reporting connects Google Ads and Facebook Ads and shows spend next to leads. It doesn't join that to contact-level source data or cover organic, referral and offline, so blended cost per customer still gets built outside.
Tags or custom fields for source?
Both. Custom fields hold the exact campaign value for reporting, tags give you fast filtering and something to trigger workflows from.
Why are some contacts missing a source?
Imports and manual entries never had one, external forms may be missing the tracking code, untagged links carry no UTM values, and some API integrations don't set a source.