Which advertising identifiers Converly captures, where they are stored, how long they last, and which one is sent with a conversion.

When a visitor clicks one of your ads, ad platforms like Google & Meta append a click ID to the end of the URL they land on.

So instead of clicking an ad and landing on https://converly.io, visitors actually land on https://converly.io?gclid=123456789.

There are unique identifiers for every click on every ad platform, and the idea is that if you can capture them and pass them back with the conversion, then the ad platform can use it to match the conversion to the original ad click with 100% confidence.

Identifiers Converly captures

To help improve the accuracy of your conversion tracking, Converly captures these identifiers, stores them in a cookie in the visitor's browser, and then passes them back to the ad platforms with each conversion.

The below tables outline the identifiers that Converly captures:

Captured on arrival

IdentifierPlatformDescription
gclidGoogle AdsStandard Google Ads click identifier.
gbraidGoogle AdsUsed for app and web journeys on iOS where gclid is often absent entirely.
wbraidGoogle AdsUsed for web-to-app journeys on iOS, same reason.
fbclidMetaStored in the format Meta’s own pixel uses, so both agree on the value.
ttclidTikTokSent with the server-side conversion.
rdt_cidRedditPaired with the Reddit pixel’s visitor identifier where one exists.
li_fat_idLinkedInPresent on ad landing pages when the advertiser has enhanced conversion tracking enabled. LinkedIn’s own tag does not need to be installed.
opprefChatGPT AdsKept for the platform’s own 30 day window rather than the default.

One further identifier is generated rather than captured. _fbp is Meta’s browser identifier, and Converly creates it in Meta’s own format when it is absent, because Meta counts it toward match quality. It is the only platform-owned identifier Converly writes rather than only reads. Every other one is left alone, as set out below.

Pulled from the platform's own tag

Several platforms set their own browser identifier through their own pixel. Where one is present, Converly reads it and passes it along to improve matching. It does not create these, so if you do not run that platform’s pixel on your website the value is simply absent.

IdentifierPlatformDescription
_rdt_uuidRedditSet by the Reddit pixel. Sent alongside the Reddit click identifier.
_ttpTikTokSet by the TikTok pixel.
__obrefChatGPT AdsSet by OpenAI’s pixel. Converly deliberately does not create this one, because doing so would set a long-lived identifier on every page of every site including those with no ChatGPT Ads destination, and OpenAI’s own coverage metric does not count it.
_gaGA4Google Analytics client identifier, taken from the last two segments of the cookie value.
_ga_<stream>GA4Google Analytics session identifier. There is one of these per GA4 property, so the cookie jar is scanned for the pattern rather than a single fixed name.

How identifiers are stored

Converly stores identifiers in first-party cookies in the visitor's browser.

How cookies are scoped

A cookie set on example.com cannot normally be read on app.example.com because, as far as the browser is concerned, those are two separate places.

This presents a problem because it's common for someone to click your ad, land on your marketing site (i.e. example.com), and then convert on a subdomain (like app.example.com). And if the cookie can't be read on the subdomain (i.e. app.example.com) then the click ID can't be retrieved and sent with the conversion.

So Converly sets its cookies across your whole domain rather than on the single subdomain the visitor happened to land on. So if someone clicked your ad and arrived on example.com, then read something on blog.example.com, and finally converted on app.example.com, their click ID follows them the whole way.

To do that, Converly has to work out which web address actually belongs to you. For app.example.com that is example.com. For shop.example.co.uk it is example.co.uk, because co.uk is a shared ending that nobody owns, in the same way nobody owns .com.

There is a published list of those shared endings, and Converly checks your domain against it before setting anything. That is what stops a cookie ever being set wider than the domain you actually own.

How cookies are stored

The cookies are stored under 3 different naming conventions depending on whether we created the cookie, whether it's shared with the platform's own pixel, or whether it's owned entirely by another tag.

