Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.immutable.com/llms.txt

Use this file to discover all available pages before exploring further.

The Tracking Pixel, Web SDK, Unity SDK, and REST API are currently in alpha. The data collected and event schemas may change between releases.
Full reference of data collected and event schemas for the Tracking Pixel, Web SDK, Unity SDK, and REST API. Use it to understand what each integration sends, when it sends it, and what properties each event carries. Also useful for privacy reviews, legal assessments, and technical audits.

Cookies

First-party cookies only. No third-party cookies are created. The Unity SDK does not use cookies. It persists AnonymousId and queued events to native local storage instead.
Persistent anonymous device identifier (UUID v4). Shared between the Tracking Pixel and Web SDK.
PropertyValue
Lifetime2 years
ScopeFirst-party, current hostname
AttributesSameSite=Lax, Secure on HTTPS
Session continuity across page loads. Refreshed on each tracking call. Expires after 30 minutes of inactivity.
PropertyValue
Lifetime30 minutes (rolling)
ScopeFirst-party, current hostname
AttributesSameSite=Lax, Secure on HTTPS
Google Analytics client ID. Read-only. The Tracking Pixel reads this cookie for cross-platform identity stitching but does not write it.
PropertyValue
SourceGoogle Analytics
Facebook click ID. Read-only. The Tracking Pixel reads this cookie for cross-platform identity stitching but does not write it.
PropertyValue
SourceMeta (Facebook)
Facebook browser ID. Read-only. The Tracking Pixel reads this cookie for cross-platform identity stitching but does not write it.
PropertyValue
SourceMeta (Facebook)

Device Fingerprint Signals

These signals are collected automatically when consent is anonymous or full. The Tracking Pixel and Web SDK collect the same browser-based set, so the per-integration tabs for those two repeat the same table.
SignalSourceExample
User agentnavigator.userAgentMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...
Screen resolutionscreen.width × screen.height1920×1080
TimezoneIntl.DateTimeFormat().resolvedOptions().timeZoneAmerica/New_York
Browser languagenavigator.languageen-US
IP addressServer-side from request headersRaw IP stored for geo enrichment

Attribution Signals

Captured from the URL and browser. The Tracking Pixel and Web SDK record the same set of signals. The per-integration tabs for those two carry the same table, with the framing sentence noting when each integration attaches them.
The Tracking Pixel collects these on every page load.
SignalSourceExample
UTM parametersURL query stringutm_source, utm_medium, utm_campaign, utm_term, utm_content
Google click IDURL query stringgclid
Meta click IDURL query stringfbclid
TikTok click IDURL query stringttclid
Microsoft click IDURL query stringmsclkid
Display & Video 360 click IDURL query stringdclid
LinkedIn click IDURL query stringli_fat_id
Referrerdocument.referrerThe referring page URL
Landing pagewindow.location.href (first page in session)Entry point URL
Referral codeURL query stringreferral_code: a custom parameter you add to campaign links (e.g. ?referral_code=influencer-abc) to track referral sources

Identity Stitching

Each integration assigns an anonymousId automatically when tracking begins. As a player moves through your funnel (visiting your marketing site, creating an account, launching the game), identity calls connect those anonymous sessions to a known player in attribution reports.
IntegrationHow anonymousId is assigned
Tracking PixelReads or sets the imtbl_anon_id first-party cookie
Web SDKReads or sets the same imtbl_anon_id cookie
Unity SDKGenerates a persistent GUID stored in Application.persistentDataPath
REST APIProvided by the caller in the message payload
The Tracking Pixel and Web SDK share the imtbl_anon_id cookie on the same domain, so sessions on the same domain are already continuous before any login occurs. Call identify() at login to associate the player’s userId with their activity and traits. A player who logs in on both the marketing site and in-game using the same userId will have both session histories attributed to the same profile, no alias call needed. Call alias() when the same player is known by different provider IDs across surfaces, for example a player previously identified as a Steam user who later links a Passport account.

Auto-Tracked Events

