Tracking & Attribution

gclid vs fbclid vs UTM Parameters: What's the Difference?

gclid and fbclid are platform-specific click IDs that power ad-platform attribution. UTM parameters are manual tags for cross-channel analytics.

Quick answer

Click IDs (gclid, fbclid) are platform-specific identifiers automatically appended to ad URLs that tie a click to a later conversion. UTM parameters (utm_source, utm_medium, utm_campaign) are manually-set tags that work across analytics tools. Click IDs power platform-side attribution; UTMs power cross-channel analytics. Most setups need both — captured and stored alongside the lead.

Click IDs (gclid, fbclid) are platform-specific identifiers that Google and Meta automatically append to URLs when a user clicks an ad. They let the platform tie that specific click to a later conversion. UTM parameters (utm_source, utm_medium, utm_campaign, utm_term, utm_content) are manually-set tags that work across analytics tools and CRMs. The two solve different problems — click IDs power platform-side attribution, UTMs power cross-channel analytics — and most setups need both.

The confusion is reasonable: all three live in the URL as query parameters, all three are about “where the traffic came from,” and all three get stripped, lost, or mis-stored in CRMs more often than they should be. This article disambiguates the three, explains when each is used, and covers the storage patterns that keep them attached to the lead through the funnel.


What’s the difference between click IDs and UTM parameters?

The fastest way to see the difference is side-by-side:

gclid fbclid UTM parameters
Owner Google Meta Open standard (Urchin → Google Analytics)
Auto-appended to ad URLs Yes (auto-tagging on by default) Yes No — set manually by the advertiser
Number of params 1 1 5 (utm_source, utm_medium, utm_campaign, utm_term, utm_content)
Value format Opaque alphanumeric string Opaque alphanumeric string Plain text, human-readable
Primary use Google Ads attribution, offline conversion imports Meta Ads attribution, CAPI matching Cross-channel analytics, CRM source attribution
Used by the ad platform Yes — Google reads it on conversion Yes — Meta reads it on conversion No — the platform doesn’t read UTMs
Used by analytics tools GA4 reads gclid for Google Ads integration GA4 strips fbclid from session URLs All analytics tools read UTMs
Stored in cookie _gcl_aw (Google Tag) _fbc (Meta Pixel) None natively — your code stores it
Cross-platform attribution No No Yes

Click IDs are machine-readable handles for the platform that issued them. UTM parameters are human-readable labels for your analytics stack. The two are complementary, not interchangeable: a URL with both — ?gclid=abc...&utm_source=google&utm_medium=cpc&utm_campaign=q2-launch — gives Google’s attribution engine the click handle it needs and gives your analytics tool the campaign labels it needs.


What is the Google Click Identifier (gclid)?

The Google Click Identifier (gclid) is a unique string that Google Ads automatically appends to the destination URL when a user clicks one of your search, display, or shopping ads. It looks like this:

https://yoursite.com/landing-page?gclid=Cj0KCQiAtbqdBhDvARIsAGYnX1QABCD123XYZ

The gclid value encodes (in Google’s internal format) the campaign, ad group, keyword, ad creative, and click metadata for that specific click. Google reads it back when the user converts — either via a website conversion event tracked by the Google tag, or via an offline conversion upload that includes the stored gclid — and ties the conversion to the originating campaign.

gclid is set automatically when auto-tagging is enabled in your Google Ads account (it’s on by default for new accounts since 2018). If auto-tagging is off, gclid doesn’t appear and you have to fall back to UTM parameters or manual tagging for attribution.

The gclid is opaque — you can’t decode it client-side. Don’t try to parse it; treat it as a blob. Store it on the lead record so it can be uploaded back to Google Ads when an offline conversion occurs (a phone-call close, a CRM-recorded sale, etc.).

Google offers a sibling parameter, gbraid, for iOS-specific traffic where ATT restrictions affect attribution. Google’s documentation specifies gclid for desktop and Android, gbraid for app-to-web iOS traffic, and wbraid for web-to-app iOS traffic. For most lead-gen pipelines you’ll see gclid most of the time.


