Can't find Steam Online Sessions

I’ve been trying to get my project to create/join Steam games for a week now, without success. I feel like I must be missing something basic and obvious, but I don’t know what.

Multiplayer was working successfully over LAN via creating/finding/joining sessions with the null online subsystem. I added Steam by following these instructions, and the game is unable to find any sessions. I’ve tried with and without bInitServerOnClient. Without, the server fails to create the session (even though it’s not a dedicated server). With bInitServerOnClient=true, the joiner can’t find the session. I’ve tried running two copies on the same machine (from the Editor and from the command line), and I’ve also tried the packaged game on two different machines, with different Steam users logged in. I have a Steam AppID, but I’ve also been trying with 480.

I also tried writing the create/find/join code in C++ following this example, so that I could try setting bUseLobbiesIfAvailable on the session. No success.

I read in a couple of places that Steam sessions are broken or at least highly finicky in 4.27, so I created a brand new project in 4.26 and created the simplest multiplayer game imaginable. It works with the null online subsystem, but not Steam.

I thought maybe there was something wrong with the network setup in my apartment, so I tested Steam multiplayer, and I can host and join Steam games with a friend, from this machine.

Sorry this is so long. Thank you for your attention. Any help would be appreciated.

A couple of specific questions:
How does the Steam overlay actually work? That is, how does the game establish a connection to the local Steam client? I’ve noticed that it sometimes doesn’t work. It consistently doesn’t work for some combinations of logged in Steam user, machine and method of running the game, but even for the right combinations it just fails sometimes.

What’s going on with sessions vs. lobbies? I gather sessions are an Unreal thing, and lobbies are a Steam thing, and bUseLobbiesIfAvailable tells Unreal to implement the session by means of a lobby if possible, is that right?

What does bIsLANMatch do in the case of Steam? Does Steam have its own way of advertising games over LAN? I’ve tried bIsLANMatch with Steam, and the joining game can find the session, but complains that the session data is corrupt and fails to join.

Here’s some more information: I can make the ShooterGame example project work with Steam online sessions, but only using its own AppID. With my AppID or 480, it fails. Is there some additional setup that has to be done on the Steam side?

Welp, solved it finally. For anyone finding this in the future, it was something basic and obvious: My other Steam user needs to own the game through Steam. Which is odd, because that’s not true of ShooterGame, and apparently sometimes true of Spacewar (AppID=480) and sometimes not. And sometimes you get an error in the logs like “Could not resolve X to a unique user ID”, but only under very specific conditions. Note also that Steam will happily give you the Steam overlay, let you take screenshots, etc. on a game that you don’t own.

So that’s confusing. You’d think a tutorial would mention something about it.