Skip to main content
Understanding how Zixflow tracks users is fundamental to getting value from your event data. This guide explains anonymous visitors, identified users, and how they connect into one customer journey.

The Two Types of Users

Every person who interacts with your product exists in one of two states: anonymous or identified.

Anonymous Users

An anonymous user is someone using your product before you know who they are. They haven’t signed up, logged in, or given you an email. When someone first visits your site or opens your app, the SDK generates an anonymousId (UUID) and stores it:
  • Web: First-party cookie (or localStorage fallback)
  • Mobile: Keychain (iOS) or SharedPreferences (Android)
  • Server-side: Your session layer (you generate and pass it)
The ID stays stable on the same device/browser until cookies/storage are cleared — or until the user identifies.

What you can do

  • Track behavior and funnels
  • Personalize in-session experiences
  • Attribute first-touch campaigns
  • Send push if a device token is registered before signup

What you cannot do

  • Email or SMS them (no contact info yet)
  • Unify activity across devices until they identify on each device

Identified Users

An identified user is someone you know. Call identify() when they sign up, log in, capture email, use OAuth, or complete guest checkout:
Zixflow.identify({
  userId: "user_12345",  // Your stable internal ID
  traits: {
    email: "sarah@example.com",
    name: "Sarah Johnson",
    plan: "free"
  }
});
Zixflow.instance.identify(
  userId: 'user_12345',
  traits: {
    'email': 'sarah@example.com',
    'name': 'Sarah Johnson',
    'plan': 'free',
  },
);
Once identified you can message across channels, track across devices, enrich from CRM/billing, and reconstruct the full journey.

Identity Merging

Identity merging connects pre-signup activity to the known profile when you call identify() with both userId and anonymousId (SDKs usually send the current anonymous ID automatically). What Zixflow does:
  1. Finds events (and devices) for that anonymousId
  2. Upgrades the anonymous profile in place — first_seen_at stays as the first visit, not signup time
  3. Links history under the identified userId
  4. Prevents duplicate merges
Why it matters: Multi-touch attribution, true funnel conversion rates (including anonymous drop-off), and onboarding personalization from pre-signup intent.

Choosing a User ID

ApproachProsCons
Database primary key (recommended)Stable, uniqueLess readable in reports
EmailReadableCan change; privacy in logs
UsernameReadableOften changeable
Do not use: session IDs, device IDs, or temporary IDs — they break cross-session or cross-device continuity. Use an ID that never changes, is unique, and exists in your system.

User Profiles

After identification, Zixflow maintains a profile with:
  • Core identity: user_id, email, name, phone, original anonymous_id
  • Custom attributes from identify() traits and setProfileAttributes()
  • System metadata: first seen, last updated, last seen
  • Linked events and devices
For attribute modeling, see Attributes.

Multiple Devices Per User

Each login on a new device calls identify() with the same userId and a different device token. You can push to all devices or target a platform, and see cross-device journeys in one timeline.

Common Scenarios

First-time visitor

SDK creates anonymousId → events tracked anonymously.

Returning visitor (not logged in)

Same cookie/storage → same anonymousId → history continues.

Signup / login

identify(userId, anonymousId) → merge → future events are identified.

Logout

Call clearIdentify() so a new anonymous session starts cleanly:
Zixflow.clearIdentify();

Switch devices

Identify on each device with the same userId → histories merge into one profile.

User Lifecycle States

Server-controlled states (not from the client SDK):
EventEffect
User DeletedSoft-deletes profile; deactivates linked devices
User SuppressedBlocks all outbound channels
User UnsuppressedResumes normal delivery
Suppression is workspace-controlled and blocks everything. Channel opt-outs are per-channel and user-controlled — see User Preferences. Use the Event API Reference for server-side lifecycle calls.

Device Registration Before Signup

  1. Device registers under anonymousId — push can send immediately
  2. User signs up — app calls identify()
  3. Devices migrate to the identified profile — no re-registration needed
Details: Devices & Push Notifications.
Next: Learn how to register devices for push → Devices & Push Notifications