Skip to main content
Every event shares a common envelope, then a per-type payload:
{
  "event_id":   "uuid-v4",
  "ts":         "2026-06-18T10:00:00Z",
  "platform":   "roblox | steam | unity | fortnite",
  "game_id":    "920587237",
  "player_id":  "hashed-player-id or null",
  "session_id": "uuid-v4",
  "type":       "session_start | purchase | ...",
  "payload":    {}
}
event_id is deduped within 24h, so retries on network failure are safe.

The 13 built-in types

TypeAuto-emitted?Required payloadRolls up into
session_startYes (join)DAU/WAU/MAU, geo
session_endYes (leave)session length, playtime, retention
purchaseManual / gamepass hooksku, priceARPDAU, revenue timeline, top products
performanceYes (Roblox, per session)fps_avgFPS histogram, p5/p50/p95
crashYes (Roblox LogService)stack_tracecrash groups, top crashes
errorYes (Roblox LogService)severity, messageerror feed
ad_impressionManualformat, network, revenue_usdARPDAU-ads, eCPM, ad revenue
brand_zone_enterManualzone_idbrand-zone reach
brand_zone_exitManualzone_idbrand-zone dwell time
equipManualitem idrepeat-equip / brand-asset usage
shareManualshare counts
levelManuallevelstored + searchable (no rollup)
customManualnamestored + searchable (no rollup)
level, custom, and any unrecognized type are stored verbatim and are searchable in the Event Explorer, but are not aggregated into a dashboard.

Examples

{ "type": "session_start",
  "payload": { "country": "US", "membership": "Premium" } }
For complete per-type field tables and validation rules, see the dedicated SDK docs → Event types reference.

Validation rules

RuleBehaviour
purchase missing sku or price422 Unprocessable Entity
Payload with PII-shaped key/value (any depth)422 PII guard
Duplicate event_id within 24hSilently deduped, 202
(platform, game_id) not linked to your team403
Batch size > 500 events413
Monthly quota exceeded429 with Retry-After