r/joinsquad • u/ceaseless_horror • 1h ago
Discussion Squad has no real answer for team stacking, so I spent a year building one
TL;DR: Squad has no native skill balancing system, so games often end up as snowbally stomps. Over the past year, I've been developing a 4-plugin suite (TeamBalancer, EloTracker, SmartAssign, and Switch) that tracks real player skill (TrueSkill) to scramble teams, assign players as they join, and prevent team-switching abuse. Since disabling native ChangeTeam functionality and running the full suite, we've cut 150+ ticket blowouts by over 15% and functionally eliminated team-stacking complaints, with nearly zero admin intervention. My plugin suite (SlackersSuite) is open source and highly configurable. If your server is having team balance issues, you might see success giving it a shot.
---
Hello fellow squaddies! My in-game name is Slacker and I've played Squad for about 7 years at this point. I've accrued over 9.5k hours on servers like 56, Xpats, gmg, and now finally Northern Lights (henceforth NL). I'm highly competitive and really love the strategic depth and breadth that Squad offers. That being said, Squad has one glaring flaw that I've been raging against for literally years at this point.
Squad's laissez-faire approach toward skill balancing causes a vicious cycle with several contributing factors that make games inevitably turn into stompy steamrolls:
- Brain drain: Competent players often get frustrated with incompetent teammates, causing them to change teams or leave the game.
- Abandonment: When a team is losing badly, they often lose players (leaving or team-changing), causing potentially less skilled people to join the same team. Over several games, this organically causes people to migrate away from the losing team, making the balance problem even worse as the match progresses.
- The "friends" excuse: "I want to play with my friends" is a commonly used excuse for switching to the stacked team. The team with the more experienced players will almost always have more people you recognize, simply because they've played the game more. It's a very organic mechanism that results in team stacks even when nobody intends to team-stack. Worst case, their intention was to team-stack, and being "friends" with someone on the other team is a good enough excuse to skirt any criticism.
- No tools: There's no in-game mechanism for rebalancing teams, so admins often have to politely ask groups of players to switch. That assumes people will actually listen when asked, and that admins can eyeball-balance effectively. Even when there is a programmatic solution, the balancing that happens is largely blind and random, making it a coin flip whether it improves or worsens things.
- Permissive switching: Squad's native team-changing mechanism (~ChangeTeam) is extremely permissive, letting people switch every 5 minutes. Someone can change teams 10+ times in a single game if they want to.
All this to say, there's a real problem with the way Squad handles team skill balance. Left alone, we get an organic vicious cycle where one team progressively gets worse over time. What's more, Squad provides no real recourse for admins trying to host fair, competitive, and interesting-to-play games. I used to argue that team stacking was a community problem we all needed to actively combat, but that was an overly optimistic take. I now believe it's impossible to fix without intelligent, reactive server tooling.
Long story short, myself and the admins on Northern Lights have, over the past year, been progressively developing a comprehensive team balancing solution I'd like to share with you all today.
TeamBalancer: the first attempt
It started as a simple project to replace the proprietary team-scrambling plugin we were denied when NL was founded (from the ashes of gmg). I built the first version of TeamBalancer, which tracked consecutive wins/stomps and mixed the teams up with a fairly naive heuristic. It preserved squads so it didn't split up friend groups, but beyond that wasn't very intelligent. The idea was that since we had no real data on the players, the best we could do was shuffle the deck and hope the teams were balanced after the dust settled. This had mixed results: sometimes it worked great, other times it just made things worse.
EloTracker: giving it a brain
It became evident we needed a smarter solution than hopes and prayers. This led me to design and build EloTracker, a plugin that implements Microsoft's TrueSkill algorithm and wires player skill data into TeamBalancer so it can actually balance teams intelligently. It took a few weeks of tuning the algorithm and collecting player data before the system started accurately predicting match outcomes. TrueSkill was built for games with far fewer players per team, so it only takes win/loss and overall team skill into account, which means it takes a lot of games before a player's estimated skill is known with any certainty.
That said, I deliberately resisted adding metrics like kill/death ratio to speed up that certainty, because all that actually matters is whether you win or lose. I've seen SLs spend a whole game carrying the team with support work (HABs, resupply, yelling at goobers in command chat) while finishing the game 0 kills, 3 deaths. Margin of victory isn't considered either; a win is a win regardless of the ticket difference. Injecting my own beliefs about what it means to be "skilled" in Squad, and trying to balance for those metrics, could arguably worsen the predictive accuracy of the algorithm rather than help it.
That said, in the future we hope to implement TrueSkill2, which addresses a lot of the shortcomings of the original algorithm: it accounts for skilled groups of players a bit better and factors in individual performance data (kills, deaths, score) on top of win/loss. I don't mean to shit on the original algorithm, since it works, but it does take a lot of games to gain real certainty about a player's skill.
SmartAssign: fixing the join
At this point I realized one of the only levers left to us was controlling which team a player is placed on when they join. By default, Squad places players on the team with the fewest players, or Team 1. We could do better, so I built SmartAssign, which takes player skill, clan tags, and team size into account the moment a player connects. Before they've even finished loading in, they're placed onto the team with their clan, or the team most in need of their skill (or lack thereof). This gave a marginal improvement in game quality.
Switch: closing the loop
Though TeamBalancer, EloTracker, and SmartAssign did improve ticket differences on NL, the whole system still assumed a certain amount of good faith from players. Nothing stopped anyone from using the native ChangeTeam command, or even the much more permissive !switch command, at any time. We even saw groups of players (whole clans!) switch teams right back after getting scrambled, just to keep the stomp going. We ultimately had to disable native ChangeTeam and build a less permissive but still fair alternative.
We extended the Switch plugin to:
- enforce a longer cooldown
- block mid-game team changes unless you'd just joined
- block team changes the round immediately after a scramble
- run through a queue system so people didn't have to spam the command
After a short period of growing pains, the new and improved Switch plugin is working fantastically.
The results
After disallowing native team changes and forcing players through our improved Switch plugin, we saw the largest improvement in ticket difference to date: a >15% decrease in blowout games (150+ tickets) and a 5% increase in close games (sub-50 tickets). As of today, I believe NL is in the top percentile of servers by ticket difference. It feels a lot more fair and competitive to play, and complaints about team stacking are functionally nonexistent. Best part, it takes nearly zero admin intervention. The whole system is autonomous. It's been literal months since the admins had to manually scramble teams.
Try it yourself
At this point, I know of 4 servers running TeamBalancer + EloTracker. NL is the only one running the full suite (TeamBalancer, EloTracker, SmartAssign, and Switch) and disallowing native team changes. NL keeps player Elo data private, but other servers have set up public Discord channels where you can query player Elo with !elo <identifier>.
The SlackersSuite is open source if you want to run any of this yourself, and you don't need to go all-in to get some benefit out of it. Just running TeamBalancer + EloTracker with native ChangeTeam left on will probably already cut down on complaints and improve game quality. But if you want what we've got on NL, that means disabling native ChangeTeam and running the full suite too. Each plugin has its own setup instructions, so grab whatever you actually need.
If I can do anything, even marginally, to improve game quality and cut down on team stacking across the Squad community, I'd consider that a win. Hit me up on Discord if you have any questions (@real_slacker).