What is the Facebook Click Identifier (fbclid)?

The Facebook Click Identifier (fbclid) is Meta’s equivalent of gclid. It’s appended automatically to any link clicked from a Facebook, Instagram, Messenger, or Audience Network ad:

https://yoursite.com/landing-page?fbclid=IwAR0abc123XYZ...

The fbclid value identifies the specific click within Meta’s auction logs. When the Meta Pixel fires on the landing page, it captures the fbclid from the URL and stores it in the _fbc cookie in Meta’s required format: fb.1.<creation_time_ms>.<fbclid>. The _fbc cookie value is then sent to Meta on every subsequent conversion event — via the Pixel directly, or via the Conversions API (CAPI) on the fbc parameter — and Meta uses it to tie the conversion back to the originating ad.

Like gclid, fbclid is opaque. Don’t parse it; capture it from window.location.search when the user lands and store it.

fbclid has a different storage convention than gclid: Meta wants the fbclid wrapped into the _fbc cookie format (with a timestamp prefix), not the raw fbclid value. If you’re capturing fbclid for CAPI, the correct stored value is fb.1.${Date.now()}.${fbclidFromUrl}, not the raw URL parameter. Sending the unwrapped fbclid as the fbc parameter is a common mistake that produces silent match failures.


What are UTM parameters and what do they track?

UTM parameters are a set of five query string tags — utm_source, utm_medium, utm_campaign, utm_term, utm_content — that originated with the Urchin analytics tool in the early 2000s and were inherited by Google Analytics. They’re a published open standard that every analytics platform, CRM, and email tool recognizes.

Parameter What it labels Example
utm_source The platform or referrer google, facebook, newsletter
utm_medium The channel type cpc, email, social, display
utm_campaign The campaign name q2-launch, black-friday-2026
utm_term The keyword (paid search) enterprise-crm, lead-management-software
utm_content Variation identifier header-cta, blue-button-v2

UTMs are set manually by the advertiser — you build them into the destination URL when you set up the ad, the email, or the social post. They’re plain text and human-readable, which is the source of both their value (analytics tools can group by them cleanly) and their fragility (case-sensitive, typo-prone, inconsistent across teams).

The standard practice: use lowercase, separate words with hyphens not spaces or underscores, and maintain a centralized naming convention document so Facebook, facebook, and FB don’t end up as three different sources in GA4.

UTMs are platform-agnostic. Google Ads doesn’t read them for attribution (Google uses gclid); Meta Ads doesn’t read them either. UTMs serve your analytics stack and your CRM, not the ad platform.


When should you use click IDs, UTMs, or both?

The short answer: both, on every paid ad URL. The click ID tells the ad platform “this click became a conversion.” The UTMs tell your analytics stack and CRM “this lead came from this campaign on this channel.” Skipping either creates an attribution gap somewhere.

A correctly-tagged URL for a paid Meta ad looks like:

https://yoursite.com/landing-page?fbclid=AUTO_BY_META&utm_source=facebook&utm_medium=cpc&utm_campaign=q2-saas-launch&utm_content=video-ad-v1

A correctly-tagged URL for a Google Ads search click looks like:

https://yoursite.com/landing-page?gclid=AUTO_BY_GOOGLE&utm_source=google&utm_medium=cpc&utm_campaign=q2-keywords&utm_term=lead-capture-software

For organic and email traffic where there’s no click ID, UTMs are the only signal — set them consistently and the cross-channel attribution still works inside your analytics tool. For paid traffic without UTMs, the ad platform’s own dashboard still works (because the click ID is enough for the platform), but your GA4 and CRM views lose the campaign-level granularity.

A click ID without UTMs gives the ad platform attribution but blinds your CRM. UTMs without a click ID give your CRM attribution but blind the ad platform. Both, on every URL, every time is the rule.


How long does each identifier stay attributable?

The three identifiers have very different attribution lifetimes:

