Skip to content

Analytics Module

The Analytics module provides unified event tracking across multiple analytics providers with automatic backend integration.


Overview

Namespace IntelliVerseX.Analytics
Assembly IntelliVerseX.Analytics
Providers Firebase Analytics, AppsFlyer, Custom Backend

Key Classes

Class Purpose
IVXAnalyticsManager Main analytics interface
IVXAnalyticsConfig Configuration settings
IVXAnalyticsEvent Event data container

Quick Start

using IntelliVerseX.Analytics;

// Track simple event
IVXAnalyticsManager.LogEvent("level_start");

// Track event with parameters
IVXAnalyticsManager.LogEvent("level_complete", new Dictionary<string, object>
{
    { "level_id", 5 },
    { "score", 1000 },
    { "stars", 3 },
    { "duration", 120f }
});

IVXAnalyticsManager

The central analytics interface that routes events to all configured providers.

public static class IVXAnalyticsManager
{
    // State
    public static bool IsInitialized { get; }

    // Initialize
    public static void Initialize(IVXAnalyticsConfig config);

    // Log events
    public static void LogEvent(string eventName);
    public static void LogEvent(string eventName, Dictionary<string, object> parameters);
    public static void LogEvent(IVXAnalyticsEvent analyticsEvent);

    // User properties
    public static void SetUserId(string userId);
    public static void SetUserProperty(string property, string value);

    // Screen tracking
    public static void LogScreenView(string screenName, string screenClass = null);

    // Revenue events  
    public static void LogPurchase(string productId, decimal price, string currency);
}

Standard Events

Game Progress Events

// Level start
IVXAnalyticsManager.LogEvent("level_start", new Dictionary<string, object>
{
    { "level_id", currentLevel },
    { "difficulty", "normal" }
});

// Level complete
IVXAnalyticsManager.LogEvent("level_complete", new Dictionary<string, object>
{
    { "level_id", currentLevel },
    { "score", finalScore },
    { "time", completionTime },
    { "retries", retryCount }
});

// Level fail
IVXAnalyticsManager.LogEvent("level_fail", new Dictionary<string, object>
{
    { "level_id", currentLevel },
    { "reason", "time_expired" }
});

Monetization Events

// Purchase
IVXAnalyticsManager.LogPurchase(
    productId: "coins_1000",
    price: 4.99m,
    currency: "USD"
);

// Ad watched
IVXAnalyticsManager.LogEvent("ad_watched", new Dictionary<string, object>
{
    { "ad_type", "rewarded" },
    { "placement", "bonus_coins" },
    { "completed", true }
});

Social Events

// Friend added
IVXAnalyticsManager.LogEvent("friend_added", new Dictionary<string, object>
{
    { "method", "search" }
});

// Share
IVXAnalyticsManager.LogEvent("share", new Dictionary<string, object>
{
    { "content_type", "score" },
    { "platform", "twitter" }
});

Engagement Events

// Tutorial step
IVXAnalyticsManager.LogEvent("tutorial_step", new Dictionary<string, object>
{
    { "step", 3 },
    { "step_name", "first_battle" }
});

// Tutorial complete
IVXAnalyticsManager.LogEvent("tutorial_complete", new Dictionary<string, object>
{
    { "duration", tutorialTime }
});

Screen Tracking

public class MyScreen : MonoBehaviour
{
    void OnEnable()
    {
        // Track screen view
        IVXAnalyticsManager.LogScreenView(
            screenName: "Store",
            screenClass: nameof(StoreScreen)
        );
    }
}

User Properties

// Set user ID
IVXAnalyticsManager.SetUserId(userId);

// Set properties for segmentation
IVXAnalyticsManager.SetUserProperty("player_level", "25");
IVXAnalyticsManager.SetUserProperty("subscription_tier", "premium");
IVXAnalyticsManager.SetUserProperty("favorite_game_mode", "battle_royale");

Configuration

IVXAnalyticsConfig

