Who should read this: Everyone on the team — engineers, interns, product, QA
Level: No prior analytics knowledge needed
Last updated: 2026-06-12
When a user visits our website and clicks a button, loads a page, or buys something — we want to know about it.
We send that information to Adobe Analytics so our business can see things like:
This data helps us make decisions. If the data is wrong, the decisions are wrong.
Think of it like this:
window.digitaldata.Simple in theory. The problem is how we got here.
We started with one app (Search), one country (US), one team.
We added analytics and it worked fine.
We added PDP, Home, Cart, Checkout.
We added Ford Protect plans for South Africa.
We added Lincoln brand support.
We added parts, chargers, merchandise.
Different teams worked on different parts.
Every time a new app or feature needed analytics, the team added it in their own way.
Nobody stopped to say "let's make one unified system."
Now we have multiple approaches running at the same time, and they conflict with each other.
When a user clicks something, the analytics code can take 5 different paths depending on which app they are in:
All 5 paths write to the same shared box (window.digitaldata).
Imagine 5 people all trying to fill in the same form at the same time without talking to each other. That is what is happening.
Inside the NVC apps, there is still a fork in the road:
ford/plans/South Africa/English → uses the newer "registry" approachSame user action. Same button. Different payload shapes depending on where in the world the user is.
This means our South Africa data and our US data are structured differently for the same event.
The shared box (window.digitaldata) can be either:
If Team A writes page information, then Team B fires their event in replace mode, Team A's data disappears.
Adobe then receives incomplete data. Nobody gets an error. The data just quietly vanishes.
Right now, the data is built, put in the box, and sent to Adobe.
There is no check that says "wait, is this correct?" before it leaves the browser.
The only real check we have is our Playwright E2E tests — which run at the very end of the development process.
By that point, the code has already been written, reviewed, merged, and tested. Finding a bug here is very expensive.
It is like proofreading a letter after it has already been mailed.
Our analytics team gives engineers a PV (specification document) that says which data fields to send and what values to use.
Engineers read this and write the code manually.
A tiny mistake like writing page.section instead of page.siteSection sends wrong data to Adobe.
TypeScript cannot catch this because the data object accepts any key name.
The wrong field arrives silently. Reports are wrong. Nobody knows why.
A real week in our life:
| Day | What happened |
|---|---|
| Monday | Analytics team delivers a new PV for a checkout event |
| Tuesday | Two teams implement it slightly differently |
| Wednesday | A shared analytics library change is deployed |
| Thursday | PDP analytics for a different country stops working |
| Friday | Incident raised — three teams needed to investigate |
| Next week | A patch is added — system is now slightly more complex |
This cycle repeats every few sprints. We spend more time fixing than building.
We want one system that:
| Today | What we want |
|---|---|
| 5 different paths | 1 unified path |
| Data can be accidentally deleted | Data is always safely merged |
| No check before sending | Every event validated before send |
| New country = code change + deployment | New country = config change only |
| PV manually translated, errors happen | Contract generated from PV automatically |
| Bug found in E2E or production | Bug caught in developer's editor or CI |
useAnalyticsClickEvents, useAnalyticsLoadEvents) — do not call _satellite directlysend was called| Question | Who to ask |
|---|---|
| What fields does this event need? | Analytics / Product Analytics team |
| How do I wire the analytics hook? | Your tech lead or senior engineer |
| Why is the data wrong in reporting? | Analytics platform team |
| Can we add a new market or brand? | Analytics platform team |
Document maintained by: NVC Platform Architecture Team
Last updated: 2026-06-12