I won’t be much use to you as a body in the join test, but I’ve shipped a browser multiplayer arena and the capacity question has a shape that might save you organising a crowd 🎮
The coordinated Discord join will tell you something real, just probably not the thing you want. Everyone connecting inside the same few seconds is the most expensive moment your server ever has — handshakes plus a full world-state serialise to N clients at once. So what you will find is your join storm ceiling. Worth knowing, but it says nothing about whether those same people can play for twenty minutes, which is the number you are actually after.
Two things that get you further:
Your ceiling is a bandwidth budget, not a player count. Cost is players x updates per second x bytes per update, and the multiplier that decides everything is whether each player’s state goes to every other player. If it does you are at n squared, so doubling players quadruples outbound and there is no fixed “optimal per server” — there is just the point where your uplink gives out. You can work this out with the two of you and arithmetic, today, without anyone else showing up.
Headless clients beat volunteers. A small script that opens N websocket connections and drives them with synthetic input gives you a repeatable number at any N, any time. That is the difference between finding out once that it broke at 14, and knowing it breaks at 14 and whether this week’s commit moved that. Volunteers are available once, a load script is available after every change.
On the Germany question: “is there lag for distant players” and “do other players move smoothly or janky” are usually the same question, and it is mostly client-side. Someone at 150ms with entity interpolation and a small buffer looks fine, someone at 60ms rendering raw incoming positions looks like a slideshow. If movement is janky now, moving the server will not fix it — and once interpolation is right, server location matters much less than you would expect.
One thing you have not asked about but will meet shortly: most of the time your concurrency is zero, and whoever arrives then concludes the game is dead. Needing a Discord to coordinate a session is an early symptom of that. Worth thinking about what a single arriving player sees, before it becomes the main problem.
When you and your buddy were connected, was the server sending each of you the other’s position as its own message, or one packet containing both? That answer on its own moves your ceiling by roughly an order of magnitude.