Skip to content

analytics: report IntentIQ, GrowthCode and TransUnion EID presence, catch LiveIntent's main ID - #357

Open
MO-Thibault wants to merge 4 commits into
Optable:masterfrom
MO-Thibault:mo/analytics-competitor-eids
Open

MO-Thibault wants to merge 4 commits into
Optable:masterfrom
MO-Thibault:mo/analytics-competitor-eids

Conversation

@MO-Thibault

@MO-Thibault MO-Thibault commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Both Prebid analytics add-ons, the V1 prototype (lib/addons/prototypes/analytics.js) and V2 (lib/addons/prebid/analytics.ts), now report which competitor identity vendors put EIDs into each auction, next to the existing LiveIntent field: IntentIQ, GrowthCode and TransUnion.

  • New auction fields intentiqEIDs, growthcodeEIDs and transunionEIDs: the EID sources each vendor delivered, same shape as liveintentEIDs. Per-bidder iiqSources, gcSources and tuSources sit next to liSources.
  • LiveIntent detection now also matches source === "liveintent.com". LiveIntent's main ID carries no ext.provider, so the old filter missed it.
  • The rules live in one COMPETITOR_EIDS table at the top of each file. The two copies are identical.

V2 port

Why

To measure our uplift against what else is enriching the same bid requests, we need to know when a competitor's IDs were present. Until now we could only see LiveIntent's partner IDs.

Detection rules

Vendor Rule Where observed
LiveIntent source === "liveintent.com" or uids[].ext.provider === "liveintent.com" Prebid libraries/liveIntentId/shared.js; Freestar auction
IntentIQ matcher === "intentiq.com" or source === "intentiq.com" Freestar auction (inserter: freestar.com, matcher: intentiq.com, mm: 5); source is what Prebid's intentIqIdSystem emits
GrowthCode inserter, matcher or source is "growthcode.io" essentiallysports.com, si.com, 5 of 7 GrowthCode sites checked
TransUnion source === "neustar.biz" (Fabrick ID, no other tags) Prebid fabrickIdSystem; Freestar sends it to all bidders on 9 of 11 sites checked (reuters, apnews, fortune, aljazeera, ...)

The tags come from each vendor's server, not from their client code, so they were confirmed on live pages. Some publisher wrappers strip inserter (MinuteMedia does on si.com), so each rule also checks matcher or source.

Known gaps

  • When a wrapper strips the tags, IDs GrowthCode relays for other vendors (Acxiom, ID5, Criteo, Epsilon, Xandr) carry no GrowthCode marker and are not counted.
  • LiveIntent's copy of the TTD ID uses the page's domain as ext.provider; not matched here.
  • Fabrick is missing from a new visitor's first auction on Freestar (it resolves after the 100 ms auctionDelay), so transunionEIDs undercounts first auctions.

Overlap with #351

#351 edits the same per-bidder block and witnessData, in V1 and now also V2 (its page object). Whichever merges second needs a small rebase.

Test plan

  • Ran COMPETITOR_EIDS against captured auctions: essentiallysports and si.com return GrowthCode sources only; an excerpt of a Freestar auction returns LiveIntent (liveintent.com, uidapi.com, openx.net) and IntentIQ (adsrvr.org, intentiq.com), with no match on Optable's own EIDs or the native TTD ID; a neustar.biz EID matches only the TransUnion rule
  • V2 tests in lib/addons/prebid/analytics.test.ts (3 new): LiveIntent's main ID matched by source, IntentIQ/GrowthCode/TransUnion per bidder and at the auction level (including each rule's inserter/matcher/source variants), and no match on Optable's own EIDs
  • pnpm test (583 passed after the master merge); pnpm build-lib passes; prettier --check clean
  • After deploy, confirm intentiqEIDs, growthcodeEIDs and transunionEIDs appear in auction_processed (V1) and optable.prebid.auction (V2) events for a tenant known to run each vendor

🤖 Generated with Claude Code

…ent's main ID

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@MO-Thibault
MO-Thibault requested review from a team as code owners October 4, 2026 15:27
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@MO-Thibault MO-Thibault changed the title analytics: report IntentIQ and GrowthCode EID presence, catch LiveIntent's main ID analytics: report IntentIQ, GrowthCode and TransUnion EID presence, catch LiveIntent's main ID Oct 4, 2026
intentiq: (e) => e.matcher === "intentiq.com" || e.source === "intentiq.com",
growthcode: (e) => e.inserter === "growthcode.io" || e.matcher === "growthcode.io" || e.source === "growthcode.io",
transunion: (e) => e.source === "neustar.biz",
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can make this accept a param from wrappers so we don't have to constantly update this if new ones are on a page for certain tenants. Not blocking

Port the COMPETITOR_EIDS rules from the V1 add-on to V2: per-bidder
iiqSources, gcSources and tuSources, and auction-level intentiqEIDs,
growthcodeEIDs and transunionEIDs. LiveIntent detection in V2 now also
matches source === "liveintent.com", so its main ID is no longer missed.

Rules run on the EIDs before the source dedupe, like the existing V2
LiveIntent check.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants