Zwift races are typically broken into categories so more riders can have an engaging and competitive experience. In theory, categories can be defined using any criteria the race organizer desires. But in practice, Zwift’s Category Enforcement (CE) is by far the most popular way to organize race categories.
Why is it so popular? Well, first because it’s easy to set up, since it’s the default now. But also, it’s the only race categorization scheme where both of these things happen:
- The race event is visible on Zwift’s public calendar (a huge boost to participation numbers)
- Signups to categories are limited based on a rider’s power history (reducing sandbagging/cheating)
Custom Categories Needed
CE works quite well in most cases, accomplishing its goal of grouping riders into competitive groups without allowing any high-powered sandbagging outliers.
Still, since CE’s inception, race organizers have been asking for a way to customize the category boundaries for their events for several reasons:
- Simple subdivision of existing categories (eg, breaking B into B- and B+) creates smaller, more competitive pelotons, as seen in TFC’s popular Mad Monday race series. This is especially nice in popular races with 100+ riders in each CE category.
- Moving category boundaries allows racers to face new opponents, bringing variety to the race experience.
- Changing boundaries means new riders have a shot at the podium. Example: you may be a “weak A” in standard CE, but a “strong B” under another categorization scheme.
- Nonstandard CE boundaries create more competitive groups for certain race types or on certain routes. Example: Zwift Insider’s Tiny Races are only 5-10 minutes long, and almost always end in pack finishes. Basing categories on V02max and perhaps 30-second power makes more sense than including zFTP in the equation.
- Custom boundaries let race organizers be more innovative, creating fresh race experiences.
The Start of Something New
Last Thursday, Zwift’s James Bailey posted the following in an event organizers forum:
Hey everyone,
Thanks for your feedback regarding how you were hoping to be able to further customise the categories within your events – I know some of you have created private events for this purpose.I’m really happy to let you know that you can now customise the following:
zFTP w/kg
zMAP w/kg
Compound Score
Wattage ceilings/floors
VO2maxThe only caveat is that you cannot use zFTP w/kg that would cross the defined boundaries, due to the number of things in the Zwift environment that this touches (and the amount of confusion that it would create).This is something that can only be set at our end.
If you would like to take advantage of this for any of your events please let us know by emailing [email protected]
Many thanks,
James
That’s big news! But there are some important caveats, so let’s dig into what’s now possible, and what Zwift will (hopefully) improve in the coming weeks so we can all fully enjoy Zwift racing with custom categorization.
Limits to Custom Categorization
What Zwift announced last week is just an MVP (minimum viable product) of custom limits for CE event categories. Put another way: this is the most basic version of category customization we’ll ever see, and there’s still plenty of refinement needed.
I applaud Zwift for announcing this feature and testing the waters. This approach is in keeping with what I’m seeing Zwift pivoting toward in recent months: working more closely with the community to develop new features. The way forward is to release MVPs, gather feedback, then iterate on that feedback until the fully-developed feature can be released.
Below I’ve listed what I see as the main “limiters” to this first iteration of custom CE limits. I’ve also suggested some potential next steps to remove these limiters.
Frozen zFTP w/kg Boundaries
James’ forum post says, “you cannot use zFTP w/kg that would cross the defined boundaries, due to the number of things in the Zwift environment that this touches (and the amount of confusion that it would create). This is something that can only be set at our end.”
The current zFTP w/kg boundary between A and B is 4.2W/kg. That is, if your zFTP w/kg is 4.2W/kg or more, you’re an A. If it’s below that (but ≥3.36W/kg) you’re a B. The limit James describes above means a race organizer couldn’t define the B category as going from, say, ≥3.36W/kg to <4.3W/kg, since this would cross the defined boundaries.
This very much limits how organizers can customize categories. Basically, you’re either stuck with the existing zFTP w/kg parameters, or you can subdivide your categories into smaller ones (for example, making B into a B- from ≥3.36W/kg to <3.8W/kg, and a B+ from ≥3.8/kg to <4.2W/kg).
Feature request: let organizers move the zFTP w/kg boundaries anywhere they’d like.
5 Parameters
Categories can currently be customized based on 5 parameters:
- zFTP w/kg
- zMAP w/kg
- Compound Score (see below for details)
- Wattage ceilings/floors
- VO2max
It would be nice if additional parameters could be used. For example, Zwift Insider’s short Tiny Races could use 30-second power as a parameter. Additionally, some race organizers have been asking for years for age-based categories.
Feature request: add more power curve intervals to the parameter list and demographic parameters such as age.
5 Pens
This is an odd one that James didn’t mention in his original post. In doing a bit more digging, I’ve learned that we are currently limited to just 5 categories in an event. This is a big limiter on the implementation of custom categories.
As an example, if an organizer wanted to simply subdivide each of the 4 categories into 2 categories each (so 8 total), they would have to create two separate events to hold all the categories. Not exactly a smooth user experience when signing up.
Feature request: this is just silly. Events should be able to have as many categories as an organizer wants. Or at least 10!
No Organizer UI
Given this is an MVP, it’s not surprising that Zwift hasn’t built a UI for organizers to customize category boundaries via Companion or the web. That said, it may become a time-consuming hassle to send requests to Zwift’s events team to implement custom categories.
Feature request: build a UI so organizers can easily dial in their custom categories.
No Category Boundary UI for Signups
If an event uses custom category boundaries, this needs to be indicated when signing up in order to avoid confusion from racers. (“Why am I being forced to race as a B?”, “Why am I being allowed to race in C?”, etc…)
That doesn’t appear to be a part of this MVP. So racers – be sure to read the event description. Now, more than ever! And race organizers: please put clear text in your event description explaining your custom boundaries.
Feature request: a simple indicator icon of custom boundaries would be a good start, although I would love to see details of those custom boundaries, so I can know what parameters a race organizer chose and why I got placed in a particular category.
Advanced Organizers Only
My contacts at Zwift asked me to let everyone know that this is essentially a limited beta feature for more “advanced” race organizers.
Translation: Zwift doesn’t want to start fielding hundreds of requests from less experienced organizers who want to test the waters. Zwift says, “We’re slowly reaching out to folks we know have been asking for it.” If you aren’t one of those folks, it’s possible that your custom categorization request may be denied.
About “Compound Score”
James referenced compound score as one of the parameters that can be used to create custom boundaries. This grabbed my attention because Zwift has yet to display a compound score for riders. In fact, I hadn’t even heard that Zwift had started calculating compound scores!
But let’s back up a minute. What even is a compound score? It’s a way to rank riders based on both their pure watts (“absolute power”) and w/kg (“relative power”). As far as I know it was first detailed in this conference paper, where the authors concluded, “To our knowledge, the compound score is able to measure performance characteristics for U23 one day racing success.” It’s used by ZwiftRacing.app, intervals.icu, and other platforms.
Flint from Zwift told me the company just started calculating compound scores a few weeks ago. Zwift is currently calculating riders’ compound scores the same way ZwiftRacing.app does:
(best 5min power)x(best 5min w/kg)
But Flint also stressed that this is likely to change in the future. Zwift’s plan is to use the compound score “to help people get a better feel for where they might sit if they have little to no race data.”
It’s fun to see Zwift testing new features and algorithms to push racing forward.
Wrapping It Up
Zwift’s announcement of custom category boundaries is welcome and shows that they’re listening to the community and want to give us the tools to create better races.
The only bummer is that this initial release of custom categories is limited in big ways. Hopefully customization capabilities will be expanded as time passes, giving race organizers the flexibility to create even more innovative, fun, and challenging events.
Questions or Comments?
Share below!

