pixellint

Blog · Click ids

gclid vs fbclid vs ttclid are three click ids, and none of them fills the others.

gclid vs fbclid vs ttclid is one landing URL and three join keys. gclid is the value Google Ads auto-tagging puts on the query. fbclid is the value Meta appends. ttclid is the value TikTok appends. They are not interchangeable. A shared click_id column that always stores gclid will starve every other graph. Putting gclid in a Meta CAPI body does not fill fbc. Putting fbclid in TikTok user data does not fill ttclid.

UTMs are a different thing. utm_source, utm_campaign, and utm_content are first-party labels you control. They tell analytics which campaign you think the session came from. They are not proof of a paid click the ads platform issued. Last-click UTM in GA4 can look attributed while Google Ads has no gclid and will not count the conversion against the bid. A marketer who pastes UTMs onto a Meta ad URL still needs the fbclid Meta appends. A homemade utm_content is not that click.

Some Google clicks also carry gbraid or wbraid when cookies are thin. Those are first-class Google click ids, not UTM content. An upload wants one of gclid, gbraid, or wbraid, or hashed user identifiers. They are separate query values. Do not invent one from the others.

ttclid stays on the TikTok body, in the clear

Store ttclid from the landing URL the same way you store fbclid. TikTok Events API uses it on web events. Without it, matching leans on hashed email and on plaintext IP and user agent. ttp is the _ttp cookie the pixel writes. You copy it. The server will not mint it. fbc is not ttp.

On Events API 2.0, ttclid rides on the web event inside the data array, next to event_source web and the Pixel Code on event_source_id. On the older pixel/track path it rides in context. A Meta user_data object posted at TikTok does not place it. App events are a different source and, on 2.0, allowlist. Do not copy a web ttclid onto an app body and call the click matched.

One landing request can carry gclid and fbclid and ttclid only if the user arrived from one platform. Usually one of them is present. Capture whichever keys exist. Do not require all three before you persist the one you have. A later purchase sends each id only to the vendor that issued it.

What each vendor actually wants

Three fields. A column named click_id that stores only gclid feeds one of them.

Google:  adIdentifiers.gclid = landing gclid   (not _gcl_aw)
Meta:    user_data.fbc = fb.1.<landing ms>.<fbclid>
TikTok:  ttclid from the landing query, plaintext, web events

Phone and email hashing stay on their own recipe per vendor. The click ids never enter that hasher. Gmail dot-stripping is a Google email rule. Meta trims and lowercases. Neither rule applies to gclid or fbclid. Run the click ids through as captured, after you have stripped only whitespace you actually saw on the query.

Pixellint is not affiliated with Google, Meta, or TikTok. Validate the Meta body for fbc shape and the TikTok body for the envelope you POST. The Google upload is a different artifact. A single JSON that contains all three ids is a warehouse row, not a vendor payload.

The same pattern covers the click ids this page is not about

msclkid is Microsoft. li_fat_id is LinkedIn. twclid is X. Each is captured from the landing URL and sent only to the vendor that minted it. A warehouse column can hold all of them. A Meta user_data object should hold fbc and fbp, not the whole set. A TikTok web event should hold ttclid and, when you have it, ttp. A Google upload should hold gclid or gbraid or wbraid.

Hosted checkout is where the query dies. Put the ids you captured on the URL that leaves for checkout, or stash them server-side under a first-party session. Do not assume a platform will pass unknown parameters through. GA4's _gl linker is analytics stitching. It is not auto-tagging, and it is not a substitute for storing fbclid.

Validate per payload. A Meta body with a raw fbclid in fbc fails the fbc shape. A TikTok body with no ttclid can still be legal and weakly matched. A Google upload with the cookie blob in the gclid field is the wrong token even when the rest of the conversion is hashed correctly. Three checks, three artifacts.

What does not transfer

Sources

Contract pages

The dated argument is above. These pages are the field lists.

Read click ids Docs