I figured out my issue, and it was due to UCommonSessionSubsystem:
I leaned heavily on UCommonSessionSubsystem when implementing my game’s session management. In that class are two calls to ServerTravel: One for hosting an offline session, and the other called after an online session is created. My project effectively does the same thing.
By effectively replacing these calls withUGameplayStatics::OpenLevel with a “listen” parameter, and not writing to PendingTravelURL in my own project, I no longer have the issue.
I think the expected flow for a server is to: Create the session, call OpenLevel with “listen” as the options parameter; and then for each subsequent level change, use ServerTravel. I also don’t think ServerTravel was intended for use in offline play.