Atribu
Tracking

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 the lead_submitted event 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.

Identify after a custom form submit
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(" "),
  });
});
Identify after user logs in
async function onLoginSuccess(user) {
  window.atribuTracker.identify({
    email: user.email,
    firstName: user.firstName,
    lastName: user.lastName,
    userId: user.id,
  });
}
Identify with phone number
window.atribuTracker.identify({
  phone: "+1-555-123-4567",
  firstName: "Jane",
});

Accepted fields

FieldTypeDescription
emailstringEmail address (highest priority for matching)
phonestringPhone number (second priority)
firstNamestringFirst name
lastNamestringLast name
userIdstringYour internal user ID

Identity priority

When matching visitors to customer profiles, Atribu uses this priority order:

  1. Email -- the strongest identifier. If two events share the same email, they are the same person.
  2. Phone number -- used when email is not available.
  3. 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.

Progressive enrichment
// 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 profile

Critical: 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.


Next steps

On this page