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.
The problem
Your customer's journey is fragmented:
- They click a Facebook ad on their phone
- They visit your site, browse pricing, and leave
- Two days later, they search your brand name on Google from their laptop
- They fill out your contact form
- 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 Type | Example | Source |
|---|---|---|
| [email protected] | Form fill, Stripe payment | |
| Phone | +1-555-0123 | Form fill, GHL contact |
| Visitor ID | abc123-def456 | Browser cookie |
| Stripe Customer ID | cus_abc123 | Stripe payment |
| GHL Contact ID | contact_xyz | GoHighLevel 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:
- Email (strongest match)
- Phone number
- 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.