Identifier Attribution lifetime Notes
gclid Up to 90 days for offline conversion imports Google Ads’ offline import accepts gclid for up to 90 days after the click
fbclid / _fbc cookie 7-day click default (Meta’s attribution window) Tied to the ad account’s configured attribution window
UTM parameters Indefinite You control storage; the parameters themselves never expire

gclid’s 90-day window is the longest of the three, which is why offline conversion tracking — uploading sales-team-closed leads back to Google Ads weeks after the original click — works for Google in a way it generally doesn’t for Meta. Meta’s 7-day default means the same offline upload to Meta has a much shorter useful window unless you also configure a longer click attribution setting.

UTM parameters are indefinite because they live wherever you store them. If you save utm_source=newsletter on a lead record, you can attribute that lead to the newsletter source two years later. The attribution is a storage question, not a freshness question.


How should you store click IDs in your CRM?

The right pattern: capture every identifier from the URL when the lead lands, persist them to a first-party cookie or localStorage so they survive multi-page sessions, and write them to the lead record alongside email/name/phone when the form is submitted (or captured as a partial lead).

A minimal capture script:

const params = new URLSearchParams(window.location.search);
const tracking = {
  gclid: params.get("gclid"),
  fbclid: params.get("fbclid"),
  utm_source: params.get("utm_source"),
  utm_medium: params.get("utm_medium"),
  utm_campaign: params.get("utm_campaign"),
  utm_term: params.get("utm_term"),
  utm_content: params.get("utm_content"),
};
 
// Persist first non-null values for 30 days
Object.entries(tracking).forEach(([key, value]) => {
  if (value && !localStorage.getItem(`tracking_${key}`)) {
    localStorage.setItem(`tracking_${key}`, value);
    localStorage.setItem(`tracking_${key}_at`, new Date().toISOString());
  }
});

A few storage rules that matter in practice:

  • Capture first-touch, not last-touch, by default. If the user clicks a Google ad, browses, then clicks a Meta ad before converting, you usually want both stored — gclid from the first visit, fbclid from the second, and the UTMs from each. Overwriting on every visit loses the first-touch signal.
  • Don’t strip click IDs from URLs you redirect through. Some platforms strip query parameters during redirects “for cleanliness” — this breaks attribution on the destination page. Preserve them.
  • Map to CRM fields explicitly. HubSpot, Salesforce, and Pipedrive each have native fields for gclid and UTM parameters. Use them; don’t dump everything into a single freeform “source” field.
  • Don’t strip click IDs when emailing a recovery link. If a partial lead gets a recovery email with a link back to the form, keep the original click IDs in the URL so the eventual conversion still attributes correctly.

How does PartialLeads capture click IDs alongside the lead?

When PartialLeads’ tag loads on the page, it reads gclid, fbclid, and all five UTM parameters from window.location.search and persists them as first-party cookies. The captured values are attached to every subsequent partial-lead capture and full form submission — so every lead that enters the CRM carries its full attribution context, not just the email and name.

Specifically:

  • First-touch capture. The first visit’s gclid, fbclid, and UTMs are persisted and never overwritten. If the visitor returns later through a different channel, the new values are stored separately as last-touch. The lead record carries both, so multi-touch attribution works downstream.
  • _fbc cookie management. The fbclid is wrapped in Meta’s required fb.1.<timestamp>.<fbclid> format and written as the _fbc cookie. Every CAPI event PartialLeads dispatches includes the correctly-formatted fbc parameter — which is what Meta actually expects, not the raw fbclid from the URL.
  • CRM handoff. When the lead is forwarded to your CRM (HubSpot, Salesforce, Pipedrive, or via webhook to a custom backend), the click IDs and UTMs are mapped to their canonical fields on the contact or deal record. The sales team sees campaign attribution the same way analytics does. The structural benefit: a partial lead captured from email@example.com arriving from a Meta ad shows up in the CRM with fbclid, _fbc, utm_source=facebook, utm_medium=cpc, and the campaign name attached — same data quality as a fully-completed form, recovered before the user even hit submit.