Events fired by the integration without studio code. Title badges indicate which integrations emit each event. Trigger conditions and per-integration property differences are described inside the accordion.
Player launched the game. The Unity SDK fires this automatically at Init when consent permits tracking. The Web SDK and REST API do not currently emit this event.Event name: game_launch
PropertyTypeRequiredDescription
platformstringNoUnity Application.platform enum (e.g. 'WindowsPlayer', 'OSXPlayer', 'WindowsEditor')
versionstringNoGame version string
buildGuidstringNoUnity build GUID
unityVersionstringNoUnity version the build was made with
osFamilystringNoOne of 'Windows', 'MacOSX'
deviceModelstringNoHardware model
gpustringNoGPU name
gpuVendorstringNoGPU vendor
cpustringNoCPU name
cpuCoresintegerNoNumber of CPU cores
ramMbintegerNoSystem RAM in megabytes
screenDpiintegerNoDisplay DPI (omitted when 0).
distributionPlatformstringNoValue of AudienceConfig.DistributionPlatform (e.g. 'steam', 'epic'). Omitted if not set. Studio-supplied storefront identifier. Complements the Unity-emitted platform, which is the OS-level player runtime.
Fired automatically by ImmutableAudience.Init. Studios do not call this directly. The wire payload includes the full Unity property set:
{
  "type": "track",
  "eventName": "game_launch",
  "properties": {
    "platform": "WindowsPlayer",
    "version": "1.2.0",
    "buildGuid": "00000000-0000-0000-0000-000000000000",
    "unityVersion": "2022.3.10f1",
    "osFamily": "Windows",
    "deviceModel": "PC",
    "gpu": "Generic GPU",
    "gpuVendor": "Generic",
    "cpu": "Generic CPU",
    "cpuCores": 8,
    "ramMb": 16384,
    "screenDpi": 96,
    "distributionPlatform": "steam"
  }
}
Fires when a new session begins. Per-integration triggers:
  • Tracking Pixel: no active _imtbl_sid cookie.
  • Web SDK: no active session cookie, or consent upgrades from 'none'.
  • Unity SDK: Init, consent upgrade from None, or resume after a pause longer than 30 seconds.
PropertyTypeDescription
sessionIdstringNew session identifier
The Web SDK also includes all attribution signals (utm_*, click IDs, referrer, landing_page, referral_code, touchpoint_type) on this event.
Fires when a session ends. Only fires when consent is at Anonymous or higher.Per-integration triggers:
  • Tracking Pixel: page unload.
  • Web SDK: shutdown() is called.
  • Unity SDK: Shutdown is called, consent is downgraded to None, or a session rolls due to extended pause.
PropertyTypeSurfacesDescription
sessionIdstringAllCurrent session identifier
durationnumberTracking Pixel, Web SDKSeconds since session_start, wall-clock
durationSecnumberUnity SDKEngagement seconds since session_start, wall-clock minus accumulated pause time
The Tracking Pixel and Web SDK report duration as wall-clock time. The Unity SDK reports durationSec as engagement time, excluding pause durations. The field names differ to make the semantic difference explicit. Dashboards aggregating session length across integrations should treat these as separate metrics.The Tracking Pixel and Web SDK use fetch with keepalive: true to ensure delivery on page unload.
Fires every 60 seconds while the game is focused. Pause and resume reset the heartbeat clock, so wall-clock and reported engagement time can diverge.
PropertyTypeDescription
sessionIdstringCurrent session identifier
durationSecnumberEngagement seconds since session_start, wall-clock minus accumulated pause time
Used to estimate playtime per session for studios where players regularly leave the game backgrounded. The Web SDK and Tracking Pixel do not emit this event.
The Tracking Pixel fires this automatically on every page load. In the Web SDK, call page() manually on each route change.
PropertyTypeTracking PixelWeb SDKDescription
sessionIdstringEvery pageEvery page()Current session identifier
utm_sourcestringEvery pageOnce per sessionUTM source parameter from URL
utm_mediumstringEvery pageOnce per sessionUTM medium parameter from URL
utm_campaignstringEvery pageOnce per sessionUTM campaign parameter from URL
utm_termstringEvery pageOnce per sessionUTM term parameter from URL
utm_contentstringEvery pageOnce per sessionUTM content parameter from URL
gclidstringEvery pageOnce per sessionGoogle Ads click ID
fbclidstringEvery pageOnce per sessionMeta click ID
ttclidstringEvery pageOnce per sessionTikTok click ID
msclkidstringEvery pageOnce per sessionMicrosoft click ID
dclidstringEvery pageOnce per sessionDisplay & Video 360 click ID
li_fat_idstringEvery pageOnce per sessionLinkedIn click ID
referrerstringEvery pageOnce per sessionReferring page URL
landing_pagestringEvery pageOnce per sessionEntry point URL
referral_codestringEvery pageOnce per sessionCustom referral link parameter
touchpoint_typestringEvery pageOnce per session'click' when any click ID or UTM parameter is present
gaClientIdstringEvery pageGoogle Analytics client ID (from _ga cookie)
fbClickIdstringEvery pageFacebook click ID (from _fbc cookie)
fbBrowserIdstringEvery pageFacebook browser ID (from _fbp cookie)
Fires on HTML form submission. Can be disabled with autocapture.forms: false.
PropertyTypeDescription
formActionstringForm action URL
formIdstringForm element ID
formNamestringForm element name
fieldNamesstring[]Names of form fields
emailHashstringSHA-256 hashed email address (full consent only)
Fires when the user scrolls past a depth milestone (25%, 50%, 75%, 90%, 100%). Each milestone fires at most once per page load. On above-the-fold pages (all content visible without scrolling), fires depth: 100 with aboveFold: true after a 2-second dwell time to filter immediate bounces. Can be disabled with autocapture.scroll: false.
PropertyTypeDescription
depthintegerMilestone reached: 25, 50, 75, 90, or 100
aboveFoldbooleantrue on above-the-fold pages (only present when applicable)
sessionIdstringCurrent session identifier
Fires on outbound link clicks (external domains only). Can be disabled with autocapture.clicks: false.
PropertyTypeDescription
linkUrlstringDestination URL
linkTextstringLink display text
elementIdstringLink element ID
outboundbooleanAlways true

