Tracking & Attribution

How Do You Capture gbraid and wbraid?

gbraid and wbraid exist only on the landing page URL. How to capture them, persist them through a funnel, and still have them at offline upload.

Quick answer

Capture `gbraid` and `wbraid` from the URL on the landing page, store them server-side against the visitor, and carry them onto the lead record so they're still there when you upload the offline conversion weeks later. They are Google's iOS-era click identifiers, appearing in place of `gclid`, and they exist only in the URL of the first page view — which is why multi-step funnels, iframes and redirects lose them.

Tell us what's broken. We'll fix your tracking — free.

Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.

Capture gbraid and wbraid from the URL on the landing page, store them server-side against the visitor, and carry them onto the lead record so they are still present when you upload the offline conversion weeks later.

They are Google’s iOS-era click identifiers, and they appear in place of gclid on clicks where Google can’t set one. The definitional part of this topic is well covered elsewhere. The part that breaks in production — keeping the identifier alive from a landing page, through a multi-step form, onto a CRM record, until an upload three weeks after the click — is barely covered at all, and it’s the only part that determines whether your offline conversions actually attribute.


What are gbraid and wbraid?

Google click identifiers that appear when gclid can’t be used, introduced in response to Apple’s App Tracking Transparency framework.

  • gclid — the long-standing Google Click Identifier, appended to ad destination URLs by auto-tagging.
  • gbraid — used for app-to-web journeys on iOS: the click starts in an app and lands on your website.
  • wbraid — used for web-to-web journeys on iOS, where privacy restrictions prevent a gclid being set.
  • gad_source — a separate parameter identifying which Google surface the click came from. Useful context, not a substitute for a click ID.

The practical points matter more than the taxonomy. They are mutually exclusive: a given click carries gclid, or gbraid, or wbraid — not several. They are aggregated rather than individual by design; gbraid and wbraid support modelled, privacy-preserving attribution rather than tying a conversion to one identifiable user. And on a mobile-heavy account, a large share of Google clicks arrive with one of the braid parameters rather than a gclid — so a system that only looks for gclid is quietly blind to a substantial slice of paid traffic.

That last point is the reason this matters operationally. If your form captures gclid and nothing else, you haven’t built partial coverage; you’ve built coverage that fails hardest on exactly the device class where it costs most.


Where do click IDs actually get lost?

In the gap between the landing page and the conversion record — and there are five common places.

1. Only the landing page has the parameter. The click ID exists in the URL of the first page view. Navigate to a second page and it’s gone, unless something captured and stored it. This is the root cause behind everything below.

2. Multi-step forms lose it between steps. A funnel that moves through several pages or several form steps drops the query string on the first transition. The lead record is written at the end of that sequence, by which point the parameter has been gone for four page views.

3. Iframed forms never see it at all. Form platforms embedded in an iframe have their own URL, which is not your landing page URL. Code running inside the iframe reads the iframe’s parameters — of which there are none — rather than the parent page’s.

4. Redirects strip the query string. Link shorteners, geo-redirects, A/B testing tools and poorly configured 301s can forward a visitor without forwarding the parameters. Each hop is an opportunity for the click ID to be dropped.

5. The conversion happens days later, off-site. A lead is qualified by a salesperson, closes in a CRM, and gets uploaded as an offline conversion three weeks after the click. The click ID has to have survived not just the session but the entire sales cycle, attached to the right record.

Notice that none of these are tracking bugs. In every case the tag fired correctly and the click ID was genuinely present at the moment of arrival. The failure is one of persistence, not capture — which is why “make sure you have auto-tagging enabled” is such unsatisfying advice. Auto-tagging was already enabled. The parameter arrived. It just didn’t survive the journey to the record that needed it.

An ad click arriving with its identifier, which is then dropped at a multi-step form, an iframe boundary and a redirect before the conversion record is written


How do you persist a click ID through a funnel?

Capture on arrival, store it somewhere that outlives the page, and attach it to the record at write time.

Capture on the landing page, first thing. Read the query string on the first page view, before any navigation. Take all four parameters — gclid, gbraid, wbraid, gad_source — rather than only the one you expect.

