Zwift has just posted a slate of races happening between February 21-28 which will test a new category enforcement system. Races will happen multiple times each day, with each day featuring a different popular race course.
See upcoming Category Enforcement Races on ZwiftHacks >
The big news here isn’t the test events themselves, though. Rather, it’s that we’re seeing Zwift test some much-requested category enforcement features! So let’s dig into what this means and how it works.
The Why and How (Big Picture)
In Zwift’s current racing ecosystem, any rider can join any category of any public race event. That means a super-strong A-level rider could join the D category, win the race, save their activity, and never be alerted to or warned about any issues. This lack of in-game messaging/enforcement has logically led to races being negatively affected by sandbaggers as well as ignorant n00bs who simply haven’t taken the time to understand how Zwift race categories work.
Category enforcement aims to stop riders from racing in categories below their ability level. It does this by looking at their historic power numbers and disallowing them from entering these lower categories. Or to put it another way: category enforcement assigns you a minimum category for the race, based on your historic power data.
[adinserter block=”1″]
How Category Enforcement Works (the Details)
Before we discuss any details, it’s important to mention that Zwift Category Enforcement is a FutureWorks project and therefore a system in flux. Next week’s events are the very first events of their kind, and will surely lead to feedback and modifications of the system.
With that said, here’s more information on how it currently works…
Category Enforcement assigns you a minimum race category based on the last two months of power data from your Zwift rides. (If you have no ride data, you will be placed in the A category. Ouch!)
Categorization is based on your estimated VO2 Max, MAP, and FTP.
Signup options for categories below your ability level will be disabled. As an example, here’s what the signup screen looked like when I visited today. I’m a B according to ZwiftPower, but with the current Category Enforcement parameters, I’ll be racing in the A’s!

Riders are free to “race up” and join higher categories than their minimum. Category Enforcement simply removes your ability to sandbag in a lower category.
Good News x2
I think you’ll be hard-pressed to find a Zwifter with something negative to say about this Category Enforcement announcement. Why? Because it’s a development that should make Zwift racing better in two ways:
- First: it will obviously reduce the number of sandbaggers, which makes races feel more realistic and lets legit riders compete for the win.
- Second: it will make categories more competitive by fine-tuning the parameters used to categories riders. ZwiftPower’s current FTP-based categorization is better than nothing, but it could be much better. For example – it doesn’t account for riders with huge VO2 power but relatively weak FTP, thereby allowing those riders to excel in races which are more VO2-focused, like courses with punchy climbs or shorter “sprint” races.

Looking Ahead
We could be seeing the start of a paradigm shift in how Zwift races are categorized. Think about it: in theory, categorization could be based on an entirely different set of parameters – sprint power, weight, age, 1-minute power.
Parameters could be tuned to fit the course. A race up Epic KOM? Make 20-minute w/kg the deciding factor. Crit City? Sprint and 1-minute power are key factors. 40km TT? That’s all about your FTP.
Eventually, Zwift could put these Category Enforcement options in the hands of event organizers who could break riders into categories based on whatever parameters they prefer. And that will open up a fresh variety of Zwift races to our community.
But we’re getting ahead of ourselves. Let’s finish some test races first!
Feedback Requested
Zwift has asked that riders fill out this feedback form after their Category Enforcement race(s), so the team working on these features can quickly iterate and improve on this initial offering.
This is a vital step, so don’t miss it. Give them your feedback, even if it’s to simply say, “It worked well!”
More Information
For more information on these events, including a comprehensive FAQ and an opportunity to discc, see this post on Zwift’s forum.

See upcoming Category Enforcement Races on ZwiftHacks >
Questions or Comments?
Share below!

