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, and the data forwarded externally by Conversion Postbacks. 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

The Tracking Pixel and Web SDK collect the same URL-based signals. Mobile Unity builds with attribution enabled collect a separate set of device-level signals. Desktop Unity builds collect none.
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. For exact method signatures and the full list of IdentityType values, see the API Reference section of the Web SDK, Unity SDK, or REST API docs.

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
platformstringNoOS or mobile platform the game is running on. One of 'Windows', 'macOS', 'Linux', 'iOS', 'Android'.
is_editorbooleanNotrue when the game is running inside the Unity Editor; false for shipped builds. Use this to filter dev runs out of production analytics.
versionstringNoGame version string
build_guidstringNoUnity build GUID
unity_versionstringNoUnity version the build was made with
os_familystringNoHost operating system family from Unity’s SystemInfo.operatingSystemFamily. One of 'Windows', 'MacOSX', 'Linux', 'Other'.
device_modelstringNoHardware model
gpustringNoGPU name
gpu_vendorstringNoGPU vendor
cpustringNoCPU name
cpu_coresintegerNoNumber of CPU cores
ram_mbintegerNoSystem RAM in megabytes
screen_dpiintegerNoDisplay DPI (omitted when 0).
distribution_platformstringNoValue 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.
idfvstringNoiOS only. Identifier for Vendor, a device ID scoped to your publisher. Reset when all apps from the same publisher are uninstalled.
android_idstringNoAndroid only. Android device unique identifier.
On mobile with EnableMobileAttribution = true, additional attribution signals are included. See Attribution Signals for the full set.Postback forwarding: when Conversion Postbacks are configured for the game, attributed game_launch events are forwarded to the configured ad network as a registration/install signal. See Outbound Forwarding.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": "Windows",
    "is_editor": false,
    "version": "1.2.0",
    "build_guid": "00000000-0000-0000-0000-000000000000",
    "unity_version": "2022.3.10f1",
    "os_family": "Windows",
    "device_model": "PC",
    "gpu": "Generic GPU",
    "gpu_vendor": "Generic",
    "cpu": "Generic CPU",
    "cpu_cores": 8,
    "ram_mb": 16384,
    "screen_dpi": 96,
    "distribution_platform": "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
session_idstringNew 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
session_idstringAllCurrent session identifier
durationnumberTracking Pixel, Web SDKSeconds since session_start, wall-clock
duration_secnumberUnity 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 duration_sec 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
session_idstringCurrent session identifier
duration_secnumberEngagement 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.
ATT authorization status changed from its previously recorded value. Does not fire on first launch. The initial state is reported by game_launch.Requires: EnableMobileAttribution = true, Anonymous or Full consent, iOS only.Event name: tracking_authorization_changed
PropertyTypeConsentDescription
previous_statusstringAnonymous+Prior ATT status: notDetermined, restricted, denied, or authorized
new_statusstringAnonymous+New ATT status
idfastringFullPresent only when transitioning to authorized with Full consent
Android Play Install Referrer captured. Fires once per install. On first launch the Play Services fetch is usually still in flight when game_launch fires, so the event typically arrives on the second launch.Requires: EnableMobileAttribution = true, Full consent, Android only.Event name: install_referrer_received
PropertyTypeDescription
install_referrerstringRaw referrer string from Google Play (e.g. utm_source=google-play&utm_medium=organic)
The Tracking Pixel fires this automatically on every page load. In the Web SDK, call page() manually on each route change.
PropertyTypeTracking PixelWeb SDKDescription
session_idstringEvery 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
ga_client_idstringEvery page-Google Analytics client ID (from _ga cookie)
fb_click_idstringEvery page-Facebook click ID (from _fbc cookie)
fb_browser_idstringEvery page-Facebook browser ID (from _fbp cookie)
Fires on HTML form submission. Can be disabled with autocapture.forms: false.
PropertyTypeDescription
form_actionstringForm action URL
form_idstringForm element ID
form_namestringForm element name
field_namesstring[]Names of form fields
email_hashstringSHA-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)
session_idstringCurrent session identifier
Fires on outbound link clicks (external domains only). Can be disabled with autocapture.clicks: false.
PropertyTypeDescription
link_urlstringDestination URL
link_textstringLink display text
element_idstringLink 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
item_idstringNoUnique identifier for the item
item_namestringNoDisplay name of the item
quantitynumberNoNumber of items purchased
transaction_idstringNoYour internal transaction reference
Postback forwarding: when Conversion Postbacks are configured for the game, attributed purchase events (including value and currency) are forwarded to the configured ad network for ROAS optimisation. See Outbound Forwarding.Player buys a sword for $9.99:
audience.track(AudienceEvents.PURCHASE, {
  currency: 'USD',
  value: 9.99,
  item_name: '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
duration_secnumberNoTime 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,
  duration_sec: 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
item_typestringNoCategory of the item involved (e.g. 'weapon', 'consumable')
item_idstringNoUnique identifier for the item
Player spends 500 gold on a weapon:
audience.track(AudienceEvents.RESOURCE, {
  flow: 'sink',
  currency: 'gold',
  amount: 500,
  item_type: 'weapon',
  item_id: 'legendary-sword',
});
Player added or removed a game from their wishlist.Event names: wishlist_add, wishlist_removewishlist_add:
PropertyTypeRequiredDescription
game_idstringYesUnique identifier for the game
sourcestringNoWhere the action happened (e.g. 'store', 'search', 'recommendation')
platformstringNoPlatform (e.g. 'steam', 'epic')
audience.track(AudienceEvents.WISHLIST_ADD, {
  game_id: 'game-123',
  source: 'store',
  platform: 'steam',
});
wishlist_remove:
PropertyTypeRequiredDescription
game_idstringYesUnique identifier for the game
audience.track(AudienceEvents.WISHLIST_REMOVE, { game_id: '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
game_idstringYesUnique identifier for the game
game_namestringNoDisplay name of the game
slugstringNoURL-friendly identifier (e.g. 'my-game')
audience.track(AudienceEvents.GAME_PAGE_VIEWED, {
  game_id: 'game-123',
  game_name: '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')
game_idstringNoAssociated 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() callsession_id
track('sign_up', ...), track('link_clicked', ...)session_id 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

Outbound Forwarding

Most data collected by Audience integrations stays within Immutable. The exception is when Conversion Postbacks are configured for a game: attributed game_launch and purchase events are forwarded server-to-server to the configured ad network (TikTok Ads, Reddit Ads). Forwarded payloads contain only the fields each ad network requires for conversion matching:
Forwarded fieldSource
Click ID (ttclid for TikTok Ads, click ID for Reddit Ads)Captured by the Tracking Pixel or Web SDK from the URL when a player arrived from a paid ad
Event name (mapped to the network’s taxonomy)The originating game_launch or purchase event
value and currencyThe purchase event’s value and currency properties
Hashed email (Reddit Ads only, when no click ID is present)The player’s identify() email, hashed with SHA-256
Player names, raw emails, wallet addresses, device fingerprints, session details, and event properties beyond the table above are not forwarded. Only events from players at anonymous or full consent are eligible. Forwarding requires explicit per-game configuration in Audience Hub; no postbacks fire for games without an active configuration. See Conversion Postbacks for setup, supported networks, and delivery monitoring.

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 games on PC and mobile.

REST API

Send events from your backend or game server

Conversion Postbacks

Send attributed conversions back to ad networks to improve campaign optimisation