Store first-touch, and don’t let later visits overwrite it. The click ID belongs to the visit that caused the journey. A visitor who returns directly a week later should not blank the identifier that explains where they came from.

Store it server-side, not only in the browser. A hidden form field works only if the visitor completes that specific form in that specific session. A server-side record against a durable visitor ID survives navigation, new sessions, and the gap between a form fill and a sale weeks later.

Handle the iframe case explicitly. If your form is embedded, the parent page has to pass the parameters down or the form has to ask for them. Nothing inside the iframe can read the parent’s URL on its own.

Attach it to the lead record, not just the session. The offline upload operates on lead records. A click ID sitting in an analytics session that nobody can join to a CRM row is not going to attribute anything.


What do you need for the offline conversion upload?

A click identifier, a conversion name, a conversion time and a value — with the click ID being the part that has to have survived.

Two things are worth knowing before you build this.

The identifiers aren’t interchangeable at upload. A conversion recorded against a gbraid click is uploaded as a gbraid conversion. You can’t substitute a gclid you don’t have, and you can’t merge them into one column. Whatever you capture, you have to carry through with its type intact.

There’s a conversion window, so latency matters. Offline conversions must be uploaded within the window Google accepts for the click; an upload that arrives too late is rejected rather than attributed. On long sales cycles this is a real constraint, and it argues for automating the upload rather than running it monthly by hand. Check Google’s current published window before designing around any particular figure — it has changed, and it differs between conversion types.

Enhanced conversions for leads is the complement, not the replacement. Where a click ID didn’t survive, hashed customer data — email, phone — can still let Google match the conversion. It’s a genuinely useful second path, and it has its own requirement: the hashing has to be done on properly normalised values, or it matches nothing. The two mechanisms cover different failure modes, and accounts that are serious about lead attribution run both.


How does PartialLeads persist Google click IDs?

By capturing all four Google parameters at first touch, holding them server-side against a durable visitor identity, and carrying them onto the lead record so they’re still present when the conversion uploads.

All four parameters captured, not just gclid. The tag reads gclid, gbraid, wbraid and gad_source from the landing-page URL, alongside UTM parameters and the click IDs for the other ad platforms. Capturing the braid parameters is what keeps mobile-heavy Google traffic from silently falling out of attribution.

Attribution captured from the URL, with a referrer fallback. Where the URL carries no parameters at all, the referrer is used instead — which is what makes attribution work on embedded forms whose own URL is bare.

Iframe boundaries handled by design. The tag listens for attribution passed in from a parent frame and broadcasts parameters down into iframes, so a form embedded in a funnel builder or a form platform still receives the click ID the parent page arrived with.

Stored server-side against a durable visitor ID. The visitor identifier lives in localStorage with a first-party cookie backup, and the cookie is set by the server rather than by script — so Safari’s seven-day cap on script-written cookies doesn’t apply. The click ID outlives the session that carried it.

First-touch and last-touch both written per conversion. Every matched purchase writes both rows, snapshotting the click IDs, UTM parameters, referrer and landing page. The identifier that explains the journey isn’t overwritten by a later direct visit.

Carried across the identity cluster. Sessions are unioned into one person across six tiers, so a conversion recorded weeks later inherits the click ID from the earlier session that actually carried it — including when that session was on a different device.

Upload-side normalisation handled centrally. For the hashed-data path, email is lowercased and trimmed with Gmail dot-and-plus normalisation applied before hashing, and phone is converted to E.164 with a country-code fallback derived from the session’s geography. This is unglamorous and it is the difference between a hashed identifier that matches and one that silently doesn’t.

Honest boundaries. Three. gbraid and wbraid are aggregated identifiers by design — they support modelled attribution rather than user-level certainty, and no tool changes that. Google Ads conversions are delivered through a scheduled upload rather than a real-time server-to-server API, so attribution appears on Google’s timetable rather than within seconds. And a click ID that never reached your site — stripped by a redirect before arrival — cannot be recovered by anything downstream; the hashed-data path is the fallback for that case, not a way of reconstructing the identifier.

