Skip to content

Analytics Demo

This sample shows event tracking, custom properties, session lifecycle, and how data reaches the server via Nakama RPC, with notes on Satori for games that emit analytics through that channel.

Components

Type Role
IVXAnalyticsManager Singleton-style manager: Initialize(IClient, ISession), RPC-backed events.
RPCs quizverse_log_event, quizverse_track_session_start, quizverse_track_session_end

Setup

  1. Call IVXAnalyticsManager.SetGameId(yourGameId) before Initialize.
  2. After Nakama session is valid:
using IntelliVerseX.Analytics;
using Nakama;

IVXAnalyticsManager.SetGameId("my-game-id");
IVXAnalyticsManager.Instance.Initialize(nakamaClient, nakamaSession);
// Auto-starts session tracking on Initialize
  1. Optionally subscribe to OnEventTracked, OnSessionStarted, OnSessionEnded, OnError.

Event tracking

var ok = await IVXAnalyticsManager.Instance.TrackEvent("level_complete", new Dictionary<string, object>
{
    { "level", 5 },
    { "score", 1200 },
    { "time_seconds", 120 },
    { "difficulty", "hard" }
});

Screen views and purchases wrap TrackEvent:

await IVXAnalyticsManager.Instance.TrackScreen("Shop", new Dictionary<string, object> {
    { "tab", "featured" }
});

await IVXAnalyticsManager.Instance.TrackPurchase("coin_pack_100", 0.99m, "USD");

Custom properties (user dimensions)

IVXAnalyticsManager.Instance.SetUserProperty("player_tier", "gold");
IVXAnalyticsManager.Instance.SetUserProperties(new Dictionary<string, object> {
    { "favorite_mode", "daily_quiz" },
    { "install_source", "organic" }
});

var copy = IVXAnalyticsManager.Instance.GetUserProperties();

Properties are held client-side and merged into payloads as your serialization layer defines; ensure server RPCs accept extended fields.

Session tracking

  • TrackSessionStart is invoked from Initialize (creates a session key and records start time).
  • Call TrackSessionEnd on app pause, quit, or logout:
private void OnApplicationPause(bool paused)
{
    if (paused)
        _ = IVXAnalyticsManager.Instance.TrackSessionEnd();
}

Duration uses Time.realtimeSinceStartup delta.

Error handling

Situation Behavior
Not initialized TrackEvent returns false; warning logged.
Expired session Error logged; returns false.
RPC failure Exception logged; OnError invoked.

Satori integration

For Satori-backed experiments and live ops events, use the dedicated Satori module / IVXSatori where your project wires Nakama + Satori keys. Keep one primary funnel for monetization-critical events to avoid double counting; route debug builds through verbose IVXAnalyticsManager logs only.

Cross-SDK: JavaScript ivx-satori, Godot/Unreal Satori bindings mirror the same event names documented in Satori API.

Logout / reset

IVXAnalyticsManager.Instance.Reset();

Ends session if needed, clears user properties, and clears init flag.

See also