Visitor Identification
Identify and track individual users across sessions to understand user journeys and build complete user profiles.
Overview
Visitor identification allows you to:
- Link anonymous visitors to known users when they log in
- Track user behavior across multiple sessions and devices
- Build comprehensive user profiles
- Personalize experiences based on user history
Basic Identification
Identify a user after they sign up or log in:
zenovay('identify', 'user_123', {
email: '[email protected]',
name: 'John Doe',
plan: 'pro',
created_at: '2025-01-15T10:00:00Z'
});User Traits
Include relevant user properties:
zenovay('identify', user.id, {
// Contact information
email: user.email,
name: user.name,
phone: user.phone,
// Account details
plan: user.subscription.plan,
status: 'active',
created_at: user.createdAt,
// Company information (B2B)
company: user.company.name,
company_size: '50-200',
industry: 'SaaS',
// Custom properties
lifetime_value: user.lifetimeValue,
total_purchases: user.totalPurchases
});Never include sensitive information like passwords, credit card numbers, or SSNs in user traits.
Anonymous to Identified
Track anonymous visitors and link them when they identify:
// Before login - track as anonymous
zenovay('track', 'page_view', {
path: '/pricing'
});
zenovay('track', 'button_click', {
button: 'sign_up'
});
// After login - identify the user
zenovay('identify', 'user_456', {
email: '[email protected]',
name: 'Jane Smith'
});
// All previous anonymous events are now linked to this userIdentity status badges in the dashboard
Once visitors are identified, Zenovay automatically labels them in your dashboard with one of three status badges:
- Anonymous — A visitor that has not yet called
zenovay('identify', ...). Tracked by an anonymous in-memory ID (no cookies, no localStorage in cookieless mode). - Identified — A visitor that has called
zenovay('identify', userId, traits). The identity card on the visitor's session detail panel shows the email, name, plan, and any custom attributes you sent. - Paying customer — A visitor whose record is linked to a paid subscription via Stripe, LemonSqueezy, Polar, or PayPal — OR whose
total_revenueis greater than zero. The link is established automatically by your payment provider's webhook (no extra tracker call required).
Badges appear on:
- Globe markers — Paying customers get a green-glow crown icon, identified visitors get a blue-ringed user icon, anonymous visitors get the default value-score colour.
- Profiles list — Each row shows a coloured badge. Filter chips above the list narrow to one status.
- Live Analytics — Live rows show the badge inline.
- Visitor detail panel — Identity card section displays full identity attributes when present.
Edge cases
- A visitor who calls
identify()with only a customer ID (no email) is still classified as Identified. The identity card rendersID onlyin the Email row. - A visitor whose subscription is later cancelled BUT whose
total_revenue > 0remains classified as Paying — past lifetime value is still relevant to your team. - A visitor identified across two different websites you track shows independently per website (data is scoped per website, never bled across).
Screenshot mode: blur identifiers
For demos, public screenshots, or screen-sharing in calls, you can mask all visitor emails and names across the dashboard:
- Open
/profile→ Preferences. - In the Display section, toggle Blur identifiers ON.
- Emails render as
••••••@••••••and names asJ••• D•. Reload-persistent (per browser).
The blur toggle is a presentation aid for screenshots — not an access control. A user with browser DevTools can still see the unmasked data when the toggle is ON. To genuinely restrict access to identifiers, manage your team membership in Settings → Team.
Public dashboards always blur
Identifiers are ALWAYS masked on a public dashboard share, regardless of the toggle state. The Globe API also omits identity_email / identity_name / identity_plan fields entirely from the shared response — the data is not just hidden in the UI, it is not transmitted.
React Example
In React applications:
import { useEffect } from 'react';
function UserProvider({ user, children }) {
useEffect(() => {
if (user && window.zenovay) {
// Use the global zenovay object from the tracking script
window.zenovay('identify', user.id, {
email: user.email,
name: user.name,
plan: user.plan,
created_at: user.createdAt
});
}
}, [user]);
return <>{children}</>;
}Privacy Compliance
Respect user privacy and comply with regulations:
GDPR Compliance
To delete all data for a specific user, go to Settings → Privacy → Delete User Data in the Zenovay dashboard, or use the External API.
Opt-Out Tracking
// Disable tracking for a user who opts out
zenovay('disable');
// Re-enable tracking if user opts back in
zenovay('enable');Session Management
Sessions are managed automatically by the Zenovay tracker. A new session starts when a visitor arrives or after 30 minutes of inactivity. You can query session timing:
// Get time spent in current session (seconds)
const sessionTime = zenovay('getSessionTime');
// Get active engagement time (seconds)
const engagementTime = zenovay('getEngagementTime');Best Practices
When to Identify
✅ Do identify users:
- After successful signup
- After login
- When user updates their profile
- When subscription changes
❌ Don't identify users:
- Before they've created an account
- With temporary or test data
- In development/testing environments
ID Format
Use consistent, immutable user IDs:
// ✅ Good: Use database IDs
zenovay('identify', 'usr_1234567890');
// ❌ Bad: Email addresses can change
zenovay('identify', '[email protected]');
// ❌ Bad: Usernames can change
zenovay('identify', 'johndoe123');Next Steps
You're now tracking identified users! View user profiles in your Zenovay dashboard.
Continue learning:
- Custom Events - Track user actions
- Privacy Compliance - GDPR and CCPA
- Visitor Value Scoring - AI-powered insights