Skip to content

IntentIQ Identity module: server-side identity resolution - #4548

Open
Bengo7918 wants to merge 3 commits into
prebid:masterfrom
Bengo7918:intentiq-identity-module
Open

Bengo7918 wants to merge 3 commits into
prebid:masterfrom
Bengo7918:intentiq-identity-module

Conversation

@Bengo7918

Copy link
Copy Markdown

🔧 Type of changes

  • new bid adapter
  • bid adapter update
  • new feature
  • new analytics adapter
  • new module
  • module update
  • bugfix
  • documentation
  • configuration
  • dependency update
  • tech debt (test coverage, refactorings, etc.)

✨ What's the context?

Adds the intentiq-identity module — a server-side identity-resolution hook. At the
processed-auction-request stage it calls the IntentIQ Bid Enhancement S2S API and merges the
resolved IDs into user.eids before the request is sent to bidders. Optionally, at the
auction-response stage it reports winning bids as impressions to a reporting endpoint.

The module includes an optional two-layer cache (Caffeine L1 + a pluggable IdentityStore L2,
Redis by default) with multi-key alias caching, negative caching, and in-progress dedup, plus
per-module custom metrics. Configuration and behavior are documented in the module README.

🧠 Rationale behind the change

Publishers using IntentIQ want server-side ID enrichment without shipping/licensing device
detection to the client. Implemented as a standard PBS module using the hooks framework (no direct
HTTP; uses the framework HttpClient). The L2 store is @ConditionalOnMissingBean, so partners can
swap Redis for their own backend or disable caching entirely. Device detection stays fully
server-side. Trade-off: winning bids are reported server-side rather than as true client renders.

🧪 Test plan

Unit-tested across the module (120 tests) covering the resolution hook, response/impression hook,
caching (L1/L2, negative, in-progress, alias back-fill), TTL policy, metrics, Redis store/stats,
and Spring config. JaCoCo: 97% instruction coverage, no class below 90%. Verified locally with
mvn -f extra/pom.xml -pl modules/intentiq-identity clean test checkstyle:check — all green,
0 checkstyle violations. Also smoke-tested the bundle per the README "Running the demo" steps.

🏎Quality check

  • Are your changes following our code style guidelines?
  • Are there any breaking changes in your code? — No; new module, opt-in via execution plan.
  • Does your test coverage exceed 90%?
  • Are there any erroneous console logs, debuggers or leftover code in your changes? — None.

@Net-burst
Net-burst requested review from And1sS and Net-burst July 30, 2026 20:44
@osulzhenko

Copy link
Copy Markdown
Collaborator

@Bengo7918 please resolve conflicts

@Bengo7918
Bengo7918 force-pushed the intentiq-identity-module branch from 7876272 to 8e552f7 Compare August 19, 2026 12:05
@Bengo7918

Copy link
Copy Markdown
Author

@osulzhenko conflicts resolved :)

@osulzhenko

Copy link
Copy Markdown
Collaborator

@Bengo7918 please update your PR, resolve the merge conflicts, and keep only your commits

@Net-burst

Copy link
Copy Markdown
Collaborator

@Bengo7918 hello. Kind reminder about the PR. Please clean the PR up because it contains commits that are already present in our main branch. We can't review it unless this is fixed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Bengo7918
Bengo7918 force-pushed the intentiq-identity-module branch from 60fd005 to 42511e2 Compare November 10, 2026 19:28
@Bengo7918

Copy link
Copy Markdown
Author

@osulzhenko @Net-burst updated :) The branch is rebased onto the latest master, the conflicts are resolved, and the PR now contains only the IntentIQ Identity module commit (37 files, module + sample config + module/bundle pom entries).

Bengo7918 and others added 2 commits November 12, 2026 23:33
- Parse abTestUuid from the API response (the snake_case mapper read it as ab_test_uuid, so it was always null).
- Keep abTestUuid and tc in cache entries, so reports of cache-served auctions carry them.
- Treat a non-2xx API answer as an error instead of caching "no ids".
- Remove the in-progress marker when a call fails, so the next request retries; default its TTL to 30s.
- Bound L2 reads with cache.l2-timeout-ms, so a hung Redis falls through to the API.
- Redis: configurable pool size and wait queue (defaults 32 / 1024), TLS, username, password set as an option.
- Report only the highest bid per impression, with its own reports-timeout; count non-2xx reports as errors.
- Do not add a resolved eid whose source the request already carries.
- Ignore an all-zero device.ifa for pcid and cache keys.
- Skip the call when partner-id is blank, or when gdpr=1 without a consent string.
- Sample failure logs at 1% without stack traces.
- Sample config boots on PBS 4.5 (gdpr.vendorlist.live.startup-cache-dir).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Scope cache keys by partner-id and a digest of the request's privacy signals (gdpr, consent,
  us_privacy, gpp): no cross-partner sharing, and a changed consent or opt-out is resolved again.
- Use the IP/UA device composite only when the request has no stronger id, and leave an lmt=1 ifa out of it.
- Skip the impression report without a partner-id, or when GDPR applies without consent.
- Concurrent requests for the same user on one instance share one cache lookup and API call,
  so they are enriched and A/B-attributed too.
- Cache the normalized user agent (Caffeine) instead of parsing it on every auction.
- README: cache settings other than cache.enabled are host-level.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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