---
title: "User Analytics — Identify Visitors and Track Them Across Devices | Kitbase"
description: "Track anonymous visitors from the first pageview, link them to real users with identify(), and get backfilled activity timelines and traits you can segment on."
canonical: https://kitbase.dev/user-analytics
---

Users

# From anonymous visitor to known customer

Kitbase tracks everyone from their very first pageview under an anonymous ID. The moment they sign in, one identify() call links that history to a real user — and every event they already triggered is backfilled with it.

[Start free](https://app.kitbase.dev/signup) [Read the docs](https://docs.kitbase.dev/identify-users)

No credit card required · Set up in under five minutes

![A team meeting around a table in an office](/images/product/users-hero.jpg)

Two kinds of user

## Anonymous and identified

Most tools start measuring someone at signup. Kitbase starts at the first visit, then stitches the two together the moment you identify them.

|  | 
Anonymous

Tracked from the first pageview

 | 

Identified

Linked via identify()

 |
| --- | --- | --- |
| Identifier | anonymous\_id — an auto-generated UUID | user\_id — the identifier your own system already uses |
| Created | Automatically, on the very first visit | When you call identify() after login or signup |
| Scope | One per device — the same person on two devices is two anonymous users | One per person — activity across devices collapses into a single identity |
| Storage | Kept in localStorage, so it survives page loads and browser restarts | Held server-side, linked to every anonymous ID that resolved to it |

How identity resolution works

## Four moments, one person

Nothing here needs a data pipeline of your own — the link and the backfill happen server-side.

1.  1
    
    ### First visit
    
    A UUID is generated and stored locally. Every event from this point is attributed to it — long before anyone signs up.
    
2.  2
    
    ### They sign in
    
    You call identify() with your own user ID and any traits worth attaching: email, name, plan, whatever you segment on.
    
3.  3
    
    ### The IDs are linked
    
    The SDK sends both identifiers to the server, which creates a permanent link between the anonymous ID and the user ID.
    
4.  4
    
    ### History is backfilled
    
    Every past event under that anonymous ID is rewritten with the user ID — so the pre-signup journey isn't lost.
    

Traits and segments

## Attach what you actually segment on

Pass any traits you like at identify time and they become properties you can filter and segment by — plan tier, signup source, company size, role. They travel with every event the user triggers from then on.

-   Per-user activity timelines, in event order
-   Jump between a user, their sessions, and the raw events
-   Segment by any trait you attached at identify time
-   Query the same data over REST when you need it elsewhere

[See the users guide](https://docs.kitbase.dev/guide/users)

![Two colleagues working at laptops in an office](/images/product/users-profile.jpg)

On your terms

## Persistence is a choice

By default the anonymous ID persists in localStorage so a returning visitor is recognised. Set storage to null and it regenerates each session instead — useful when your privacy posture calls for it, or when you'd rather not persist anything at all.

-   storage: null — a fresh anonymous ID every session
-   No cookies are set for analytics either way
-   Geolocation is derived from the IP, which is then dropped unless logging is on

[See session tracking](/session-tracking)

![A developer working at a laptop in a meeting room](/images/product/users-detail.jpg)

## Connect the journey end to end

Install the SDK, call identify() when someone signs in, and the whole path from first anonymous visit to paying customer lines up.

[Start 7-day free trial](https://app.kitbase.dev/signup) [Read the docs](https://docs.kitbase.dev/identify-users)

No credit card required
