Atribu
Concepts

Identity Resolution

How Atribu connects anonymous visitors to real customers across devices and channels

Identity resolution is how Atribu connects the dots between an anonymous website visitor and a known customer who pays you.

Identity resolution — from anonymous visitor to known customer
Loading diagram...

The problem

Your customer's journey is fragmented:

  1. They click a Facebook ad on their phone
  2. They visit your site, browse pricing, and leave
  3. Two days later, they search your brand name on Google from their laptop
  4. They fill out your contact form
  5. A week later, they pay via Stripe

Without identity resolution, these look like 5 separate events from 3 different people. With it, Atribu knows it's one person — and attributes the payment back to the original Facebook ad.

How it works

Anonymous visitor arrives

When someone visits your site, Atribu assigns them a Visitor ID (called anonymous_id). This ID is stored in their browser and stays the same across all their visits on that device.

Visitor identifies themselves

When the visitor fills out a form, books an appointment, or logs in, Atribu's identify() function fires with their email (or phone). This creates a customer profile that links their Visitor ID to their real identity.

Server-side events match

When a payment arrives from Stripe with the same email, or a deal is created in GoHighLevel for the same contact, Atribu matches it to the existing customer profile. The full journey — from ad click to payment — is now connected.

The identity graph

Atribu builds an identity graph for each customer:

Identifier TypeExampleSource
Email[email protected]Form fill, Stripe payment
Phone+1-555-0123Form fill, GHL contact
Visitor IDabc123-def456Browser cookie
Stripe Customer IDcus_abc123Stripe payment
GHL Contact IDcontact_xyzGoHighLevel sync

All identifiers point to the same customer profile. Any future event with any of these identifiers gets linked to the same person.

Identifier priority

When resolving who a person is, Atribu uses this priority:

  1. Email (strongest match)
  2. Phone number
  3. External IDs (Stripe customer ID, GHL contact ID)

Names are used for display only — never for matching (too many "John Smith"s).

Safe to call repeatedly

The identity resolution system uses "COALESCE" logic — calling identify() multiple times with new data backfills missing fields without overwriting existing ones. If a customer first gives their email, then later their phone, both are stored.

Why identify() is critical

Without identify(), attribution breaks

If a visitor never identifies themselves (no form fill, no booking, no login), their ad click and page views are tracked — but they can never be connected to a Stripe payment or CRM event. The payment shows up as "unattributed."

Make sure every conversion point on your site triggers identification:

  • Forms: Atribu auto-captures these (no code needed)
  • Booking widgets: GHL, Calendly, Cal.com auto-captured
  • Custom flows: Call window.atribuTracker.identify({ email: "..." }) manually

See Identify Users for implementation details.

On this page