Quick answer: The search query’s settings must match the session’s advertised settings. Check bShouldAdvertise, presence flags, and that host + client use the same OnlineSubsystem.
A co-op game hosts a session successfully but FindSessions on another client returns empty. The search filter and the advertised session don’t line up.
Advertise on the Host
FOnlineSessionSettings Settings;
Settings.bShouldAdvertise = true;
Settings.bAllowJoinInProgress = true;
Settings.bUsesPresence = true;
Settings.NumPublicConnections = 4;
Settings.Set(FName("GAMEMODE"), FString("COOP"), EOnlineDataAdvertisementType::ViaOnlineService);
bShouldAdvertise is mandatory. Custom settings advertised here must be matched in the search query.
Match the Search Query
SearchSettings->QuerySettings.Set(FName("GAMEMODE"), FString("COOP"), EOnlineComparisonOp::Equals);
SearchSettings->bIsLanQuery = false;
SearchSettings->MaxSearchResults = 50;
SearchSettings->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
Every advertised key the host sets and the client filters on must match exactly — key name, value, comparison op.
Same OnlineSubsystem
Host on Steam, client searching Null subsystem = no results. DefaultEngine.ini → [OnlineSubsystem] DefaultPlatformService must be the same, and both must be logged in.
LAN vs Online
bIsLanQuery must match the session’s bIsLANMatch. A LAN session won’t show in an online search and vice versa.
Verifying
Host a session; another client’s FindSessions returns it. Join works. Test across the actual OSS (Steam/EOS), not just Null.
“Search is a filter against advertised settings. They must match key-for-key.”
For EOS specifically, also confirm the product/sandbox/deployment IDs match between builds — mismatches silently return empty searches.