A click identifier captured on the landing page, held server-side against a durable visitor while later sessions arrive, carried onto the lead record, and still present at the offline upload weeks later

Problem PartialLeads mechanism Where you see it working
Only gclid captured, braid traffic invisible All four Google parameters read at first touch Click ID present on iOS-origin sessions
Parameter gone after the first page view Stored server-side against the visitor, not in the page Attribution on leads that converted pages later
Iframed form never sees the parameters postMessage relay into the frame, referrer fallback Correct source on embedded-form leads
Click ID lost before a sale weeks later Durable server-set visitor cookie plus first-touch snapshot First-touch click ID on the converted lead
Conversion happens on another device Six-tier identity cluster supplies the earlier session’s click ID Journey ribbon spanning sessions
Hashed identifiers match nothing Gmail dot/plus normalisation, E.164 phone, before hashing Matched offline conversions
Later direct visit overwrites the source First-touch and last-touch rows written separately Both models shown side by side

Tell us what's broken. We'll fix your tracking — free.

Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.

Sources

  1. Google Ads Help — About auto-tagging: https://support.google.com/google-ads/answer/3095550
  2. Google Ads Help — About attribution models: https://support.google.com/google-ads/answer/6259715
  3. Microsoft Learn — Offline conversions (ConversionTime and windows): https://learn.microsoft.com/en-us/advertising/campaign-management-service/offlineconversion
  4. Wikipedia — E.164 international telephone numbering plan: https://en.wikipedia.org/wiki/E.164

Frequently asked questions

QWhat's the difference between gclid, gbraid and wbraid?
`gclid` is the long-standing Google Click Identifier. `gbraid` and `wbraid` are the iOS-era alternatives introduced for privacy reasons: `gbraid` for app-to-web journeys, `wbraid` for web-to-web ones where a `gclid` can't be set. A click carries exactly one of the three. The braid parameters are aggregated rather than user-level, so they support modelled attribution rather than tying a conversion to an individual.
QWhy is there no gclid on my iOS traffic?
Because on those journeys Google issues a braid parameter instead. This is expected behaviour, not a tagging fault — auto-tagging is working, it's just producing a different identifier. If your capture logic looks for `gclid` specifically, that traffic will appear to have no click ID at all, which on a mobile-heavy account can mean a large share of paid clicks silently drop out of attribution.
QCan I convert a wbraid into a gclid?
No. They are separate identifier types issued for different journey types, and there's no mapping between them. A conversion recorded against a `wbraid` click is uploaded as a `wbraid` conversion. Any workflow that assumes one identifier column will break on the traffic it most needs to handle — the right design carries the type alongside the value.
QHow long do I have to upload an offline conversion?
There's a window, it's finite, and you should check Google's current published figure rather than trust a number from an article — it has changed over time and it varies by conversion type. The operational implication is stable regardless of the exact value: on long sales cycles, uploads should be automated and frequent rather than batched monthly, because a conversion that arrives after the window is rejected rather than attributed.
QDo I need enhanced conversions for leads if I'm capturing click IDs?
They solve different failure modes, so running both is the sensible default. Click IDs attribute the clicks you successfully captured and persisted. Enhanced conversions for leads uses hashed customer data to match conversions where the click ID didn't survive — a stripped redirect, an unhandled iframe, a device switch. Neither covers the other's gap, and the hashed path only works if values are normalised correctly before hashing.
QWhere should I store the click ID — a cookie or a hidden form field?
Server-side against a durable visitor identifier, with a hidden field as a convenience rather than the system of record. A hidden field only works if the visitor completes that specific form in that specific session; it doesn't survive a multi-step funnel, a return visit, or a sale that closes in a CRM weeks later. A first-party cookie set by the server survives considerably longer than one written by JavaScript.
QDoes gad_source replace the click ID?
No. `gad_source` identifies which Google surface the click came from, which is useful context for reporting, but it isn't a click identifier and it can't be used to upload an offline conversion. Capture it — it costs nothing and it helps explain your traffic mix — but don't let its presence make you think you have attribution when the actual click ID is missing.

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.