Category Enforcement change made things considerably worse

Category Enforcement function was recently changed to the worse.

When introduced, it would check zFTP and zMAP value with the table and force higher category on the rider (if zFTP in B, but zMAP in A, then a rider would be assigned to A), see below from respective ZwiftInsider article from Dec 29, 2022.

Note: exceeding just one of the thresholds (zMAP or zFTP) will bump you to the next category. You don’t need to exceed both to be upgraded.

The original idea was to get rid of sandbaggers who would carefully nurture their zFTP not to exceed the category threshold, but would be very fresh at the short crucial moments of the race like Hilly Loop KOM on Watopia.

Some time in the past two months category enforcement was changed to allow lower category, so if zFTP is in A, but zMAP is in B, then a rider can race in B, here is the current description from Zwift Support site.

In an open race, the lowest group you can join is determined by where the lowest value of either your zMAP (watts/kg) or zFTP (watts/kg) falls in the below table.

This makes the original sandbagging issue considerably worse, because a rider with 5w/kg FTP can race in B and simply ride any B off of their wheels. They don’t even need to do have zMAP > 5w/kg, because they will already be very far ahead.

Let me put it in a different way: original category enforcement was based on a single zFTP metric. People learnt how to “game” (cheat) this metric. Adjusted category enforcement added second metric, zMAP, because gaming two metrics simultaneously is harder than gaming a single one. Current rules allow anyone to game any metric out of two, making it easier to cheat, because one has more options.


Open Race

In an open race, the lowest group you can join is determined by where the lowest value of either your zMAP (watts/kg) or zFTP (watts/kg) falls in the below table, provided your zFTP (watts) also falls in that, or a higher, row. If your zFTP (watts) value falls in a lower pace group than your zMAP (watts/kg) or zFTP (watts/kg), you’ll also be able to enter the group where your zFTP (watts) falls.

For example: If your zMAP power-to-weight ratio is 3.2W/kg, your zFTP is 2.63W/kg, and your zFTP (watts) is 140W, you can race in pace groups D, C, B, or A. Even though your zMAP and zFTP meet the criteria for Pace Group C, your zFTP (watts) meets the criteria for (and allows you to race in) Pace Group D or above.

Is that a fairly significant change, when did that come into effect?

Well spotted btw…

I don’t know when it came to effect. I remember discussing category enforcement with a friend of mine right before New Year, and the previous system was still in place.

I’m not allowed in CE C races. If this was correct, I would be. It’s likely a mistake.

1 Like

If both metrics had to be above thresholds, I would be in D, but I’m not.

I would really like someone from Zwift HQ to chime in here and explain if it is an error in the help center article or something else.

Hopefully there’s someone left to explain.

Yes, someone is still here.

Well from my side I can tell for sure that the base category enforcement system hasn’t been changed since last May. I just checked the code history. So I can only find two possible explanations for this case:

  • this happened on a event with “custom category enforcement” - where event organizers can choose their own rules.
  • some parallel bug in the system not in the category enforcement rules but in the event logic that handles this (seems highly unlikely to me but still a possibility)

Looks like the content has been updated away from what it previously was? Think the posters in here agree the actual calc hasnt changed from their own checks.

1 Like

Well I’m more relieved now, I was starting to think there was a bug somewhere.

It’s simple, whoever updated the document made a mistake…
Let’s see if we can get that fixed.


they’re just trolling us :slight_smile:

Also, glad you are still employed, thanks and hope things are going ok over there.

Glad you still have a job. One of the good guys :smile:

1 Like

No change for me - just kicked from D in C:
zMAP 3,038 W/kg < 3,2 (= D)
zFTP 2,634 W/kg > 2,63 (= C)

Edit - @DavidP - it was Stage 1 Race like a Champ in D Cat, next races it C. What happens now (Zwiftpower League)?

An improvement in your approx 3-5min effort would lower your zFTP by a few Watts and put you back in D (unless the model thought you exceeded zMAP threshold).

David, thanks for your response, and hope that the documentation can be reverted. I still suspect that there is a bug somewhere.

I can’t post links here, but if you took a look at the one of top C riders from ZwiftPower #5935298 (taken at random inspection of top C riders), you would see that his top 20 min power in the past 90 days is 265w, meaning that his FTP is 95% * 265 = 252w, but ZwiftPower shows his zFTP as 242w.

zFTP is predicting what a rider can do for more than 40mins, often in my experience close to 60mins.

Definitely not 20mins.

Remember; zFTP is NOT 95%; it’s CriticalPower based on Zwift’s system.
Do not confuse the 95% method as zFTP.

Your rider in question is extremely well below the threshold w/kg wise; even if you were using the 95% method they’d be solidly upper, but still C.

However you did find something very unusual on ZP with him.

He has an extreme oddball weight dope down 7.2kg, which seems to be greatly biasing his w/kg listing at the top; which is likely what’s confusing you.

Thanks everyone for your answers.
To summarise:

  • This is a documentation mistake, nothing changed in the enforcement logic, so any rider is still placed into highest category of zMAP/zFTP
  • Zwift uses its own Critical Power curve to determine zFTP and zMAP power, one shouldn’t be using standard approach of taking 0.95 of max 20 min power for zFTP
  • zFTP and zMAP power are divided by the current rider’s weight to determine their category placement, but it can lead to artefacts in ZwiftPower if rider’s weight changed in the past 90 days


I believe it uses the average weight over the previous 90 days, not whatever it is currently set at.

My understanding is that it’s using average weight from the rides where PRs were set in the last 90 days.