General News

September 16, 2025

Safari Broke GCLID. Google’s Fixes, Session Attributes, and What Spectacle Is Doing About It

Vincent Gaemers

On this page

Safari broke GCLID. Google broke it more. Now they’re fixing it.

If you’ve been on LinkedIn or Reddit the past weeks, you’ve seen the panic. Safari’s privacy changes made GCLID tracking unreliable. That meant broken attribution pipelines everywhere.

Google’s answer was GBRAID and WBRAID, their “privacy-safe” IDs. The problem? Half of Google’s own stack didn’t work with them. Enhanced Conversions for Leads failed. One-per-click counting failed. Custom variables failed.

Teams like ours spent weeks building workarounds. Dual upload systems. Split pipelines. Documentation full of strange error codes. It wasn’t pretty.

Here are the key conflicts we kept running into:

  • Only one click ID per conversion. If you sent gclid and gbraid together, Google rejected it.
  • Enhanced Conversions couldn’t run with gbraid or wbraid.
  • Custom variables broke if braid parameters were present.
  • One-per-click actions weren’t allowed with braid at all.
  • Duplicate or expired clicks triggered endless retries.

Some of these errors weren’t even in the developer docs. They just happened.

Below we listed all the known conflicts for Google Ads API conversion monitoring, and the ones we encountered. This will be updated once we have received new information. The last update is from the 16th of September 2025

Click ID conflicts

  • gclid + gbraid
    Error: VALUE_MUST_BE_UNSET
    Resolution: Use only one click ID per conversion
  • gclid + wbraid
    Error: VALUE_MUST_BE_UNSET
    Resolution: Use only one click ID per conversion
  • gbraid + wbraid
    Error: GBRAID_WBRAID_BOTH_SET
    Resolution: Use only one click ID per conversion

Enhanced Conversions for Leads

  • gbraid/wbraid + user_identifiers
    Error: The field cannot be set., at conversions[0].user_identifiers
    Resolution: Remove the user_identifiers field when using gbraid/wbraid
  • gbraid/wbraid + Enhanced Conversions for Leads
    Error: VALUE_MUST_BE_UNSET
    Resolution: Enhanced Conversions for Leads cannot use gbraid/wbraid

Conversion action type

  • gbraid/wbraid + one-per-click counting
    Error: Conversion actions that use one-per-click counting can't be used with gbraid or wbraid parameters
    Resolution: Change to MANY_PER_CLICK counting
  • Wrong conversion action type for Enhanced Conversions
    Error: INVALID_CONVERSION_ACTION_TYPE
    Resolution: Ensure the conversion action type is UPLOAD_CLICKS

Custom variables

  • gbraid/wbraid + custom_variables
    Error: VALUE_MUST_BE_UNSET
    Resolution: Remove custom_variables when using gbraid/wbraid

Enhanced Conversions for Web

  • gbraid/wbraid + Enhanced Conversions for Web
    Error: CONVERSION_NOT_FOUND
    Resolution: Enhanced Conversions for Web is not supported with gbraid/wbraid

Temporal conflicts

  • conversion_date_time before click time
    Error: CONVERSION_PRECEDES_EVENT
    Resolution: Set the conversion time after the click time
  • Click older than the lookback window
    Error: EXPIRED_EVENT
    Resolution: Use a conversion action with a longer lookback window

Duplicate conflicts

  • Same order_id for multiple conversions
    Error: DUPLICATE_ORDER_ID
    Resolution: Use unique order IDs
  • Same click ID + conversion time + action
    Error: CLICK_CONVERSION_ALREADY_EXISTS
    Resolution: Adjust conversion_date_time, or verify whether this is a retry
  • Multiple conversions in the same request
    Error: DUPLICATE_CLICK_CONVERSION_IN_REQUEST
    Resolution: Remove duplicates from the request

Account and access conflicts

  • Wrong customer ID for the click
    Error: INVALID_CUSTOMER_FOR_CLICK
    Resolution: Use the customer ID that owns the click
  • Conversion action not found or not enabled
    Error: NO_CONVERSION_ACTION_FOUND
    Resolution: Enable the conversion action in the correct account
  • Customer data terms not accepted
    Error: CUSTOMER_NOT_ACCEPTED_CUSTOMER_DATA_TERMS
    Resolution: Accept the customer data terms

Consent conflicts

  • Setting consent to UNKNOWN
    Error: RequestError.INVALID_ENUM_VALUE
    Resolution: Set it to DENIED if the consent status is unknown

Call conversion conflicts

  • always_use_default_value = false for call conversions
    Error: INVALID_VALUE
    Resolution: Set it to true for WEBSITE_CALL and AD_CALL types

Attribution model conflicts

  • Invalid attribution model
    Error: CANNOT_SET_RULE_BASED_ATTRIBUTION_MODELS
    Resolution: Use only GOOGLE_ADS_LAST_CLICK or GOOGLE_SEARCH_ATTRIBUTION_DATA_DRIVEN

What changed on October 3

Google quietly rolled out support for GCLID + GBRAID together. That’s big. Instead of patching leaks, we can now rebuild for completeness. link

On top of that, a new attribute appeared: session_attributes (support documentation). It gives additional context when click IDs are missing. Think:

  • Campaign source and ID
  • Landing page URL and referrer
  • Session start timestamp
  • User agent

No cookies required. You can capture it with a small JavaScript helper or pipe it into Offline Conversion Import as key/value pairs.

This matters because when GCLID fails, Google’s AI can still model conversions from these rich signals. That means more attributed conversions, better bidding, and a setup that can handle future privacy shifts.

What we’re doing at Spectacle

We’ve been capturing all of these events since 1 August. Every Spectacle account now sends:

  • Click IDs (gclid, gbraid, wbraid)
  • Session attributes for extra context
  • Conversion metadata like order ID and timestamp

All of this flows through server-side conversion tracking. That means cleaner, deduplicated events go straight from your Spectacle account into Google.

The result:

  • Better conversion monitoring — fewer gaps in your reporting.
  • Stronger ad signals — platforms optimise on real outcomes, not partial data.
  • Improved marketing performance — smarter bids, more revenue impact.

For us, this shift has actually made things easier. By sending higher-quality data directly, our pipelines are simpler and our attribution more durable.

Why this matters

The story isn’t just “Safari broke GCLID.” It’s that most conversion architectures were fragile. Google’s fixes (finally) give us tools to build something more durable.

At Spectacle, we’ll keep documenting conflicts and resolutions so our clients don’t have to reinvent the wheel. Next up, we’ll share example code snippets and GTM recipes you can use to capture session_attributes yourself.

Why did Safari break GCLID tracking?

Safari's privacy updates blocked third-party cookies and limited URL parameters, which made GCLID IDs unreliable for conversion tracking.

What are GBRAID and WBRAID in Google Ads?

They are Google's privacy-safe replacements for GCLID on certain browsers. They allow attribution without exposing user-level identifiers.

Why did GBRAID and WBRAID cause conflicts?

Many Google Ads features didn't support braid IDs. Enhanced Conversions for Leads, one-per-click counting, and custom variables all failed when braid parameters were present.

What is session_attributes in Google Ads?

It's a new field that captures privacy-safe session context such as campaign source, landing page URL, timestamp, and user agent, giving more signals when click IDs are missing.

How does Spectacle help with these changes?

Spectacle captures click IDs, session attributes, and conversion metadata server-side. This means marketers send cleaner, more complete events to Google, improving conversion tracking and ad performance.