Quick answer: OnlineSubsystemSteam refuses to initialize when the Steam client is not running, steam_appid.txt is missing or wrong, DefaultEngine.ini is missing the required [OnlineSubsystemSteam] sections, or the logged-in user does not own the AppID. Use AppID 480 for development, add all three ini sections, and always launch with -log to read the exact failure reason.

You added the Steam online subsystem to your project, built, launched — and the game runs without any Steam features at all. No overlay. No friend list. UOnlineSubsystem::Get() returns null for Steam and silently falls back to Null. The Steam Dev Support forums are full of people hitting this wall, and the underlying cause is always one of five specific configuration problems. Let’s walk through them in the order you should check.

Verify the Steam Client Is Running

The Steamworks SDK cannot initialize unless a Steam client is logged in on the same machine. This seems obvious, but many CI pipelines and clean test environments forget. If you are running the editor in a VM, inside Docker, or on a headless machine, Steam simply is not there — the init call returns false immediately.

During local development, run Steam first, then launch the editor or packaged build. For automated tests that should not touch Steam, keep the Null subsystem active and do not inject the Steam module.

Add steam_appid.txt

Steam identifies your application with an AppID. During development you don’t yet have one (or you have one but the reviewer account does not own it), so Valve provides AppID 480 (Spacewar) as a test ID that every Steam user owns by default. Create a plain text file named steam_appid.txt next to the binary — either UnrealEditor.exe during development or YourGame.exe for packaged builds — containing only the AppID:

# steam_appid.txt
480

No newline, no BOM, no quotes. Just the number. When you ship, replace it with your real AppID. The file is read once at init and never again, so if you change it mid-session you must restart the editor.

Note: the packaged build must contain this file outside the .pak — it is read directly by steam_api.dll, which cannot open files inside the mount. Add it to Additional Non-Asset Directories to Package or copy it in a post-build step.

Configure DefaultEngine.ini

This is the section most people get wrong, because three distinct ini blocks must all be present. Open Config/DefaultEngine.ini and add:

; Register OnlineSubsystemSteam as the default provider
[OnlineSubsystem]
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
; Optional: enable the overlay hook in shipping builds
bVACEnabled=1
GameServerQueryPort=27015

; Register the Steam net driver so sockets use Steam relay
[/Script/OnlineSubsystemSteam.NetDriverSteam]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"

The [OnlineSubsystem] block tells Unreal which provider to treat as default. The [OnlineSubsystemSteam] block turns the module on and provides the dev AppID fallback. The [/Script/OnlineSubsystemSteam.NetDriverSteam] block registers the Steam net connection class — without it, Steam-relayed networking will not work even if the rest of the subsystem does.

Also add OnlineSubsystemSteam to your project’s uplugin plugins list and to the PublicDependencyModuleNames of your Build.cs so the module is actually compiled in:

// MyGame.Build.cs
PublicDependencyModuleNames.AddRange(new string[] {
    "Core",
    "CoreUObject",
    "Engine",
    "OnlineSubsystem",
    "OnlineSubsystemUtils",
    "OnlineSubsystemSteam"
});

Overlay Hook and Test Mode

The Steam overlay is injected by GameOverlayRenderer64.dll at process startup. If another DLL loads before Steam hooks the rendering API, the overlay silently fails. The most common culprit is running the game through a debugger or inside Rider/VS that launches the executable with custom environment variables. To test whether overlay injection is the problem:

AppID Ownership and Logs

The real diagnostic step is reading the log. Launch with -log (or open Saved/Logs/YourGame.log) and search for LogOnline and STEAM. You will see one of these:

“Steam initialization is binary — either every piece lines up or nothing works. Always read the log before you change a setting.”

Related Issues

If Steam initializes but clients still cannot connect to your dedicated server, see Dedicated Server Client Not Connecting. If replication works locally but breaks on the listen server host, check Replicated Function Not Called on Listen Server for the Steam net driver interactions with authority checks.

Steam client running, appid 480, three ini blocks, module in Build.cs. Skip one and the overlay ghosts you.