The problem it solves
Without identity resolution, one person looks like a crowd: they browse anonymously on mobile, sign up on desktop, and return a week later on a third device — four “visitors” that are really one customer. Every funnel and retention report is distorted, because the journey is split across disconnected anonymous IDs. Identity resolution stitches those fragments back into a single person.
Anonymous to known
A visitor starts anonymous, identified only by a device or cookie ID. When they sign in — or you call
identify() with a stable user ID — the tool links the anonymous history to that known person, and
everything they did before sign-up is retroactively attributed to them. Events
from before and after the moment of identification line up on one timeline.
Deterministic vs probabilistic
There are two broad approaches. Deterministic resolution links events through a shared, known
identifier — the user ID you pass to identify(), or a matching email. It’s exact.
Probabilistic resolution infers that two devices belong to the same person from signals like IP
address, device fingerprint, and behavior — a best guess, used by some large customer-data platforms to merge
activity without a shared login. Deterministic matching is more accurate and more privacy-respecting; probabilistic
trades certainty for reach.
Identity resolution in a CDP vs in analytics
Customer-data platforms like Segment build a persistent identity graph to merge a person’s activity across every tool and channel, then route it onward. Product analytics tools resolve identity for a narrower purpose: so the behavioral reports are about people, not sessions. If what you actually want is the analysis on a unified profile — not a routing layer — see Pug as a Segment alternative.
A worked example
A visitor browses anonymously for a week (anonymous ID anon_88), firing page_view and
add_to_cart. They sign up and you call identify('user_42'). Deterministic resolution
aliases anon_88 → user_42, so the pre-signup cart is now attributed to the known person. Their next
session on a different device — where you call identify('user_42') again after login — joins the same
profile. One shared key does all the stitching; nothing is guessed.
How Pug resolves identity
Pug merges deterministically: anonymous events collected before sign-in are joined to a single
person when you call identify() with a stable ID, across devices and sessions. Traits like plan, email,
or company then live on that unified profile and filter every
insight — trends, funnels, retention, and flows. There’s no probabilistic guessing. See
user analytics for what the resolved profile looks like.