Quick notes on Steam AppID in Unreal (from reading OnlineSubsystemSteam.cpp, not the docs):

  • Engine reads only SteamDevAppId (ini, non-shipping builds). The SteamAppId ini key does nothing — no code reads it. It just got copied around from old setup guides.
  • Shipping ignores the ini and uses the compile macro UE_PROJECT_STEAMSHIPPINGID (defaults to 0). Set it in *.Target.cs: Target.GlobalDefinitions.Add("UE_PROJECT_STEAMSHIPPINGID=<AppID>").
  • steam_appid.txt is written next to the exe (Binaries/Win64/, not the install root) from SteamDevAppId, on init, and deleted on shutdown. Non-shipping only, so it only exists while the game runs.
  • Launched from Steam → the client’s env-var AppID wins over the file/ini. That’s why you see “Playing ” even with SteamDevAppId=480. The 480 only becomes your identity on a direct, non-Steam launch.

⚠️ Gotcha: Steam overlay (Shift+Tab) works in Development but is dead in a directly-launched Shipping build → you forgot UE_PROJECT_STEAMSHIPPINGID. With 0 there’s no AppID source (no relaunch-through-Steam, no steam_appid.txt, no env var) so SteamAPI_Init() never attaches. Set the macro and a direct launch relaunches through Steam → overlay + ownership work.

💡 Don’t hardcode the ID in code — Target.cs is C#, read it from the ini with ConfigCache.ReadHierarchy(...).GetInt32(...) so the AppID stays in one place. (Target.cs changes need a full rebuild, Live Coding won’t apply them.)