FirstLook SDK Setup
The FirstLook SDK is an Unreal Engine plugin that will allow you to interface with FirstLook from your Unreal game. The plugin currently supports Steam login, in-game surveys, session tracking, custom events, and custom duration events.
The primary access point for the FirstLook SDK is the UFirstLookSubsystem which exposes a number of methods and delegates used to interact with FirstLook.
For this setup guide, we will assume you have an Unreal game project named MyGame.
Prerequisites
Section titled “Prerequisites”Acquire the FirstLookSDK from the admin dashboard.

- Generate Unreal SDK configs.

- Setup your Steam game in FirstLook. See the Steam Integration.
Invite a test player to your playtest with their Steam account linked. See the Inviting Players.
Setting up the FirstLookSDK Plugin in Unreal
Section titled “Setting up the FirstLookSDK Plugin in Unreal”Now that you’ve acquired the FirstLookSDK and set up your game in FirstLook, we can install the plugin into your Unreal project.
Move the
FirstLookSDKplugin toMyGame/Plugins/FirstLookSDK. Create theMyGame/Pluginsdirectory if one does not already exist.Register the
FirstLookSDKplugin in theMyGame.uprojectfile."Plugins": [{"Name": "FirstLookSDK","Enabled": true}]Add the
FirstLookSDKplugin as a dependency in theMyGame.Build.csfile.PrivateDependencyModuleNames.AddRange(new string[] {"FirstLookSDK"});In the Unreal Editor, configure the
FirstLookSDKplugin settings forFirstLookApiURLandFirstLookClientURLunder:Edit > ProjectSettings > Plugins > FirstLook
Alternatively, configure the plugin in the
DefaultGame.inifile:[/Script/FirstLookSDK.FirstLookSDKSettings]FirstLookApiURL="https://api.firstlook.gg"FirstLookClientURL="https://<game-slug>.firstlook.gg"(Replace
<game-slug>with your FirstLook game slug)
To find your client URL, check your domain from your FirstLook settings:

Configure
OnlineSubsystemSteamin theDefaultEngine.inifile.[OnlineSubsystem]DefaultPlatformService=Steam[OnlineSubsystemSteam]bEnabled=trueSteamDevAppId=<steam-app-id>(Replace
<steam-app-id>with your Steam app ID)Setup Unreal
CommonUI.Follow Step 1 of this guide to set the default
Game Viewport Client ClasstoCommonGameViewportClient.
Testing out FirstLook Steam Login
Section titled “Testing out FirstLook Steam Login”Now that the FirstLookSDK Unreal plugin is properly setup, FirstLook Steam login will work out of the box since it is automatically called during the FirstLook subsystem initialization. There are just a few steps we need to take in order to test the integration locally.
In the Unreal Editor, enable logging for Standalone Game mode
Under
Edit > Editor Preferences, navigate to:Level Editor > Play > Play in Standalone Game > Additional Launch ParametersAdd
-logas a launch parameter