[CreateAssetMenu(fileName = "AnalyticsConfig", menuName = "IntelliVerse-X/Analytics Config")]
public class IVXAnalyticsConfig : ScriptableObject
{
    [Header("Providers")]
    public bool enableFirebase = true;
    public bool enableAppsFlyer = true;
    public bool enableBackendAnalytics = true;

    [Header("Firebase")]
    public bool firebaseDebugMode;

    [Header("AppsFlyer")]
    public string appsFlyerDevKey;
    public string appsFlyerAppId;

    [Header("Settings")]
    public bool logInEditor = true;
    public bool enableBatchProcessing = true;
    public int batchSize = 10;
    public float batchInterval = 30f;
}

Custom Analytics Provider

Extend analytics with custom providers:

public interface IIVXAnalyticsProvider
{
    void Initialize();
    void LogEvent(string eventName, Dictionary<string, object> parameters);
    void SetUserId(string userId);
    void SetUserProperty(string property, string value);
}

// Custom implementation
public class MyAnalyticsProvider : IIVXAnalyticsProvider
{
    public void Initialize()
    {
        // Initialize your analytics SDK
    }

    public void LogEvent(string eventName, Dictionary<string, object> parameters)
    {
        // Send to your analytics backend
    }

    // ... other methods
}

// Register custom provider
IVXAnalyticsManager.AddProvider(new MyAnalyticsProvider());

Backend Analytics

Events are automatically sent to the Nakama backend:

// Backend automatically receives analytics events
// Stored with user context for server-side analysis

// Example RPC for custom analytics processing
await IVXNakamaManager.RpcAsync("analytics/process", new
{
    userId,
    eventName,
    parameters,
    timestamp = DateTime.UtcNow
});

Debug & Testing

Editor Logging

#if UNITY_EDITOR
// Events are logged to console in Editor
// Check Console for: [IVXAnalytics] event_name: {parameters}
#endif

Debug Mode

Enable verbose logging in the config:

var config = ScriptableObject.CreateInstance<IVXAnalyticsConfig>();
config.logInEditor = true;
IVXAnalyticsManager.Initialize(config);

Event Naming Guidelines

Do Don't
level_complete LevelComplete
purchase_item Purchase Item
tutorial_step_3 tutorial step 3
snake_case PascalCase or spaces

Reserved Parameters

Standard parameter names: - level_id - Level identifier - score - Player score - duration - Time in seconds - currency - Currency code (USD, EUR) - value - Monetary value - item_id - Item identifier


Best Practices

1. Event Naming Convention

// Use snake_case for event names
// Use descriptive, consistent names
IVXAnalyticsManager.LogEvent("button_click"); // Good
IVXAnalyticsManager.LogEvent("ButtonClick");  // Avoid

2. Parameter Types

// Use appropriate types
var parameters = new Dictionary<string, object>
{
    { "level", 5 },           // int for numbers
    { "score", 1234.5f },     // float for decimals
    { "name", "Boss Battle" }, // string for text
    { "success", true }        // bool for flags
};

3. Don't Over-Track

// ❌ Don't track every frame
void Update()
{
    // BAD: Too frequent
    IVXAnalyticsManager.LogEvent("player_position", pos);
}

// ✅ Track meaningful events
void OnLevelComplete()
{
    // GOOD: Meaningful event
    IVXAnalyticsManager.LogEvent("level_complete", data);
}

4. Privacy Compliance

// Don't track PII without consent
// ❌ BAD
IVXAnalyticsManager.SetUserProperty("email", user.email);

// ✅ GOOD
IVXAnalyticsManager.SetUserProperty("user_tier", "premium");

Predefined Events Reference

Event Parameters
app_open source, campaign
login method
signup method
level_start level_id, difficulty
level_complete level_id, score, stars, duration
level_fail level_id, reason
purchase product_id, value, currency
ad_watch ad_type, placement, completed
tutorial_start -
tutorial_complete duration
share content_type, platform