Predefined Events

Typed events for common player actions. These schemas apply to the Web SDK, the Unity SDK, and the REST API. Each event accordion below shows the typed call shape for every integration. Properties are identical across integrations unless noted. Each integration also auto-attaches its own metadata to every event. See Auto-attached metadata below.

Event schemas

Player created a new account.Event name: sign_up
PropertyTypeRequiredDescription
methodstringNoHow the player signed up (e.g. 'email', 'google', 'passport')
audience.track(AudienceEvents.SIGN_UP, { method: 'email' });
Player signed in to an existing account.Event name: sign_in
PropertyTypeRequiredDescription
methodstringNoAuthentication method used (e.g. 'email', 'google', 'passport')
audience.track(AudienceEvents.SIGN_IN, { method: 'google' });
Player completed a purchase.Event name: purchase
PropertyTypeRequiredDescription
currencystringYesCurrency code (e.g. 'USD', 'ETH')
valuenumberYesTotal purchase value
itemIdstringNoUnique identifier for the item
itemNamestringNoDisplay name of the item
quantitynumberNoNumber of items purchased
transactionIdstringNoYour internal transaction reference
Player buys a sword for $9.99:
audience.track(AudienceEvents.PURCHASE, {
  currency: 'USD',
  value: 9.99,
  itemName: 'Legendary Sword',
  quantity: 1,
});
Player started, completed, or failed a level or stage.Event name: progression
PropertyTypeRequiredDescription
status'start' | 'complete' | 'fail'YesWhether the player started, completed, or failed this segment
worldstringNoTop-level grouping (e.g. 'forest', 'dungeon', 'chapter-1')
levelstringNoLevel within the world (e.g. '3', 'boss')
stagestringNoSub-level or checkpoint within the level
scorenumberNoScore achieved
durationSecnumberNoTime spent in seconds
Player completed level 3 of the forest world with a score of 4500 in 2 minutes:
audience.track(AudienceEvents.PROGRESSION, {
  status: 'complete',
  world: 'forest',
  level: '3',
  score: 4500,
  durationSec: 120,
});
Player gained or spent an in-game resource.Event name: resource
PropertyTypeRequiredDescription
flow'sink' | 'source'Yes'sink' when the player spends a resource, 'source' when they gain one
currencystringYesThe resource type (e.g. 'gold', 'gems', 'energy')
amountnumberYesQuantity gained or spent
itemTypestringNoCategory of the item involved (e.g. 'weapon', 'consumable')
itemIdstringNoUnique identifier for the item
Player spends 500 gold on a weapon:
audience.track(AudienceEvents.RESOURCE, {
  flow: 'sink',
  currency: 'gold',
  amount: 500,
  itemType: 'weapon',
  itemId: 'legendary-sword',
});
Player added or removed a game from their wishlist.Event names: wishlist_add, wishlist_removewishlist_add:
PropertyTypeRequiredDescription
gameIdstringYesUnique identifier for the game
sourcestringNoWhere the action happened (e.g. 'store', 'search', 'recommendation')
platformstringNoPlatform (e.g. 'steam', 'epic')
audience.track(AudienceEvents.WISHLIST_ADD, {
  gameId: 'game-123',
  source: 'store',
  platform: 'steam',
});
wishlist_remove:
PropertyTypeRequiredDescription
gameIdstringYesUnique identifier for the game
audience.track(AudienceEvents.WISHLIST_REMOVE, { gameId: 'game-123' });
Captured a player’s email address (e.g. from a newsletter signup or waitlist form).Event name: email_acquired
PropertyTypeRequiredDescription
sourcestringNoWhere the email was collected (e.g. 'waitlist', 'newsletter', 'checkout')
audience.track(AudienceEvents.EMAIL_ACQUIRED, { source: 'waitlist' });
Player viewed a game page.Event name: game_page_viewed
PropertyTypeRequiredDescription
gameIdstringYesUnique identifier for the game
gameNamestringNoDisplay name of the game
slugstringNoURL-friendly identifier (e.g. 'my-game')
audience.track(AudienceEvents.GAME_PAGE_VIEWED, {
  gameId: 'game-123',
  gameName: 'My Game',
  slug: 'my-game',
});
Player clicked a tracked link.Event name: link_clicked
PropertyTypeRequiredDescription
urlstringYesDestination URL
labelstringNoDisplay text or label for the link
sourcestringNoWhere the link appeared (e.g. 'navbar', 'footer', 'cta-banner')
gameIdstringNoAssociated game identifier, if applicable
audience.track(AudienceEvents.LINK_CLICKED, {
  url: 'https://store.steampowered.com/app/123',
  label: 'Wishlist on Steam',
  source: 'cta-banner',
});
Player reached a named milestone or achievement. Use for one-shot accomplishments that do not fit the start/complete/fail shape of progression.Event name: milestone_reached
PropertyTypeRequiredDescription
namestringYesMilestone identifier (e.g. 'first_boss_defeated', 'tutorial_complete')
Player defeats the first boss:
ImmutableAudience.Track(new MilestoneReached { Name = "first_boss_defeated" });
The Web SDK and REST API do not yet ship a typed equivalent. Studios on those surfaces can emit the same event by passing the event name directly.

