Snowplow atomic event properties
This page provides a reference for the standard fields that are found in all Snowplow events. These fields define the Snowplow tracker protocol, and are often called "atomic properties" or "atomic fields" in reference to the Snowplow atomic.events table. They're also sometimes called "canonical fields".
Fields that are populated during tracking have two names associated with them:
- Payload property: a short payload name, to reduce the size of the HTTP request
- Field name: a more descriptive column or field name
The field type refers to the data type in the enriched event data. For some fields, the type is different for the raw tracker payload and the enriched event. Again, this is to reduce the size of the HTTP request.
Different event fields are populated by different applications, such as tracker SDKs or enrichments. The source of data for each field is indicated in the tables below.
The reqd? values in these tables specify whether a field is required for a Snowplow event. Required fields will always have values.
Any payload that conforms to this protocol is a valid Snowplow event payload, whether it's sent by a Snowplow tracker SDK, a webhook, or a custom application. If you want to get into the details, check out these example HTTP requests. In total, the tracker protocol defines 131 fields, of which 89 are in use by Snowplow applications.
Common fields
These fields are common to all Snowplow events, regardless of platform or event type.
Event fields
The event_id is the unique identifier (UUID) for the table row. This should be generated by trackers, but if missing will be generated by the enrichment process.
| Payload property | Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|---|
e | event | text | The type of event recorded | Yes | page_view | Tracking | ✅ | ✅ |
eid | event_id | text | A UUID for each event | Yes | c6ef3124-b53a-4b13-a233-0088f79dcbcb | Tracking (or enrichment if empty) | ✅ | ✅ |
event_fingerprint | text | Hash client-set event fields, used to de-dupe records | No | AADCE520E20C2899F4CED228A79A3083 | Event fingerprint enrichment | ✅ | ✅ |
This table shows the possible values for the event field:
| Event type | Payload e value | Field event value |
|---|---|---|
| Self-describing event | ue | unstruct |
| Page view | pv | page_view |
| Page ping | pp | page_ping |
| Structured event | se | struct |
| Legacy ecommerce events | tr and ti | transaction and transaction_item |
User fields
The domain_userid is regarded as the most reliable session based identifier for most use cases. It's treated as the primary user_identifier field in our data models that rely on sessionization, including the Unified Digital data model.
The domain_sessionidx is the number or index of the current user session. For example, an event occurring during a user's first session would have domain_sessionidx set to 1. The JavaScript tracker calculates this field by storing a visit count in a first-party cookie.
The equivalent values on mobile are tracked in a session entity.
The network_userid is set by a Collector cookie by default. You can override it by setting a network_userid with your tracker.
| Payload property | Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|---|
uid | user_id | text | Unique identifier for user, set by the business using setUserId | No | c94f860b-1266-4dad-ae57-3a36a414a521 | Tracking | ✅ | ✅ |
duid | domain_userid | text | Unique identifier for a user, based on a first party cookie | No | 4b0dfa75-9a8c-46a1-9691-01add9db4200 | Tracking | ✅ | ❌ |
tnuid | network_userid | text | User ID set by Snowplow using server-set cookie | No | ecdff4d0-9175-40ac-a8bb-325c49733607 | Tracking or pipeline | ✅ | ✅ |
sid | domain_sessionid | text | Unique identifier (UUID) for this visit of this domain_userid to this domain | No | c6ef3124-b53a-4b13-a233-0088f79dcbcb | Tracking | ✅ | ❌ |
vid | domain_sessionidx | int | Index of number of visits that this domain_userid has made to this domain | No | 3 | Tracking | ✅ | ❌ |
ip | user_ipaddress | text | User IP address, can be overwritten with the IP anonymization enrichment | No | 92.231.54.234 | Tracking or IP anonymization enrichment | ✅ | ✅ |
Application fields
Use the application ID to distinguish events tracked from different applications or websites by the same Snowplow stack.
The platform ID is used to distinguish the same app running on different platforms, e.g. iOS vs web.
| Payload property | Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|---|
aid | app_id | text | Application ID | Yes | snow-game-android | Tracking | ✅ | ✅ |
p | platform | text | Platform the app runs on | Yes | web | Tracking | ✅ | ✅ |
tna | name_tracker | text | Tracker namespace | No | tracker_1 | Tracking | ✅ | ✅ |
This table shows the possible values for the platform field:
| Platform | platform value |
|---|---|
| Web, including mobile web | web |
| Mobile, tablet | mob |
| Desktop, laptop | pc |
| Server-side application | srv |
| General application | app |
| Connected TV | tv |
| Games console | cnsl |
| Internet of Things | iot |
The tracker namespace parameter is used to distinguish between different trackers. The name can be any string that doesn't contain a colon or semicolon character. Tracker namespacing allows you to run multiple trackers, pinging to different collectors.
Time and date fields
The etl_tstamp field records when the event was validated and enriched, not when it was loaded into the warehouse. The name is historical.
To set the os_timezone timezone field, use the timezone plugin on web trackers, or set the timezone in the mobile tracker configuration.
| Payload property | Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|---|
collector_tstamp | timestamp | Timestamp for the event recorded by the Collector | Yes | 2013-11-26 00:02:05.123 | Pipeline | ✅ | ✅ | |
dtm | dvce_created_tstamp | timestamp | Timestamp for the event recorded on the client device | No | 2013-11-26 00:03:57.885 | Tracking | ✅ | ✅ |
stm | dvce_sent_tstamp | timestamp | Timestamp when event occurred, as recorded by client device | No | 2013-11-26 00:03:58.032 | Tracking | ✅ | ✅ |
etl_tstamp | timestamp | Timestamp for when the event was validated and enriched | No | 2017-01-26 00:01:25.292 | Pipeline | ✅ | ✅ | |
derived_tstamp | timestamp | Timestamp making allowance for inaccurate device clock | No | 2013-11-26 00:02:04.123 | Default enrichment | ✅ | ✅ | |
ttm | true_tstamp | timestamp | User-set "true timestamp" for the event | No | 2013-11-26 00:02:04.123 | Tracking | ✅ | ✅ |
load_tstamp | timestamp | Timestamp for when the data was loaded into the warehouse | No | 2013-11-26 00:02:04.123 | Pipeline | ✅ | ✅ | |
tz | os_timezone | text | Client operating system timezone | No | Europe/London | Tracking | ✅ | ✅ |
The trackers send timestamp properties as int in the payload, representing milliseconds since the Unix epoch, e.g. 1361553733313. They're converted to timestamp type during enrichment. Similarly, the tz property is URL-encoded in the payload, e.g. Europe%2FLondon, and decoded during enrichment.
Read more about Snowplow timestamps here.
Device and operating system fields
The dvce_screenheight and dvce_screenwidth screen resolution fields originate from a single res payload property. It's a string with the format "<width>x<height>", e.g. 1900x1024. During enrichment, this string is split into the two separate integer fields.
| Payload property | Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|---|
ua | useragent | text | Raw useragent | No | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 | Tracking or pipeline | ✅ | ✅ |
res | dvce_screenheight | int | Screen height in pixels | No | 1024 | Tracking | ✅ | ✅ |
res | dvce_screenwidth | int | Screen width in pixels | No | 1900 | Tracking | ✅ | ✅ |
For more information on this topic check out the device data page.
IP address fields
These fields are populated by the IP enrichment.
| Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|
ip_isp | text | User's ISP | No | FDN Communications | IP enrichment | ✅ | ✅ |
ip_organization | text | Organization associated with the user's IP address - defaults to ISP name if none is found | No | Bouygues Telecom | IP enrichment | ✅ | ✅ |
ip_domain | text | Second level domain name associated with the user's IP address | No | nuvox.net | IP enrichment | ✅ | ✅ |
ip_netspeed | text | User's connection type | No | Cable/DSL | IP enrichment | ✅ | ✅ |
Location fields
These fields are populated by the IP enrichment, based on the IP address.
| Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|
geo_country | text | ISO 3166-1 code for the country the user is located in | No | GB, US | IP enrichment | ✅ | ✅ |
geo_region | text | ISO-3166-2 code for country region the user is in | No | I9, TX | IP enrichment | ✅ | ✅ |
geo_city | text | City the user is in | No | New York, London | IP enrichment | ✅ | ✅ |
geo_zipcode | text | Postcode the user is in | No | 94109 | IP enrichment | ✅ | ✅ |
geo_latitude | text | User location latitude | No | 37.443604 | IP enrichment | ✅ | ✅ |
geo_longitude | text | User location longitude | No | -122.4124 | IP enrichment | ✅ | ✅ |
geo_region_name | text | User region name | No | Florida | IP enrichment | ✅ | ✅ |
geo_timezone | text | User timezone name | No | Europe/London | IP enrichment | ✅ | ✅ |
For more information on this topic check out the geolocation data page.
Marketing fields
These fields are populated by the campaign attribution enrichment.
| Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|
mkt_medium | text | Type of traffic source | No | 'cpc', 'affiliate', 'organic', 'social' | Campaign attribution enrichment | ✅ | ✅ |
mkt_source | text | The company or website where the traffic came from | No | 'Google', 'Facebook' | Campaign attribution enrichment | ✅ | ✅ |
mkt_term | text | Any keywords associated with the referrer | No | 'new age tarot decks' | Campaign attribution enrichment | ✅ | ✅ |
mkt_content | text | The content of the ad, or an ID so that it can be looked up | No | 13894723 | Campaign attribution enrichment | ✅ | ✅ |
mkt_campaign | text | The campaign ID | No | 'diageo-123' | Campaign attribution enrichment | ✅ | ✅ |
mkt_clickid | text | The click ID | No | 'ac3d8e459' | Campaign attribution enrichment | ✅ | ✅ |
mkt_network | text | The ad network to which the click ID belongs | No | 'DoubleClick' | Campaign attribution enrichment | ✅ | ✅ |
Cross-domain tracking fields
The pipeline populates these fields by default if the event's url has a cross-navigation querystring.
| Payload property | Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|---|
refr_domain_userid | text | The Snowplow domain_userid of the referring website | No | bc2e92ec6c204a14 | Default enrichment | ✅ | ✅ | |
refr_dvce_tstamp | timestamp | The time of attaching the domain_userid to the inbound link | No | 2013-11-26 00:02:05 | Default enrichment | ✅ | ✅ |
Snowplow versions fields
These fields record the versions of the various Snowplow components involved in processing the event.
| Payload property | Field name | Type | Description | Reqd? | Example | Source | Web | Mobile |
|---|---|---|---|---|---|---|---|---|
tv | v_tracker | text | Tracker version | Yes | js-3.0.0 | Tracking |