Sources

  1. Google Ads Help — Google Click Identifier (gclid): https://support.google.com/google-ads/answer/9744275
  2. Google Ads Help — About auto-tagging: https://support.google.com/google-ads/answer/3095550
  3. Meta for Developers — fbp and fbc parameters: https://developers.facebook.com/documentation/ads-commerce/conversions-api/parameters/fbp-and-fbc
  4. Google Analytics Help — Campaign URL Builder (UTM reference): https://ga-dev-tools.google/campaign-url-builder/
  5. Google Ads Help — About offline conversion imports: https://support.google.com/google-ads/answer/2998031
  6. Meta Business Help — About attribution settings: https://www.facebook.com/business/help/2198119873776795

Frequently asked questions

QIs fbclid the same as the `_fbc` cookie?
No, but they're related. The `fbclid` is the raw value Meta appends to the URL on an ad click. The `_fbc` cookie is the value Meta expects for matching, formatted as `fb.1.<creation_time_ms>.<fbclid>`. The Meta Pixel converts `fbclid` to `_fbc` automatically when it loads on the landing page. If you're sending CAPI events directly without the Pixel, you have to construct `_fbc` from `fbclid` yourself — sending the raw `fbclid` as the `fbc` parameter produces silent match failures.
QShould I strip click IDs from URLs before storing them in my CRM?
Don't strip the click IDs themselves — those are what enable platform attribution. Do strip them from the URL you display back to the user on confirmation pages and in recovery emails if you want clean shareable links. The pattern most setups use: store `gclid`, `fbclid`, and UTMs as dedicated fields on the lead record, and serve a clean URL without query parameters in any user-visible context.
QWhy does fbclid sometimes break links when I share them?
When you copy a URL that contains `fbclid` from Facebook or Instagram and paste it elsewhere, the recipient's browser sometimes treats the URL as having come from a Meta ad context even though it didn't. This can produce false attribution events. The fix is to strip `fbclid` from URLs you share manually — keep it for the user's first landing, but don't preserve it when reusing the URL in another channel.
QDoes Google Analytics 4 read gclid and fbclid the same way?
No. GA4 reads `gclid` natively as part of its Google Ads integration and attributes the session to Google Ads automatically. GA4 strips `fbclid` from the session URL and does not natively attribute the session to Meta — you need UTM parameters (`utm_source=facebook&utm_medium=cpc`) for GA4 to show the session as coming from Meta. This is why setting UTMs on Meta ads is non-optional even though `fbclid` is appended automatically.
QDo I need UTMs if my Google Ads campaign has auto-tagging on?
For Google Ads attribution: no — `gclid` is enough. For GA4 reporting and CRM source attribution: yes — UTMs give you human-readable campaign labels that match the way your team thinks about the campaign. Most operators set both: let auto-tagging append `gclid` automatically, and manually add UTMs on top for the analytics and CRM side. The two coexist in the URL without conflict.
QWhat's the maximum length of a gclid or fbclid?
Both are variable-length opaque strings. `gclid` typically runs 50–100 characters; `fbclid` typically runs 80–250 characters. Both can be longer in some cases. Don't truncate either — they're treated as exact match by their respective platforms, and a single missing character breaks attribution. Store them in a text field with no character limit, not in a fixed-length column.
QShould I capture last-touch UTMs or first-touch UTMs?
Most lead-gen setups want both, stored separately. First-touch UTMs reveal the channel that introduced the lead to your brand; last-touch UTMs reveal the channel that converted them. Storing only one obscures multi-touch journeys. HubSpot and Salesforce both support paired first-touch / last-touch fields natively. The minimal capture script in this article preserves first-touch by default — adapt it if you want last-touch overwrite behavior.

Find the qualified leads your forms are currently throwing away.

Install PartialLeads on one landing page, send traffic, and compare what your CRM captured against what PartialLeads recovered and qualified.