Link anonymous visitor data to known users. When visitors log in or submit forms, Zenovay connects their full history to their identity.
How User Identification Works
Anonymous to Known
Visitor journey:
Visit 1 (Anonymous):
Anonymous visitor browses site
→ Assigned visitor ID: viz_abc123
Visit 2 (Anonymous):
Same visitor returns
→ Same visitor ID: viz_abc123
Visit 3 (Identified):
Visitor logs in as [email protected]
→ zenovay('identify', '[email protected]')
→ All history linked to [email protected]
Future Visits:
Automatically recognized
→ Full journey preserved
Data Merged
When identified:
- Past anonymous visits linked
- Future visits tracked
- Full journey visible
- Cross-device possible
Implementing Identification
Basic Identification
Call identify when the user is known:
// When user logs in
zenovay('identify', userId);
// Example
zenovay('identify', 'user_12345');
// or
zenovay('identify', '[email protected]');
With User Properties
Add user details as a third argument:
zenovay('identify', 'user_12345', {
email: '[email protected]',
name: 'John Smith',
company: 'Acme Corporation',
plan: 'enterprise',
role: 'admin'
});
Info
Either an email or a customer ID is required to identify a visitor. The first argument can be an email address or your own user ID.
Supported Properties
| Property | Type | Description |
|---|---|---|
| string | Email address | |
| name | string | Full name |
| first_name | string | First name |
| last_name | string | Last name |
| company | string | Company name |
| phone | string | Phone number |
| custom_* | any | Custom properties |
Any extra keys you pass are stored as custom attributes on the user profile.
Implementation Examples
On Login
// After successful login
async function handleLogin(credentials) {
const user = await loginUser(credentials);
// Identify in Zenovay
zenovay('identify', user.id, {
email: user.email,
name: user.name,
company: user.company_name
});
// Continue with app
redirectToDashboard();
}
React Hook
import { useEffect } from 'react';
import { useAuth } from './auth';
function useZenovayIdentify() {
const { user, isAuthenticated } = useAuth();
useEffect(() => {
if (isAuthenticated && user) {
if (window.zenovay) {
window.zenovay('identify', user.id, {
email: user.email,
name: user.name,
company: user.company
});
}
}
}, [user, isAuthenticated]);
}
Form Submission
// On form submit (before login)
async function handleFormSubmit(formData) {
// Identify with email from form
zenovay('identify', formData.email, {
email: formData.email,
name: formData.name,
company: formData.company
});
// Track the form submission
zenovay('goal', 'form_submission');
// Submit to backend
await submitForm(formData);
}
Viewing Identified Users
Users View
- Open your website's dashboard (
/domains/{id}) - In the sidebar's Audience group, open the Journeys tab
- Select the Users sub-tab to see identified users and their timelines
- Click a user to open their profile and full activity timeline
User List
Each row shows the visitor's name or email, where they came from, how many pages they've viewed, any revenue attributed to them, and when they were last active. Sort the list to surface your most active or highest-spending users:
| Visitor | Source | Pageviews | Spent | Last Active |
|---|---|---|---|---|
| [email protected] | 24 | $4,999 | Today | |
| [email protected] | Direct | 18 | — | Yesterday |
| [email protected] | 12 | $99 | 3 days ago |
Visitors who haven't identified themselves yet appear as Anonymous until an identify call (or a known email from an event) links a real identity. Click any row to open that visitor's full profile and activity timeline.
User Profile
┌─────────────────────────────────────────────────────┐
│ John Smith │
│ [email protected] │
│ ─────────────────────────────────────────────────── │
│ │
│ Company: Acme Corporation │
│ Plan: Enterprise │
│ Role: Admin │
│ Created: November 15, 2024 │
│ │
│ ─────────────────────────────────────────────────── │
│ │
│ Analytics Summary: │
│ • Total Sessions: 24 │
│ • Total Time: 3h 45m │
│ • Pages Viewed: 89 │
│ • Goals Completed: 5 │
│ • Revenue: $4,999 │
│ │
│ First Visit: Oct 20, 2024 (anonymous) │
│ Identified: Nov 15, 2024 │
│ Last Visit: Today at 2:30 PM │
│ │
└─────────────────────────────────────────────────────┘
User Journey
Full Timeline
See complete user history:
John Smith - Journey Timeline
January 15, 2025
├── 2:30 PM - Settings page (5 min)
├── 2:00 PM - Dashboard (10 min)
└── Logged in
January 10, 2025
├── 3:45 PM - Billing page (3 min)
├── 3:40 PM - Upgrade modal → Upgraded ✓
└── Logged in
December 15, 2024
├── 10:00 AM - Onboarding flow
└── Account created, identified
November 28, 2024 (anonymous)
├── Demo request submitted → Identified
├── /pricing (8 min)
└── /features (5 min)
October 20, 2024 (anonymous)
├── /blog/guide (4 min)
└── First visit via Google search
Cross-Device Tracking
When a user logs in on multiple devices, their sessions are linked to the same identity:
Devices Used:
Desktop (Chrome/Windows)
├── 18 sessions
└── Last: Today
Mobile (Safari/iOS)
├── 4 sessions
└── Last: Jan 10
Tablet (Chrome/iPad)
├── 2 sessions
└── Last: Dec 20
All sessions linked to [email protected]
If the same visitor is identified on more than one of your tracked domains, the timeline also surfaces the other domains they were seen on.
Privacy Considerations
User Consent
Before identifying:
- Ensure proper consent
- Follow your privacy policy
- Respect opt-outs
Data Handling
User data is:
- Encrypted in transit
- Access controlled by team membership and role
- Retained according to your plan's data-retention window
Deleting a User's Data
To remove a person's personal data, use a standard data-subject request: have them (or you, on their behalf) request deletion through Settings → Account for an account holder, or contact support at [email protected] for a visitor who isn't an account holder. Removing the website's tracking association also stops further collection.
Opt-Out Respect
// Check for opt-out before identifying
if (!userHasOptedOut()) {
zenovay('identify', userId, userData);
}
API Access
Identified-user data is available through the Zenovay REST API on paid plans. Use it to pull a user's profile, stats, and timeline into your own systems or to push identification from a backend.
For authentication, endpoints, and response formats, see the API overview. The identify call shown above (zenovay('identify', ...)) is the client-side way to create or update a user; the REST API is the server-side equivalent for reading that data back.
Best Practices
Identify Early
Identify as soon as possible:
- On signup/login
- On form submission
- When email known
Use Consistent IDs
Pick one ID strategy:
- Email (if unique)
- User ID from database
- UUID
Update Properties
Keep properties current:
// When user upgrades plan
zenovay('identify', userId, {
plan: 'enterprise',
upgraded_at: new Date()
});
Don't Over-Identify
Avoid calling identify:
- On every page load
- For anonymous visitors
- Without user consent
Troubleshooting
User Not Identified
If identification fails:
- Check the console for errors
- Verify the tracking script loaded
- Confirm
identifywas called after the script
History Not Linked
If past visits don't appear:
- Cookies may have been cleared
- Different browser/device
- Incognito mode used