G-Less / Unreal Engine / Integration guide

Unreal Engine SDK integration

Follow one path through installation, project configuration, game instrumentation and delivery verification. Sessions, hardware context and aggregated network quality are automatic by default; runs, progression, matchmaking and game-specific signals stay explicit.

Current version
0.6.0
Protocol
4
Engine
Unreal Engine 5
Delivery
Async, offline replay

01–02

Download and install the plugin

The archive is the complete plugin directory; no installer is required.

Download

Download the current stable GlessTelemetry.zip.

Copy into the project

Extract to YourProject/Plugins/GlessTelemetry

Enable and restart

Regenerate project files, enable G-Less Telemetry in Plugins, then restart the Editor.

03

Connect your project

Add the project ID, append-only write key and release channel to DefaultGame.ini. The endpoint always uses g-less.com.

No project yet? Create one first; G-Less will generate a one-time write key and return you here.

Create or select a project
Config/DefaultGame.ini
[GlessTelemetry]
EnabledByDefault=true
CapturePlatformAccountId=true
Endpoint="https://g-less.com/api/v1/telemetry/ingest"
ProjectId=YOUR_PROJECT_UUID
WriteKey=gls_pk_YOUR_WRITE_KEY
Channel=demo
BuildId=YOUR_GAME_BUILD
HeartbeatSeconds=30
FlushSeconds=5
CombatSummarySeconds=15
NetworkSummarySeconds=30

Channel

demo · playtest · retail · development

BuildId

Unique for every real build

WriteKey

Append-only; cannot read analytics

04

Instrument the game meaning that matters

The SDK handles launch, hardware context, network quality, heartbeat and shutdown automatically. Mark runs, progression, outcomes, matchmaking and custom signals only at stable game boundaries.
GameTelemetry.cpp · runs
UGlessTelemetrySubsystem* Telemetry =
  GetGameInstance()->GetSubsystem<UGlessTelemetrySubsystem>();

// One application session can contain multiple runs.
Telemetry->StartRun(TEXT("standard"));
Telemetry->TrackProgression(TEXT("tutorial"), TEXT("complete"), 1.0f);
Telemetry->EndRun(TEXT("completed"), FinalScore);
GameTelemetry.cpp · custom data
// Categories and modes are defined by your game.
Telemetry->TrackMatchmakingAttemptWithCategory(
  TEXT("cooperative"), TEXT("quick_match"), PartySize);

TMap<FString, float> Numbers{{TEXT("depth_m"), CurrentDepth}};
Telemetry->TrackCustomEvent(TEXT("digging_progress"), {}, Numbers, {});
GameTelemetry.cpp · economy, progression and combat
// Emit these after the authoritative game action resolves.
Telemetry->TrackResourceTransaction(TEXT("sink"), TEXT("gold"), Price,
  TEXT("shop_purchase"), TEXT("weapon"), WeaponId, GoldAfter);
Telemetry->TrackUpgrade(UpgradeId, TEXT("tool"), OldLevel, NewLevel,
  TEXT("success"), TEXT("gold"), Price);
Telemetry->TrackChestOpened(ChestType, Tier, TEXT("quest_reward"),
  TEXT("opened"), ItemCount, TEXT("gold"), GoldReward);
Telemetry->TrackQuest(QuestId, TEXT("daily"), TEXT("completed"), 1.0f);

// These calls only update bounded in-memory counters; they do no I/O.
Telemetry->TrackDamageDealt(AppliedDamage, bCritical, bHit);
Telemetry->TrackDamageTaken(AppliedDamage);
Telemetry->TrackEnemyKilled(bElite, bBoss);
Telemetry->TrackPlayerDeath(TEXT("enemy_damage"), EnemyCategory);

Application session

Automatic launch-to-exit

Device context

Hardware, language, display and RHI

Run

StartRun → EndRun

Matchmaking

Attempt, result, wait, party

Game systems

Economy, progression, combat and loss

05

Verify the first event before expanding instrumentation

Prove the smallest path first, then add gameplay events so failures stay easy to isolate.
  1. 1Start PIE in the Editor and search Output Log for G-Less.
  2. 2Open Live events and select Editor / Development.
  3. 3Confirm app_started or session_start arrives, then test one run.
  4. 4Run offline, close, restore the network and relaunch to verify queued delivery.
  5. 5Finally test a packaged build and switch back to the player-build filter.

Runtime safety contract

UE HTTP is asynchronous; gameplay never waits for a response.

Hits, damage and kills only update memory counters and upload one 15-second summary.

Offline events use a bounded local queue and replay on a later launch.

Unavailable Steam identity falls back to an anonymous install ID without blocking or crashing.

After opt-out, public calls become no-ops and unsent data is removed asynchronously.