Identify Users
Connect anonymous website visitors to real people for full attribution
Identify Users
The identify() function is the most important part of Atribu's tracking. It connects an anonymous website visitor to a real person -- and that connection is what makes attribution possible.
Why identification matters
Without identification, Atribu sees two disconnected worlds:
- Website side: An anonymous visitor clicked a Facebook ad, viewed 3 pages, and left
- Business side: Jane Smith paid $500 through Stripe
The identify() call bridges this gap. Once a visitor is identified (usually through a form fill), Atribu can trace the entire journey from ad click to payment.
How it works
Visitor clicks an ad
A potential customer clicks your Facebook ad and lands on your website. Atribu assigns them an anonymous_id -- a random identifier tied to their device.
Visitor fills out a form
The visitor fills out a contact form with their email. The tracker automatically calls identify({ email: "[email protected]" }).
Atribu creates a customer profile
Behind the scenes, Atribu creates a customer profile that links the anonymous_id to the email address. The visitor is no longer anonymous -- they are Jane Smith.
A payment arrives later
When Stripe sends a payment event for [email protected], Atribu looks up the customer profile, finds the linked anonymous_id, and traces it back to the original ad click. Full attribution is achieved.
Automatic identification
In most cases, you do not need to call identify() yourself. Atribu's auto-capture handles it for you:
- Form submissions -- email and phone are extracted from form fields and
identify()is called before thelead_submittedevent fires - Booking widgets -- GoHighLevel, Calendly, and Cal.com widget completions extract contact info and call
identify()automatically
If your site uses standard HTML forms or supported booking widgets, identification happens without any extra code.
Manual identification
For custom forms, login flows, or other scenarios where auto-capture does not apply, call identify() directly.
document.querySelector("#my-form").addEventListener("submit", function () {
var email = document.querySelector("#email-field").value;
var name = document.querySelector("#name-field").value;
window.atribuTracker.identify({
email: email,
firstName: name.split(" ")[0],
lastName: name.split(" ").slice(1).join(" "),
});
});async function onLoginSuccess(user) {
window.atribuTracker.identify({
email: user.email,
firstName: user.firstName,
lastName: user.lastName,
userId: user.id,
});
}window.atribuTracker.identify({
phone: "+1-555-123-4567",
firstName: "Jane",
});Accepted fields
| Field | Type | Description |
|---|---|---|
email | string | Email address (highest priority for matching) |
phone | string | Phone number (second priority) |
firstName | string | First name |
lastName | string | Last name |
userId | string | Your internal user ID |
Identity priority
When matching visitors to customer profiles, Atribu uses this priority order:
- Email -- the strongest identifier. If two events share the same email, they are the same person.
- Phone number -- used when email is not available.
- External IDs -- provider-specific IDs like Stripe customer IDs or GHL contact IDs.
Atribu normalizes all identifiers before matching (lowercasing emails, stripping phone formatting), so [email protected] and [email protected] are treated as the same person.
Safe to call multiple times
Calling identify() more than once is safe and encouraged. If a visitor fills out a form with their email and later provides their phone number, calling identify() again adds the phone number to the existing profile without overwriting the email.
// First form: email only
window.atribuTracker.identify({ email: "[email protected]" });
// Later: phone number captured from a different form
window.atribuTracker.identify({ phone: "+1-555-123-4567" });
// Both identifiers are now linked to the same customer profileCritical: every conversion point needs identification
Without identify(), server-side events like payments (Stripe, MercadoPago) and CRM events (GoHighLevel) cannot be attributed to ad clicks. Make sure every form, checkout flow, or conversion point on your site calls identify() -- either through auto-capture or manually.