How AdPix identifies visitors
Every event attaches to an anonymous id, that id attaches to a site user, and the site user attaches to a global user. Those three layers are what the Users metric counts in every report.
Three layers, not one#
The AdPix identity graph always has this shape, and it does not change:
anonymous → site user → global user.
- Anonymous is a random id kept in the browser (
__sov_didand__sov_aid). Every event that happens before the visitor signs in attaches to it. - Site user is the same person, but only within one property. When a real signal turns up — a login, an email, a phone number, a CRM client id — the anonymous id is linked to a site user.
- Global user is the same person across every property and every domain in your organization. This is the layer that lets you follow one person from an ad to a purchase on a different domain — provided that domain is listed in the stream's cross-domain settings.
Between the layers sit edges. Every edge is a piece of evidence, and every piece of evidence carries a confidence.
The global user belongs to your organization and never leaves it. AdPix does keep one layer above it that connects the same person across separate businesses — on shared email evidence only, never on a guess — but only AdPix platform administrators can read it. No report in your console ever shows another business's data.
Deterministic versus probabilistic#
This is the only distinction you need to hold on to, because every behaviour of the system follows from it.
| Edge | Where it comes from | Kind | Confidence | Lifetime |
|---|---|---|---|---|
explicit_identify |
an ap('identify', …) call, a login form submit, or a server-to-server identify |
deterministic | 1.00 |
permanent |
email_bridge |
an email address two users have in common | deterministic | 1.00 |
permanent |
phone_bridge |
a phone number two users have in common | deterministic | 1.00 |
permanent |
fp_* |
a browser fingerprint | probabilistic | 0.89 at most |
30 days |
A deterministic signal means the visitor told you something — either by signing in through the browser, or through the client id your CRM sends server-side. A probabilistic signal means the system inferred it from a browser fingerprint.
The deterministic line is a confidence of 0.90. A fingerprint edge is promoted a little each time it is seen again, but it is hard-capped at 0.89 and never crosses that line. So a fingerprint can only attach an anonymous id to a user that is already deterministically resolved; it can never undo a decision made by a real sign-in. fp_* edges also expire after 30 days and are deleted before the nightly reconciliation, so they take no part in any stitch after that.
What happens to events from before the sign-in#
This is the part that gets misread most often. Events recorded before identification are not rewritten. The event row in the analytical store is left exactly as it was.
Instead, at read time an override table is joined onto the events and returns the real global user. So the visit that was anonymous yesterday shows up under the visitor's name today — after they signed in — without a single byte of raw data changing.
Two practical consequences:
- The journey from the first anonymous visit to the purchase is complete.
- Channel attribution stays correct, because the first touch was never erased.
What you control#
Auto-identify on forms is on by default — when a form carrying a filled email or mobile field is submitted, that value is taken as a deterministic signal. Only that field is read; passwords and every other field never are.
If you would rather be explicit, call it yourself:
ap('identify', 'user_8421', { email: 'ali@example.com' });
ap('identify', 'user_8421', { phone: '09121234567' });
The phone number is normalised to the international format with the property's default calling code before it is hashed, so 09121234567 and +989121234567 reach the same user.
Passing your own internal user id as the first argument keeps a person's history intact even when they change their email address. Put the email and phone in the second argument so they are used as deterministic bridges.
Once a night, everything is reconciled#
A nightly job recomputes the connected components over every edge and merges duplicate global users into one. The oldest id wins.
Every merge is written to the merge history and is reversible — if two people turn out to have been joined by mistake, they can be split back out. An identity's version only ever increases and is never reused, so downstream consumers can always tell that something changed.
The identity model is a frozen surface; changing it takes a written architecture decision, not a patch.
Where you see this in the console#
No screen is called "the identity graph". You see its effects elsewhere — the user count on Home, the length of a journey in the Path report, and the conversion rate that becomes more truthful once identification is live on your site. If you have not installed the tag yet, start at install the measurement tag.
Frequently asked questions#
Why do users and sessions not line up?
One user can have dozens of sessions, and a session never belongs to two users. If the sessions-per-user ratio jumps, it usually means cookies are being cleared or your domains are not linked - not that traffic actually grew.
What happens when someone signs in with two email addresses?
Both emails are deterministic signals, so both site users resolve to one global user and the merge is written to the merge history. From then on the reports show one person, not two.
Does clearing cookies destroy a user's history?
No. The identity cookie only holds the anonymous id; the history lives on the AdPix side. As soon as the visitor signs in or is identified again, the new anonymous id attaches to the same global user and the events in between come back with it.
Does identification happen without consent?
No. Identify follows the same statistics category that page views and events follow. Under opt-in, no cookie is minted and no event is sent until the visitor accepts.
Thanks — your feedback helps us improve the docs.