Just to note that zwiftracing.app found that the raw compound score is skewed for large and small riders and introduced adjustment. How did they notice? They ran a regression against all zwift data and compared it to the study and found that the zwift population did not quite fit the compound score research papers rider population of “competitive U23 cyclists” ;-). They derived the correction from the regression. Here’s the current “matches more than just U23 elite cyclists” compound score that zwiftracing.app uses: zrCS = (W * W/kg) * (65/(65-(0.4*(65-kg))))
Gosh, I wondered if they’ve considered just buying Zwiftracing.app
buy it an then allow it to languish like Zwiftpower…
They should make it nice and easy and create categories based on rare results.
If they start getting clever when creating events it could be confusing as for one race you’ll be an A and another a B and then if you have a weakness on your power curve a C in another.
Sounds good. I’m an A in flat Races and a B/C in hilly ones.
I always thought why they never use 1 minute power in this equation. To me 1minute power is the most important… a lot of sandbagger play with 20 minute power but to win they cannot sandbag the 1 minute power just my humble opinion.
At the moment sandbagging is still rife. I was in 100km “B” race recently and there was 3-4 guys who would blast every hill in the 6w/kg range every lap then drop the power back to 2.5- 3.5 w/kg so that their average came down to B levels and this was for the entire 100kms.
Honestly, there is no way Zwift doesn’t know this is going on. It is so blatant now because really they are not breaking any rules as they stand otherwise they would be moved up a category automatically.
I now prefer the mass start Tour of Watopia type races without Auto Cat because the sandbaggers don’t seem to enter them. Yes as a B I’m not going to beat an A and I don’t mind that but at least I’m not trying to hold on to a B who is a dishonest A
Tour of Watopia is a group ride, not a competitive race. Or are you referring to the monthly GC races?
Ha ha, have you tried to finish in the top 10% of one of those 200 plus rider Group Rides?
I prefer mass start races in general for the same reason. I know I’m not going to win, so I have no expectations and sandbaggers can’t piss me off. There are always people around me to race against and the fun is after the race going to ZwiftPower and looking to see if I’ve beaten anyone who “should” have been able to beat me – and not worrying about the fact that they were probably just doing a workout and didn’t care about racing me.
Had to laugh at the tiny race “perhaps” scenario. I’m a very strong c based on 20 min power and entered a tiny race a month or so ago where the top c’s finished in ~17 minutes. I think I hit 3.4-3.6 and finished way back. Tried to animate the chat about the topic in race (in the early finish pens) and got crickets.
i’d also love to see age based ranking as nearing 50 and reporting a real American weight, my power curve is approaching flat line.
I like the developing approach they seem to be using lately. The developing speed seems to be improving.
The pens thing isn’t to hard to fix. Start at one minute intervals but group A+ with C+ and b with d for example. Gets you the 8 groups and a legit D+ could never hang with a B+ so they’ll sort out almost immediately at the start.
Hmmm… I don’t think that would work. Or I’m misunderstanding you.
It’s not just PENS limitation… it’s categories in those pens. So you can’t have, say, 8 groups starting at separate times in one event.
You also can’t have 8 different categories for people to choose from when signing up for the one event.
Gotcha. It was me who misunderstood your post. So they really didn’t add much of anything then…… You could separate the biggest class or have to eliminate the fast or slow classes. Yup, they need more updates.
Does anyone know how hard it is to analyze the distribution of Zwift racers across different power metrics like zMAP?
In other words, if an event organizer wanted to create a race with five even sized pens, is there a way to guide what each level’s Zmap range should be, so each power level has about the same number of racers?
Using all five pens to allocate riders by zMAP, Compound Score or VO2 for the Tiny Races could work really well.
Using age in some way could make things more fun and easier then scanning results ( and finding someone you would have raced in a sprint!). At least I will go into another Strava catagory as turn 75.
What is zMap, how is it used, & how can I find my zMap w/kg?
Max aerobic power. Zwift seems to use your 5min power or similar. It displays on right of your home page so just divide by your weight.
Has there been any update on this?
As I understand it, none of zFTP, zMAP, Compound Score, or VO2max use any data from intervals shorter than 5 minutes.
With so few zwift races held on routes where a maximum effort of 5 minutes or more is either necessary or particuarly advantageous, a lower category racer can be very successful without ever pushing any of these category boundaries.