User and session identifiers
Snowplow tracks several identifiers to help you understand user behavior across sessions and devices. These include tracker-generated IDs stored on the client, server-generated IDs from the Collector, and business user IDs you set in your app.
Understanding how these identifiers work enables you to build a complete picture of user journeys, whether through real-time identity resolution with Snowplow Identities, or identity stitching in your data models.
Read more about tracking identifiers in the OOTB user and session data page.
User identifiers
For identifiers in cookies, consider using the Cookie Lifetime Extension service to prevent identifier loss due to browser restrictions.
Tracker-generated
This on-device user identifier is generated by the tracker. It takes the form of a UUID, and is tracked differently on web or mobile.
It's the default identifier used in our dbt packages to identify users. The Unified Digital package coalesces the domain_userid and the userId property into a single user_identifier field, to make it easier to work with. The value can come from either place.
| Web | Mobile | |
|---|---|---|
| Event field | domain_userid | userId |
| Location in event | Atomic event property | Client session entity |
| Persistance mechanism | Browser cookies | App user settings storage |
| Unified Digital field | user_identifier | user_identifier |
In mobile apps, there are additional on-device identifiers provided by the platform: advertising ID (IDFA) and vendor ID (IDFV, app set ID). These can be tracked in the mobile entity.
Server-generated
The Snowplow Collector generates the network_userid user identifier. It's a UUID that's returned in the Collector's HTTP response to the tracker, as the sp cookie in a Set-Cookie header.
Whether the network_userid persists between events or sessions depends on the tracker:
| Tracker | Persists within session | Persists across sessions | Mechanism |
|---|---|---|---|
| Web | ✅ | ✅ | Stored in sp cookie |
| iOS | ✅ | ✅ | Stored using HTTPCookieStorage |
| Android | ✅ | ✅ | Stored using SharedPreferences |
| React Native | ✅ | ✅ | Depends on platform used |
| Flutter | ✅ | ✅ | Depends on platform used |
| Roku | ❌ | ❌ | |
| Node.js | ❌ | ❌ | |
| Golang | ❌ | ❌ | |
| .NET | ❌ | ❌ | |
| Java | ✅ | ❌/✅ | Stored in memory by default; configure a CollectorCookieJar to persist the network_userid across sessions |
| Python | ❌ | ❌ | |
| Scala | ❌ | ❌ | |
| Ruby | ❌ | ❌ | |
| Rust | ❌ | ❌ | |
| PHP | ❌ | ❌ | |
| C++ | ✅ | ❌/✅ | Stored in memory by default; configure a cookie_file to persist the network_userid across sessions |
| Unity | ❌ | ❌ | Set all properties. |
| Lua | ❌ | ❌ | Set user_id only. |
| Google Tag Manager | ✅ | ✅ | Same as for the web tracker: stored in sp cookie |
Some trackers also allow you to set your own network_userid value.
Business-generated
The business-generated user identifier is an external identifier given to the tracker by the application. Most commonly it's the username or email address of the logged in user e.g. jane.doe@email.com.
It's tracked as the atomic user_id field. All Snowplow trackers have an API to set this identifier.
Snowplow ID
If you use Snowplow Identities, each event will receive a Snowplow ID from the resolved user profile. The ID is added in an identity entity. You can configure Identities to stitch together any identifiers for identity resolution.
IP address
Snowplow events also contain the IP address of the user. The value is stored in the atomic user_ipaddress property.
We don't recommend using the IP address as a primary identifier: multiple users can share an IP address, and a user's IP address can change frequently. However, it can be useful for certain use cases such as bot detection or geolocation.
Session identifiers
The main Snowplow session identifiers are the session ID and session index:
- Session ID: a UUID generated by the tracker at the start of the session
- Session index: the index of the session for the current user, based on the
domain_useridoruserIdtracker-generated user identifier
They're tracked differently depending on the tracker. On web, they're tracked as the domain_sessionid and domain_sessionidx atomic event fields. In other trackers, they're part of the client session entity, which also includes other session-related information. Note that the web trackers can also track the client session entity, but not all trackers support session tracking.
Identity resolution
Identity resolution is the process of taking various user identifiers and combining them into a single user identifier, to better identify and track users throughout their journey on your site or app. It allows you to attribute logged-in and non-logged-in sessions back to a single user.
Snowplow offers two approaches to identity resolution:
- Snowplow Identities resolves identity in real time during enrichment, attaching a unified Snowplow ID to each event. The Identities dbt package then builds mapping tables for use in downstream models.
- Identity stitching in the Unified Digital dbt package resolves identity at modeling time by stitching the business user ID with tracker-generated user identifiers. This is available to all customers.
We recommend setting the business user identifier, where possible, when using either approach.
Reset generated identifiers on web
If you're not using Identities, there's a risk of attributing sessions to the wrong user when multiple users share the same browser or device.
If this is a problem for you, the JavaScript tracker allows you to clear all user data. If you call this function when a user logs out, the tracker will generate new user and session identifiers for subsequent events. This feature is only available for the JavaScript tracker.
Anonymous tracking
The user and session identifiers, along with the IP address, are considered personal identifiable information (PII). Snowplow also allows you to track data without these identifiers: check out the anonymous tracking overview page.