This isn’t a good idea. You Cat changing depending on the type of even use daft.
They should have a cat system more like real life purely based on results in races with ftp adjusted higher as an alternative parameter that gets you into a category of race.
Still just working within a broken system. Even if other metrics like 1 minute power are added, the idea of categories that are based on pseudo-measurable performance metrics is dead on arrival. You are always normalizing across a sub-space of the variables that are important. So right now the categories neutralize climbing ability, but adding other metrics will just select for other differences. Part of the joy of bike racing is that you aren’t suited to every type of race, and you have to work differently depending on the parcours. The only metric that matters is who wins and who loses. Zwift needs to implement results based auto-categorization that groups riders in a race based on an algorithm to make the race competitive. This is not rocket science and has been used at least a decade in other online competitive video games. Every time I play a first person shooter I am playing against people that are about as good me and I enjoy the competition. I don’t have to look up some measure and place myself in some category. Heck, the ZRace guy has already trained the classifier. Zwift should just buy him out (or do the same thing, it’s basic machine learning). Then instead of signing up for a race AND a category, you just say, I want to race at 8pm, the machine learning classifier is used to predict race results immediately before race launch, divide the racers into competitive pelotons, and send them each off separately. It’s really not that hard.
100% agreed. Results are the key. According to Zwift Power I’m nearly A+ yet I get destroyed every week in ZRL A1! And it’s not fun to feel like you have zero chance against the field. It makes no sense to double down on already flawed metrics.
The survey you linked to seems to be specific to someone who has just completed an event. Several questions ask “did you finish this event with …” Are you sure the link is good for any of us to be filling out?
Oh, I get it, I’m supposed to race one of the events and then fill out the form. Nevermind.
I’m excited about this idea. While I’d love to see something like this (or better yet, performance based categorization) as soon as possible, I’m going to seemingly contradict myself and say that I wished they’d start it a week or 2 later. Put it after the ZRL finishes, and you might have a whole lot more participation. It looks like my team will have a full roster and I’ll be sitting out the final race of the season, so I might be able to squeak into the last day of the race, but I’m trying my darndest to stick to a new plan that has me limited to at most 2 race days (and maybe 1 hard workout) with the rest of the week Z2 and my other race is set as well. Once the ZRL ends, I bet they’d have a bigger audience. Especially if they started it the week right after the ZRL ended. “Hey, your team didn’t make the playoffs and you’re looking for what to do next? Come try out our new test of Category Enforced racing.
On the other hand, I’ve heard from a lot of folks who just finished the Tour de Zwift and are now trying to figure out what comes next and if that includes racing, so maybe this is the right time after all, if that’s the audience you want to capture (especially if getting the sandbaggers out of D helps onboard a lot more new racers).
This is a nice and much needed step forward and eliminates obvious sandbaggers and unintentional sandbaggers both. Wish they would just add a 5th or 6th category. 0-1.99, 2-2.75, 2.75-3.25, 3.25-3.75, 3.75-4.25, Pro (4.25+).
This… And maybe add some other categorization possibilities… As a rider way over 110kg my w/kg will always be rubbish. Competing against a 75kg guy at tour de zwift he killed me on every climb. Yet in the flats he did 2.5 W/kg and I was faster at just 1.9 w/kg…
Would be really interested in a race against people of similar statue to find out how I match up against them
zwift for a very long time has nerfed the lighter rider – imo to combat the weight doping issues; and 90% of the races dont have a climb hard enough to rip the “fat guy” out of the bunch. there’s usually always a 100+ dude, you can stay in the pack on a <5 min climb – then he's coasting after that.
Quite common that that 100 kg rider is inverse weight doping to stay in the Cs or Bs. Enough w/kg power to just about hold on on the climbs and then blast away on the flats on ridiculous raw watts that would be typical of an A rider/
I’m intrigued but our team has done some weight-doped activities within our own Meetup and now Club tools. Again, this is only against ourselves so no one is cheating in actual Zwift races, but we’ve basically leveled the playing field so everyone’s weight is equal to 4.0 w/kg. This has proven to be great at giving newer racers the chance to race and learn alongside their faster, stronger teammates. Jersey changes and Discord chats split between squads take it to the next level, but my fear with this update would be if Zwift is pulling ride data from all Zwift rides and not just races is that going to force C and D riders into A or B categories because their w/kg was artificially “inflated” with our weight-doping?
Still interested in the idea as we’ve all been there where someone is drilling it off the front at an absurd w/kg. Even if they’re DQ’d on Zwiftpower they’re still often influencing the race and towing competitors along.
As above, performance based categorisation, nothing else makes any sense 🤷♂️
As in based on your racing results, to be clear!
Hey Eric,
How about a poll on what racers actually want for categorization?
I too believe a performance based solution is the only answer.
Where I am we have a big MTB marathon series which is usually A to E categories so your first ever race you will be E and your finish position decides the category you start in next time.
So for me even though I am usually an A category rider I didn’t race the series last year and my points total has dropped so I will probably start in C or D until I get points again.
Best thing is that a fast 60 year old experienced racer can be racing A and a beginner 23 year old isn’t forced to start in the cut throat A’s until he is ready.
Isn’t the biggest thing we learn from this is that Eric is sandbagging as a B? 😉
Thanks for sharing, it is at least a step in the right direction, but results base would be better once someone has a baseline of a few races.
Yes, I think that’s the big takeaway for sure. 🙂
It does seem to do a good job of picking up the better racers. I have an ftp of 3.95w/kg on ZwiftPower, but all my best power figures have been achieved in 10 mile TT’s. However I’m not able to put in the big 2-5 minute efforts that the top B cat riders can. Consequently I’m still able to enter cat B for these test events.
Apparently Zwift retooled the power windows after the initia signups. I’m now a B!
When I checked right after the article appeared I was minimum category C. Just checked this AM and now I am minimum category B. ZP rates me a C currently.
Mmmm what about computer glitches which show in your timeline? I entered a race & for 30 secs (or so) I was doing 2000W yes… thousand, (I video recorded it because I had so much time) & it still shows in my timeline. After that I was given a ludicrous FTP which has never been improved (as you would expect!!). PS I am nearly 60!!
Good call out – hopefully there will be a process to get clearly crazy numbers like this removed from the model
How about some actual age group racing. I’m 70 frigging years old
Filter for ZHR races on Zwiftpower…
Yes I can definitely recommend the ZHR masters events. However there’s some amazing older gentlemen on there, tonight I just managed to outsprint a 78 year old with an ftp of over 4 w/kg, and is in cat A.
Tell me… there’s a 60+ guy that does over 5 w/kg and uses IRL masters titles from a small state as his only justification. Yeah champion from a race of 3-6 people in a non-competitive state for masters racing. IRL same guy has problems holding onto a senior Cat4 pack. Multiple Zwift DQs and been suspended in the past, but still out there and affecting/winning races at 5+ w/kg. Real life capability is probably around 3 w/kg.
There are actual masters world champions where I am who are 50+ and have a true 5+ w/kg FTP. The more people like that in the races the better because it’s real – that’s what racing against these guys is like. They can steamroll it for sure.
But why can’t Zwift stop the people like in your example and mine? That’s more important for A+/A and age category racing than category enforcement.
And I’m 78. And how about club rides that are filtered for must be “70 and over”
and some senior hair styles.
Agree! Triathlon has top ten finishers based on finishing times, then all other racers are placed into their appropriate age group category to determine age group winners. Power number sandbagging, weight cheating will no longer impact races. Being a Top 5 Age Group Champion in a race should be recognized by Zwift with official Age Group result’s.
Don’ give me that age rubbish. Group categories have to be by performance – I road race with a bunch of ex pros some of whom are in their 60’s and they will school you any day!
I would love to see categories based on ranking points. Your category changes as your ranking changes. Someone performing relatively well in races will improve their ranking and eventually move up, and vice versa.
Remove the w/kg from the equation and have people race others with a similar ranking. I think it removed the incentive to sandbag as well. In order to sandbag you would have to intentionally perform relatively poorly in a race rather than monitor power.
I’d be fine with using W/kg (especially if you combine 1, 5, and 20 minutes) for the initial placing for the first 5 races and then using race ranking once you’ve got 5 results in.
Oh great…ZP has me @ 3.37 w/kg for 20 min power. That makes me 3.2015…
I think, an Autocat system is perfect for single events ! 🤗 … especially if it even depends on different rider types for different routes.
BUT … it would be almost impossible to find a team of 6-12 equal riders for a whole ZRL-season. The diversity with different rider types is THE BIG thing in ZRL, depending team tactics and rider choice every week.
If using the cat enforcement is optional, ZRL can turn it on for the first 4 weeks and then turn it off after that. Sort of like how you can’t cat up until after your 4th race under the current rules. Or they could just leave it off and only allow the event-specific links to go to people who meet their rules.
Dynamic categorization please! This mid-to-low C would love for fields to be divided equally based on number of riders, so sometimes I would be a C, sometimes a D, maybe once in a weak field a B, and my chance to do well would vary accordingly.
I’m really hoping this is the next step – allowing race organisers to determine how the pens are split (and even which metrics are used).
I would like to see the equivalent of zpoints while racing. That way I can try to gain places on people near my ability, like a ladder league.
It’s not always about the winning, for me, the casual racing is about motivation to improve fitness.
That’s why I like mass start races where all cats are together in E. Once the race is done, I can look at the people around me and see if I “should have been” racing with them, beating them, or behind them. During the race, all I care about is finding someone to push myself against and I can look them up later. When I’m a C in a race with As, I know I’m not going to win, so that takes that motivation/stress away and I’m just finding people to push myself against as hard as I can. Those also tend to be the races where I increase my FTP moreso than races when I’m in my own cat, and I’m a low to mid C (2.9 W/kg), so it’s not like I’m sandbagging at the top of my cat and thats why I’m not setting FTP in cat races.
I agree with you
doing TDF my aim in the cat A was to be in the top 50% of those entered in my event.
think ladder idea is one of many options
encourage people to do more events
There’s going to be winners and losers with any type of categorization. And there will always be people who complain that there are people playing the system (sitting at the back of a bunch then going for the sprint. This is no different to IRL racing. This is moving towards the “everyone gets a trophy” where we all get awards for participation.
Before this system, every category had a trophy for places 1-3. Explain how everyone gets a trophy now. I didn’t see that changed mentioned anywhere.
Well, if you hoarded all the trophies in the old system by racing down a cat and now can’t do that, more people (if not everyone) will have a shot. Maybe that’s what they’re implying. They don’t get to keep all the trophies anymore, so they’ll go to more people.
I think more categories (like some events are doing now with great success IMO) would help with this problem also.
Exactly! That is simple and effective.
Why not make racing like a game with levels and badges. They could have a special map like California, Everest, and Italy where all racers get filtered for power outputs, weight/height, age, experience and results. So, on the x-axis every rider measured for W/KG but also considering height and weight effects. Then on the y-axis consider age and experience. Then on a 3-D axis consider race result points vs level of competition. That way some of the game dynamics will categorize the racers and group them with the best fit based upon the population that sign up.
I am looking forward to where this may take us. Personally I think its a good start if it helps innocent occasional racers find the right Cat to join and filters upward any looking for an easy win I am all for it
Yeah, but I just want to ride. Sometimes I might join a race, but I just want to ride. Podiums are nice but personal gains are nicer
You can still just ride.
Exactly. But some people like to sign up for races a cat or 2 down to do their “just riding” and won’t be able to do that any longer. That bums them out. I prefer to do my just riding with a pace partner or off by myself, but some people feel the need to be in a race every time they’re on Zwift.
For those interested in how the categories are calculated, I have worked with Flint to create a detailed post here: https://forums.zwift.com/t/category-enforcement-how-is-my-category-calculated/577337
I flop continually between a c and b (currently a “c” on Zwiftpower) as I’m right on 3.2w/kg give or take 0.1. Would rather a couple more categories be introduced as someone mentioned further up this thread but appreciate that someone will always be on the “bubble” between categories. However, if the gaps were narrower there would be more incentive to race in the higher Cat. I know it should be all about the self improvement etc but at the moment there’s no way I’m ever getting to the sharp end of a genuine B race which is a bit demotivating.
While I love the idea of trying to reduce sandbagging, I also foresee issues with any solution. Under the current Zwiftpower system (and any future system I expect), within each category, the winners will always be those who stay just below the threshold for the next higher category. So for instance a D who puts out 2.49W/kg will be fine, but another who pushes just a little harder and manages 2.51 will get DQ’d from the race? I suppose you could say no, that person would not be DQ’d, just bumped to the next category on the next race they do, which means they would likely be dead last next time. So there is a bit of a perverse incentive for someone to sandbag themselves within a race just to stay under the limit, thats crazy. Its great to get upgraded to the next cat, but a pretty major bummer to get DQ’d for getting more fit. How do you fix that?
Results based ranking. You win enough times and you move up until those results expire. If your results in the higher category aren’t strong enough to support you staying there, you move down after 90 days or whatever. If they are strong enough, you stay there and keep racing. I have a hard time seeing sandbaggers or cruisers coming in, winning 3-5 races and then taking the next 3 months off just so they can go back down a category and win 3-5 races again. Sort of defeats the purpose if you’re having to lose a ton or not race at all for 90 days just to get the high of those 3 wins. That’s pretty much the only way to get rid of cruisers. This will at least get rid of those who are just blatantly racing in the wrong category, which is a decent (although very delayed) first step toward that.
Although Zwift is a video game at heart it does try to mimic real world riding so having a system that catches unrealistic power numbers is essential to fair events. With that being said there will be riders on the rise and they will quickly CAT up just like in real life…those riders are not the issue its the ones who have crazy 20 minute and 5 minute power but use down time in the race to get below the top number in the class. If you are a CAT B racer you can totally do 5.5 w/kg for five minutes…but you should be dead after that…like not able to turn the pedals. Same with CAT B riders who do over 4 w/kg for the first 20 minutes…if you are actually a CAT B racer you would be completely blown up after an effort like that…you aren’t recovering in the peloton at 3.4 w/kg. I just want to see physical performance that mirrors real life. So here is to hoping that zwift makes some hard caps that if you exceed them you move up…end of story. If you do 4 w/kg for 20 minutes you are an A; if you do over 5 w/kg for 5 minutes you are an A.
As long as there is a watts per kilogram system of classification it can be manipulated. According to the current system I would have been competitive in the zrl pro race on climbers gambit. Many of the pros had an average w/kg range of 4.0-4.5 at the finish even though they rode up the final Kom at 6+ w/kg. We’re trying to fix an inherently broken system. It needs to be performances based just like the uscf or UCI.
I’m excited to see this implemented.
I Cat E should be only Cat accessible to unranked riders.
Starting out in A is gonna be horrible for user adoption.
Easy to avoid. Just do a ride or two. Any ride – except apparently workouts.
This won’t really help. Why not just have categories similar to normal riding. Beginner, Intermediate, Advanced, Elite and of course Masters and Everyone races. As a D, almost C racer, I expect to be nearly last in any race I do outside. Which is similar to the result I get in any combined race. It is still fun trying to see how long I can keep with the big boys before I get dropped. And if you really want to keep things competitive, have qualifiers and elite races. To keep things fair (as we all pay the monthly fee), you could break the elite races into age groups. I would even go as far as losing the A-D tags on riders. There can be other visual indicators that tell you someone is a good or experienced rider.
Thanks Eric! Looking forward to seeing how the tests go.
A is way to big a range. If categories are going to be enforced there needs to be more categories. I am pretty light, and the only way to match up is on climbs, but how many races are going up epic, and I would like to race parcours.
All the categories are too wide. The jump from one up to another is huge – which is probably one of the big reasons there were so many sandbaggers.
Excellent! One step at a time. I happily accept the bottom or top of my pool as indicated. But you can’t even race with those sandbagging.
Being assigned one category for all racing events of differing duration, parcours, races and TTs will simply mean many will focus their efforts on what they consider the more fun and what they are most competitive in.
Not to mention the mindset for a race versus a TT is vastly different for many of us, in a race you would normally try and put out the least power to stay with opponents, while in a TT you are trying to put out a fairly steady power perhaps with a slight negative split harder finish.
Some sort of ranking system, similar to the ELO system used in chess, could look at your finishing position relative to others. If you finish ahead of someone with a higher ranking, you get a tasty ranking boost. If you finish ahead of someone with a much lower ranking you get peanuts because the pre-race rankings says you should beat them everyday of the week. If you lose to someone with a lower ranking, your post-race ranking will decrease. The net ranking change after a race will depend upon how you did against everyone you were competing with… So a lot of number crunching for big field events!
As a general principle, I think more riders will compete in a wider variety of events, if there are a number of different category assignments or rankings. So someone with relatively stronger raw Wattage can be ranked in a higher category for relatively flat courses like Innsbruckring, but will be ranked lower for a race up Mountain because of their lower W/kg and vice versa for a lightweight rider.
Yes!!!!!!!
I am so happy to hear they are finally doing this I don’t even care about having to race in A once….or any time I stop training and then come back.
Side story. I raced against Eric min in a previous iteration of their future works anti sand bag testing…I called him out for reaching out of category haha😅… He was obviously just there to see house it went, but It was worth a chuckle.
Well, are we in a world of data mining right?!… let’s use this to make the game more interesting I’d said.
I believe racing with people as close as possible to your CURRENT abilities will boost your confidence and motivation to “KEEP RACING” as the margins should be really close.
Maybe if the Auto-Cat is telling you race in CAT “A” is because your numbers are showing that you are capable to do it.
But the issue for me is that the range of power per category is too wide.
We should have Higher-End and Lower-End per Category. The MAIN focus is to:
Just an opinion 🙂
Would be interesting if they add some sort of exhibition mode, where you can join a lower category,but won’t show up on results and reduce your impact in the race. I know that it’s easier to convince friends to do things for the first time if you do it with them, but sticking a D into a B race because you can’t race down might not have the effect you’re looking for.
I win a fair number of B races, but I’m also 60 years old. Screw those 25 year olds if they can’t catch me. 🙂
I would love to see this applied to regular Zwift group rides as well. I’m a decent “D” rider but for most of the events in that range I sign up for, half or more of the riders are long gone off the front after the first mile. Checking Zwift Power afterward I see lots of results showing w/kg well in excess of the nominally posted top level. It really ruins the experience for those of us who actually belong in the slower category and I’m sure it discourages a lot of newer riders.
Damn, for some reason I’m being put in B, even though zwiftpower says C? Even at my absolute best I’m barely 3.3w/kg but that was 6 months ago. Throw some recent covid and I’m 2.9 with a HR maxing at 185 (most recent race on Friday).
I was excited about this development but there’s only a smashing coming my way!
As others have said, it’s a start. But if all it took to enforce categories was disabling the + button in the event listing for ineligible categories why has it taken Zwift 4-5 years to do it?
I too am a solid B on ZP and was categorized with the A’s which is great. I’d like to see DNF in the results for all the athletes that quit when they realize they aren’t going to place well, or pop. More than half the field bailed after they got dropped and I’d think that would affect the points.
Just had the best, fairest race ever under one of these races. No I didn’t win or even come close (16th) but it was close and I was part of it the whole way round. More of these please!