NameTypeDescription
_converly_*Our StorageUsed when the platform doesn't store the click identifier in a cookie of its own. For example _converly_gclid for storing the Google Click ID (GCLID) or _converly_ttclid for storing the TikTok Click ID. Namespaced so it cannot collide with anything else on your site.
Platform's own nameSharedUsed when the platform's pixel/tag creates its own cookie. We use this rather than creating our own to ensure there's no mismatch. This includes _fbc & _fbp (Meta Ads) as well as __oppref (ChatGPT Ads).

Each identifier is stored with its own lifetime. Generally speaking, most are kept for 90 days, but our ChatGPT Ads integration follows OpenAI's shorter click window and only stores the identifier for 30 days, whereas the cookies set by another platform's own pixel (such as _ga for Google Analytics) keep whatever lifetime that pixel gave them.

PlatformStored ForDescription
Google Ads90 daysApplies to gclid, gbraid and wbraid.
Meta90 daysApplies to _fbc and _fbp.
TikTok90 daysApplies to ttclid.
Reddit90 daysApplies to rdt_cid.
LinkedIn90 daysApplies to li_fat_id.
ChatGPT Ads30 daysMatches the platform’s own click window. The original capture time is stored separately, so the window stays fixed rather than extending each time the visitor returns.

Campaign parameters (like utm_medium, utm_source, etc) are stored for 90 days, as is the lead's initial landing page and referrer (which are captured on a first-touch attribution basis).

Which identifiers are sent

Each platform accepts a different set of identifiers, and the ones that travel with a conversion are selected at send time from whatever was captured.

PlatformIdentifiers SentDescription
Google Adsone click IDExactly one of gclid, gbraid or wbraid per conversion, with gbraid preferred when both braid identifiers are present. gclid travels with hashed contact details. gbraid and wbraid travel without them, because attaching user data to those two marks the upload as enhanced conversions for leads, which Google does not support for them.
Metaclick ID and browser IDfbc and fbp together in user_data, unhashed, alongside the hashed contact details.
TikTokclick ID and browser IDttclid and ttp together in user, unhashed, alongside the hashed contact details.
Redditclick ID and browser IDrdt_cid as an event-level click_id, and _rdt_uuid as user.uuid.
LinkedInclick ID onlyli_fat_id in userIds, as a LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID entry next to the hashed email.
ChatGPT Adsclick ID and browser IDoppref at the event level and __obref inside the user block. An event-level obref is rejected outright.
GA4client and session IDThe visitor's _ga client identifier and _ga_<stream> session identifier, with gclid passed through as an event parameter.

It's possible for a person to click your ads and visit your website multiple times before converting, and in that case we need to decide which identifiers to send (the identifiers from the first click, the last click, or something in between).

Fortunately, ad platforms and analytics tools document which one they want you to send and we simply follow their requirements.

TypeAttribution ModelDescription
Click identifierslast touchWe send the click identifier from the most recent visit to the website.
Campaign parameterslast touchWe capture and send campaign parameters from the most recent visit to the website. Note these are only sent to analytics tools as ad platforms don't require them.
Landing page and referrerfirst touchWritten once and never overwritten, so how the visitor originally found you is retained alongside what they last clicked.

Similarly, analytics tools like Google Analytics require us to send the Client ID and Session ID with each conversion.

Without it, GA4 has no way to connect the conversion being reported to the website session it happened in. The conversion event still arrives, but because there's no session ID to attach it to, GA4 creates its own session just for this one conversion event. And because it doesn't know what the Source, Medium or Landing Page of that session was, they get recorded as '(not set)'.

To fix this common problem, Converly captures the Client ID and Session ID (assuming the customer has Google Analytics on their website) and sends it over with each conversion.

Limits

There are a couple of limitations worth knowing about:

See also Deduplication for how identifiers interact with a pixel you already have installed, and Normalization and hashing for what happens when no click identifier is present.