Play as Standalone Game
In the output log, you should see log line indicating a successful login from the
LogFirstLookSDKlog categorye.g.
LogFirstLookSDK: Verbose: Login succeeded.
Session Tracking Labs
Section titled “Session Tracking ”The FirstLook SDK automatically tracks player sessions without any additional code on your part. A session begins when the UFirstLookSubsystem initializes, and ends when the game client shuts down gracefully. Players who haven’t created a FirstLook account yet are still tracked — they’ll appear as Unlinked players in your dashboard, with their Steam account associated if they’re signed in.
Once sessions are being recorded, you’ll see player activity and session duration data on the Analytics page under the Retention tab, as well as on each individual Player Profile.
Custom Events Labs
Section titled “Custom Events ”Beyond automatic session tracking, you can instrument your own gameplay events to capture whatever matters most to your studio — hero selections, match outcomes, store purchases, and more. Use the PostCounterEvent method on the UFirstLookSubsystem to send a named counter with an integer value:
UCLASS()class FIRSTLOOKSDK_API UFirstLookSubsystem : public ULocalPlayerSubsystem{public: // ... UFUNCTION(BlueprintCallable, Category = FirstLook) void PostCounterEvent(FString CounterName, int32 Count); // ...}Example
Section titled “Example”Below is an example of posting a counter event from a UCommonActivatableWidget. In this case, we’re recording that a player selected a hero from the loadout screen:
void UMainMenu::HandleSendCounterEventClicked(){ if (ULocalPlayer* OwningLocalPlayer = GetOwningLocalPlayer(); OwningLocalPlayer != nullptr) { if (UFirstLookSubsystem* FirstLookSubsystem = OwningLocalPlayer->GetSubsystem<UFirstLookSubsystem>()) { FirstLookSubsystem->PostCounterEvent("loadout.hero-a-selected", 1); } }}Naming and Grouping Events
Section titled “Naming and Grouping Events”Event names follow a <category>.<event-type> convention. When you use this pattern, FirstLook will automatically group related events together on the Analytics page and on Player Profiles, making it easy to browse metrics by category.
Choose a category namespace that reflects where the event occurs in your game — for example, match, lobby, menu, store, or in-game. You’re free to define as many categories as you need.
Custom Duration Events Labs
Section titled “Custom Duration Events ”Counter events record that something happened, but sometimes you need to know how long something took. Duration events let you measure elapsed time between two explicit points in your game — a match, a loading screen, time spent in a menu, or any other span you want to track.
The SDK exposes a StartDurationEvent / EndDurationEvent pair on the UFirstLookSubsystem:
UCLASS()class FIRSTLOOKSDK_API UFirstLookSubsystem : public ULocalPlayerSubsystem{public: // ... UFUNCTION(BlueprintCallable, Category = FirstLook) void StartDurationEvent(FString DurationName);
UFUNCTION(BlueprintCallable, Category = FirstLook) void EndDurationEvent(FString DurationName); // ...}Call StartDurationEvent when the activity begins and EndDurationEvent when it finishes. The SDK handles timing and delivery — you just provide a name.
Example
Section titled “Example”Below is an example that tracks how long a player spends in a match. StartDurationEvent is called when the match begins, and EndDurationEvent when it ends:
void AMyGameMode::OnMatchStart(){ for (APlayerController* PC : GetWorld()->GetPlayerControllerIterator()) { if (ULocalPlayer* LP = PC->GetLocalPlayer()) { if (UFirstLookSubsystem* FirstLook = LP->GetSubsystem<UFirstLookSubsystem>()) { FirstLook->StartDurationEvent("match.round"); } } }}
void AMyGameMode::OnMatchEnd(){ for (APlayerController* PC : GetWorld()->GetPlayerControllerIterator()) { if (ULocalPlayer* LP = PC->GetLocalPlayer()) { if (UFirstLookSubsystem* FirstLook = LP->GetSubsystem<UFirstLookSubsystem>()) { FirstLook->EndDurationEvent("match.round"); } } }}Naming and Grouping Events
Section titled “Naming and Grouping Events”Duration event names follow the same <category>.<event-type> convention as counter events. FirstLook automatically groups them by category prefix on the Analytics page.
Testing out In-Game Surveys
Section titled “Testing out In-Game Surveys”Now that you are able to successfully login to FirstLook, you will be able to use the FirstLook subsystem to trigger in-game surveys.
Create a survey with game client distribution enabled. See the Creating a Survey
Setup a trigger for your newly created survey. See the Setting Up Triggers.
Register the survey delegates in Unreal:
UFirstLookSubsystem::OnNewNativeSurveyAvailable:The
WBP_Survey_Screenwidget should be displayed when this delegate is called. This widget can be found under:MyGame/Plugins/FirstLookSDK/Content/UI_Survey/Widgets/WBP_Survey_Screen.uasset
UFirstLookSubsystem::OnNewBrowserSurveyAvailable:Hooked up by default to show a Steam browser overlay using
UFirstLookSubsystem::ActivateSurveyBrowserOverlay
Make a call to
UFirstLookSubsystem::PostEventwith the trigger you created for your survey. If the trigger condition is met, this will trigger one of the delegates that we setup in the previous step depending on the configured survey distribution channel.