Half My Connections Never Spawned — And It Wasn't the Server
Players stalled at "loading" and timed out on my Enhanced server. Router, NAT and UDP were clean. The cause was on their side: they'd never launched GTA V Enhanced from Steam, so Rockstar's first-run setup had never happened.
Launch week on Enhanced went like this: people from outside the LAN would connect to Eclipse City, sit on the loading screen, and time out. Roughly half of all connection attempts never produced a spawned player. Everyone on the local network was fine, which is the exact pattern that makes you go and tear your router apart.
So I did. And the router was fine.
What I ruled out first
On 22 July I did the boring work properly rather than guessing:
- A worldwide UDP probe against the server port from outside the network — reachable.
- A hairpin NAT test — the public address resolved and connected correctly from inside too.
- Firewall rules — nothing dropping, nothing rate-limiting.
Router, NAT and firewall exonerated. If you're about to re-diagnose this as an MTU problem, don't. I've been there and it's a day you won't get back.
What it actually was
Players who had never launched GTA V Enhanced from Steam before connecting. Rockstar's first-run setup — the bit that happens the first time you launch the game through the store — hadn't run on their machine. The Enhanced client gets as far as "loading" and then has nothing to load into, and the server sees a connection that never completes its handshake and times it out.
It never showed on the LAN because every machine here had launched the game at least once. It showed on half of external attempts because that's roughly the fraction of people who install, see the server in the list, and connect before they've ever run the game.
Nothing to fix server-side. The fix is telling people before they press connect — mine lives in the Discord, where "why is it stuck loading" gets the same answer every time.
The consequence for your numbers
If about half your connection attempts are people who were never going to spawn, then join and timeout counts carry no signal. A spike in timeouts isn't a server problem and a quiet day isn't a fix. I stopped reading them entirely. The number that means something is players who spawned and stayed, and that lives in txAdmin, not the console.
Which leads to a small thing that confuses everyone at least once: joins never print to the FXServer console on Enhanced. They're in txAdmin's server.log. A session can look completely empty in the console window with a room full of people on.
Update, 12 August — the platform moved under this
I'm keeping the original diagnosis because it was measured and it was right on the build it was measured on. But two things changed afterwards and you should know both.
Cfx fixed a server-side join-timeout path. The 11 August patch notes list "Fixed connection timeouts where join handlers failed to fire" and "Second client launch from Steam/Epic now works" — both sitting right next to this symptom. So "never a server bug" was true on the build I had in July, and Cfx has since changed the code that governed it. If you're seeing this today, update first, then tell people about Steam.
There's a second cause that looks identical. sv_resourceFileDownloadTimeout defaults to two minutes and caps how long a client has to pull your resources over HTTP. A player on a slow line, downloading a fat resource set, times out looking exactly like the Steam first-run case. I found this one the day I added an always-on dev tool that put another 3 MB on every join for something only admins can open. Keep your join payload small; every always-on resource is paid for by every player on every connect.
Update, 26 August — the connecting screen is shared
One more join-time trap, because it's in the same place and it's invisible until you look.
Every resource that calls deferrals.defer() gets its own line in the connecting box, but there is only one card. deferrals.presentCard() from resource A is torn down the moment resource B calls deferrals.update(). txAdmin updates five times while it checks its ban list; a QB-style core updates four times on the success path. My queue resource presented a welcome card at t≈0, it was wiped within about 100 ms, and then the queue sat blocked for its full 12-second timer waiting for a CONTINUE press on a card nobody could see. Every join paid 12 seconds of dead time for weeks.
The fix that doesn't require patching txAdmin (which gets replaced on every server update anyway) is to re-present the card on an interval so you're the last writer. That's only safe for a card with no Input.* elements — re-presenting resets input state, which is the documented reason interactive deferral cards are unreliable. Anything that needs typing goes in an in-game NUI after spawn, not on the connecting screen.
FAQ
Why do players get stuck on "loading" when joining a FiveM Enhanced server?
Most often because they have never launched GTA V Enhanced from Steam (or Epic) before connecting, so Rockstar's first-run setup has not happened on their machine. The client stalls in loading and the server times the connection out. The fix is on the player's side: launch the game from the store once, then connect.
Is a FiveM Enhanced join timeout a server or network problem?
Usually not. On Eclipse City a worldwide UDP probe, a hairpin NAT test and the firewall rules were all clean while roughly half of external connection attempts still never spawned. Rule out the Steam first-run case and sv_resourceFileDownloadTimeout before touching the router.
What does sv_resourceFileDownloadTimeout do?
It caps how long a connecting client has to download the server's resources over HTTP. The default is two minutes. A player on a slow line with a large resource set times out looking exactly like the Steam first-run case, so keep the join payload small.
Why don't player joins show in the FXServer console on Enhanced?
They are not printed there. Joins are recorded in txAdmin's server.log, so a console can look empty while players are connected.
Why does my deferral welcome card never appear on the connecting screen?
Every deferring resource gets its own text line, but there is only one card. deferrals.presentCard() from one resource is torn down by the next deferrals.update() from any other resource, including txAdmin's ban-list checks. Re-present a non-interactive card on an interval, and put anything that needs typing in an in-game NUI after spawn.
If your Enhanced server has a mystery timeout rate, do the three checks above, then ask the next person who stalls whether they've ever launched the game from Steam. Tell me what you find on Discord — I'm still collecting cases.
More posts.
Cfx Publishes Patch Notes for Enhanced — I Was Diffing Binaries Instead
Every FiveM Enhanced update gets a post in the citizenfx/rfc Discussions. I'd read one of ten. Reading the rest found five "permanent platform facts" in my notes that upstream had already fixed.
FiveM Enhanced Has No Asset Escrow — Every FXAP Resource Is Dead on Arrival
The Enhanced server hands encrypted files to the Lua compiler as raw bytes. How to spot an escrowed file in four bytes, why half-encrypted resources freeze clients instead of failing, and what I did about it.
Why I Use QB-Core Over ESX (And When You Shouldn't)
After trying every framework out there, I settled on QB-Core. Here's why—and the honest trade-offs you need to know about.