Tuesday, September 16, 2025

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

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.

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

Conflict Type

Conflicting Fields/Values

Error Message

Resolution

Click ID Conflicts

gclid

+

gbraid

VALUE_MUST_BE_UNSET

Use only one click ID per conversion

gclid

+

wbraid

VALUE_MUST_BE_UNSET

Use only one click ID per conversion

gbraid

+

wbraid

GBRAID_WBRAID_BOTH_SET

Use only one click ID per conversion

Enhanced Conversions for Leads

gbraid

/

wbraid

+

user_identifiers

The field cannot be set., at conversions[0].user_identifiers

Remove

user_identifiers

field when using gbraid/wbraid

gbraid

/

wbraid

+ Enhanced Conversions for Leads

VALUE_MUST_BE_UNSET

Enhanced Conversions for Leads cannot use gbraid/wbraid

Conversion Action Type

gbraid

/

wbraid

+ One-per-click counting

Conversion actions that use one-per-click counting can't be used with gbraid or wbraid parameters

Change to

MANY_PER_CLICK

counting

Wrong conversion action type for Enhanced Conversions

INVALID_CONVERSION_ACTION_TYPE

Ensure conversion action type is

UPLOAD_CLICKS

Custom Variables

gbraid

/

wbraid

+

custom_variables

VALUE_MUST_BE_UNSET

Remove

custom_variables

when using gbraid/wbraid

Enhanced Conversions for Web

gbraid

/

wbraid

+ Enhanced Conversions for Web

CONVERSION_NOT_FOUND

Enhanced Conversions for Web not supported with gbraid/wbraid

Temporal Conflicts

conversion_date_time

before click time

CONVERSION_PRECEDES_EVENT

Set conversion time after click time

Click older than lookback window

EXPIRED_EVENT

Use conversion action with longer lookback window

Duplicate Conflicts

Same

order_id

for multiple conversions

DUPLICATE_ORDER_ID

Use unique order IDs

Same click ID + conversion time + action

CLICK_CONVERSION_ALREADY_EXISTS

Adjust conversion_date_time or verify if retry

Multiple conversions in same request

DUPLICATE_CLICK_CONVERSION_IN_REQUEST

Remove duplicates from request

Account/Access Conflicts

Wrong customer ID for click

INVALID_CUSTOMER_FOR_CLICK

Use correct customer ID that owns the click

Conversion action not found/enabled

NO_CONVERSION_ACTION_FOUND

Enable conversion action in correct account

Customer data terms not accepted

CUSTOMER_NOT_ACCEPTED_CUSTOMER_DATA_TERMS

Accept customer data terms

Consent Conflicts

Setting consent to

UNKNOWN

RequestError.INVALID_ENUM_VALUE

Set to

DENIED

if consent status unknown

Call Conversion Conflicts

always_use_default_value

= false for call conversions

INVALID_VALUE

Set to true for WEBSITE_CALL/AD_CALL types

Attribution Model Conflicts

Invalid attribution model

CANNOT_SET_RULE_BASED_ATTRIBUTION_MODELS

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.