Auto-attached metadata

The Web SDK and Unity SDK auto-attach a shared baseline to every event:
  • A persistent anonymous device identifier (anonymousId)
  • An integration tag identifying the SDK source
  • The library identifier and version
  • Locale, screen size, timezone, and user-agent string
The Web SDK additionally captures browser page context (current page URL, path, referrer, and title) on every event. The tabs below document only the integration-specific additions on top of that baseline. The backend additionally stamps received_at and IP-derived geo on every event regardless of integration.
Method callAuto-attached
every track() callsessionId
track('sign_up', ...), track('link_clicked', ...)sessionId plus attribution signals from the current page URL
every track() call after identify() (Full consent only)userId
Attribution values come from the page where the event fires, not the player’s landing page. A player who arrives via ?utm_source=discord, navigates to another page, then triggers sign_up will have no utm_source on that event. landing_page is not attached.
All Audience integrations use a three-tier consent model. Consent defaults to None and can be changed at any time. Changes take effect immediately. The Audience integrations do not provide a consent UI. You are responsible for building the cookie banner or privacy prompt and setting the consent level when the user makes a choice.
LevelWhat it doesWhen to set
NoneLoads but collects nothingBefore consent is given or when consent is denied
AnonymousTracks activity without user identityAfter analytics consent
FullTracks everything including user identityAfter full tracking consent
Native games do not have a cookie banner. Studios typically gate the consent call on a first-launch privacy prompt or a settings menu. You can downgrade consent at any time. All integrations share this core behavior:
  • Full → Anonymous: strips player identity from queued events, removes pending identify() and alias() messages.
  • Any level → None: purges all queued events.
Clears the session cookie. The anonymous device cookie persists per its lifetime unless the user clears cookies in the browser.
The tables below show whether each data category is collected at each consent level.
Data'none''anonymous''full'
Cookiesimtbl_anon_idimtbl_anon_id, _imtbl_sidimtbl_anon_id, _imtbl_sid
Page viewsNoYesYes
Session eventsNoYesYes
Device fingerprintNoYesYes
Attribution signalsNoYesYes
Outbound link clicksNoYesYes
Form submissionsNoYes (no email)Yes (hashed email)
Scroll depth milestonesNoYesYes
Third-party ID stitchingNoYesYes

What Is Not Collected

None of the Audience integrations collect the following:
  • No cross-domain tracking (first-party cookies only)
  • No session replay or screen recording
  • No heatmaps or mouse movement tracking
  • No A/B testing or feature flags
  • No impression or view-through tracking (click-through only)
  • No raw email addresses (only SHA-256 hashed, only at full consent)
Additionally, the Tracking Pixel does not support custom event tracking. Use the Web SDK, Unity SDK, or REST API for that.

Next Steps

Attribution

How tracking data powers player attribution and Hub reports

Tracking Pixel

Passive tracking snippet for marketing sites and landing pages

Web SDK

Typed SDK for web games, marketing sites, and SPAs

Unity SDK

In-game tracking for Unity desktop builds

REST API

Send events from your backend or game server