Skip to content

Conversation

@tanushree-akamai
Copy link
Contributor

@tanushree-akamai tanushree-akamai commented Dec 29, 2025

Description 📝

Make the EUUID (Enterprise UUID) from the X-Customer-Uuid API response header available to Adobe Analytics via _satellite.track(), including for users with restricted billing access.

Changes 🔄

List any change(s) relevant to the reviewer.

  • EUUID is captured once per session (flag prevents duplicate tracking)
  • EUUID is included in every page view event after capture
  • Works for all authenticated users including restricted billing access

Scope 🚢

Upon production release, changes in this PR will be visible to:

  • All customers
  • Some customers (e.g. in Beta or Limited Availability)
  • No customers / Not applicable

Preview 📷

Screenshot 2025-12-29 at 10 15 04 PM

How to test 🧪

Verification steps

  • Add this to your .env file: REACT_APP_ADOBE_ANALYTICS_URL='https://assets.adobedtm.com/fcfd3580c848/15e23aa7fce2/launch-92311d9d9637-development.min.js'
  • Use the browser tools Network tab, filter requests by "adobe", and check that successful network requests have been made to load the launch script and its extensions.
  • Add a breakpoint in line 28 of useAdobeAnalytics.ts file
  • Reload the page, when the breakpoint is encountered, in the browser console, type _satellite.setDebug(true)
  • You should see Adobe debug log output in the console. Each page view change or custom event that fires should be visible in the logs.
Author Checklists

As an Author, to speed up the review process, I considered 🤔

👀 Doing a self review
❔ Our contribution guidelines
🤏 Splitting feature into small PRs
➕ Adding a changeset
🧪 Providing/improving test coverage
🔐 Removing all sensitive information from the code and PR description
🚩 Using a feature flag to protect the release
👣 Providing comprehensive reproduction steps
📑 Providing or updating our documentation
🕛 Scheduling a pair reviewing session
📱 Providing mobile support
♿ Providing accessibility support


  • I have read and considered all applicable items listed above.

As an Author, before moving this PR from Draft to Open, I confirmed ✅

  • All tests and CI checks are passing
  • TypeScript compilation succeeded without errors
  • Code passes all linting rules

Copy link
Contributor

@jdamore-linode jdamore-linode left a comment

Choose a reason for hiding this comment

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

Hey @tanushree-akamai, having trouble finding a way to test this, but will continue looking into it tomorrow. Feel free to reach out if you have any questions/suggestions! Thanks!

@tanushree-akamai
Copy link
Contributor Author

Hey @tanushree-akamai, having trouble finding a way to test this, but will continue looking into it tomorrow. Feel free to reach out if you have any questions/suggestions! Thanks!

@jdamore-linode : I have elaborated on the testing steps, hope it helps!

@pmakode-akamai pmakode-akamai changed the title feat: [UIE-9805] - Extract EUUID from /profile header and send to Ado… feat: [UIE-9805] - Extract EUUID from /profile header and send to Adobe analytics Dec 30, 2025
@pmakode-akamai pmakode-akamai added the Analytics Relating to Pendo or Adobe Analytics label Dec 30, 2025
* Flag to ensure we only send the EUUID to Adobe Analytics once per session.
* The EUUID doesn't change during a session, so we only need to track it once.
*/
let hasTrackedCustomerUuid = false;
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm NOT too sure, but I wanted to point out that this flag looks to be module-scoped, not session-scoped, so it will reset on page reload (i.e. once per JS runtime load). This could potentially lead to duplicate analytics events

The comment mentions "once per session", but it's unclear to me what 'session' means in this context.
Given that we already store the EUUID itself in module-level state (storedCustomerUuid) for later analytics usage, this seems more aligned with an authenticated session rather than a browser session -- but the current implementation doesn't explicitly tie this to auth boundaries

Is "session" here intended to mean:

  • an authenticated session (login -> logout / token expiration) OR
  • a browser session (tab/window lifetime)?

Depending on the intent we may want to:

  • reset this on auth/token changes OR
  • persist it via sessionStorage rather than keeping it in memory

Could you clarify the intended semantics here?

Copy link
Contributor Author

@tanushree-akamai tanushree-akamai Dec 31, 2025

Choose a reason for hiding this comment

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

Good point. Based on the feedback I have refactored to a cleaner approach that avoids the module-level flag entirely.

Instead of tracking the EUUID via a module-level flag in the interceptor, I now:

Interceptor (injectEuuidToProfile) - Only injects the _euuidFromHttpHeader into the profile response data
useAdobeAnalytics - Reads the EUUID directly from React Query's profile cache via useProfile

This approach:

  • Eliminates module-level mutable state
  • Ties EUUID availability to React Query's cache (automatically cleared on logout/login)
  • Is more consistent with existing patterns in the codebase
  • Makes the session semantics explicit - EUUID is available when profile is loaded, cleared when profile cache is invalidated

@tanushree-akamai tanushree-akamai force-pushed the feature/UIE-9805-euuid-for-adobe-analytics branch from 2ac8885 to 04cab1b Compare December 30, 2025 15:55
@tanushree-akamai tanushree-akamai force-pushed the feature/UIE-9805-euuid-for-adobe-analytics branch from 04cab1b to ce9cfa2 Compare December 30, 2025 15:59
…terceptor level and share it with Adobe analytics through the page view event
@tanushree-akamai tanushree-akamai marked this pull request as ready for review December 30, 2025 16:06
@tanushree-akamai tanushree-akamai requested a review from a team as a code owner December 30, 2025 16:06
Copy link
Contributor

@jdamore-linode jdamore-linode left a comment

Choose a reason for hiding this comment

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

Thanks @tanushree-akamai! I believe I was able to verify this locally, but I'll be sure to take a second look in Staging/Prod when the time comes as well just to be sure.

@linode-gh-bot
Copy link
Collaborator

Cloud Manager UI test results

🔺 3 failing tests on test run #7 ↗︎

❌ Failing✅ Passing↪️ Skipped🕐 Duration
3 Failing867 Passing11 Skipped48m 8s

Details

Failing Tests
SpecTest
search-images.spec.tsCloud Manager Cypress Tests→Search Images » creates two images and make sure they show up in the table and are searchable
timerange-verification.spec.tsCloud Manager Cypress Tests→Integration tests for verifying Cloudpulse custom and preset configurations » should implement and validate custom date/time picker for a specific date and time range
clone-linode.spec.tsCloud Manager Cypress Tests→clone linode » can clone a Linode from Linode details page

Troubleshooting

Use this command to re-run the failing tests:

pnpm cy:run -s "cypress/e2e/core/images/search-images.spec.ts,cypress/e2e/core/cloudpulse/timerange-verification.spec.ts,cypress/e2e/core/linodes/clone-linode.spec.ts"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Analytics Relating to Pendo or Adobe Analytics Ready for Review

Projects

Status: Review

Development

Successfully merging this pull request may close these issues.

4 participants