Progressive Weight Mode
How does Tonal figure out how much weight a new user should be lifting?
Written By Josh Shapiro
Summary
Progressive Weight Mode is a new feature on Tonal which calibrates a comfortable but challenging suggested weight for our new users.
There is significant challenge in designing a system which works equally well for all users: from people strength training for the first time all the way to our most experienced lifters.
In this blog post, we’ll walk through our major design challenges and how we solved them, including how we control the weight at the firmware level, and how we recommend appropriate weights based how users perform on other movements.
Introduction
How much weight should a person lift when they interact with a Tonal for the first time?
When a new user has their first interaction with a Tonal, our goal is simple: help them learn about the machine, and help the machine learn about them. One of Tonal’s most powerful intelligence features is Suggested Weights, which prescribes personalized weights across Tonal’s hundreds of movements.
In order to generate those suggestions, new users perform a Calibration Workout, which introduces them to key features of the machine and asks them to perform four different exercises. Using their results from those four movements, we can generate incredibly accurate suggested weights (typically to within just a few pounds) for the hundreds of movements in Tonal’s library.
Our users span a broad range: from fitness fanatics who want to push themselves to the limit all the way to people who are starting strength training for the first time. In order to cater to each individual’s capabilities, and to offer a smooth on-boarding and demo experience, we’ve developed a new calibration tool called Progressive Weight Mode (PWM).
Progressive Weight Mode is a system which allows us to gradually hone in on a comfortable weight for a user over the course of a single set. This system combines sports science; a responsive, online weight controlling algorithm at the firmware level; and one of the world’s most powerful strength training AIs, trained on the motion data of billions of repetitions performed on Tonal.
Building a gentle, robust experience was a challenging problem. In this blog post, we’ll walk you through all the levels of the work involved in order to bring this next generation weight lifting experience to our users.
Glossary of Key Concepts
Progressive Weight Mode (PWM) - Tonal’s new system for determining how much weight person can comfortably lift.
Velocity Based Training (VBT) - A strength training framework that describes the relationship between how much weight a person is lifting and how quickly they move.
Repetition (rep) - Performing a movement one time. For example, three reps of push-ups means you did three push-ups.
Set - A group of repetitions. Most workouts are organized to have 2-4 sets of 6-12 repetitions per movement.
One Rep Max (1RM) - The maximum weight each individual can lift for a single repetition of a movement. Tonal uses this value to prescribe weight and repetitions for all subsequent sets each user performs.
Background
At Tonal, our work is built on a foundation of science. Our engineers and data scientists collaborate with our team of professional coaches, sport scientists, and biomechanists to ensure that our work adheres to the scientific foundations of strength training and human motion established in research.
Progressive Weight Mode is grounded in Velocity Based Training (VBT), a theory and method of weight training which describes the relationship between how much weight a person is lifting and how quickly they can move that weight. In a standard gym setting, that information is hard to come by, typically exclusive to elite athletes, but on Tonal, we’re measuring that for every user on every rep.
The basics of VBT are described by the Force Velocity Curve:
The central tenet of the VBT framework is the intuitive concept that the more weight a person is lifting, the more slowly they move. The curve in Figure 1 is an idealized version of this relationship. In reality the relationship between force and velocity is highly individualized, depending on a person’s anatomy, training experience, and day to day fluctuations. Two people who are capable of lifting the same maximum weight might have considerably different velocities at that maximum.
Below is a another representation of the force velocity curve, built from our users’ actual performance, capturing the distribution of this relationship across the population.

One key aspect of the force velocity curve is that it describes a person giving their maximum effort. But, users often aren’t giving maximal effort, especially at the low weight, high velocity part of the curve. Most people don’t lift a very light weight at their fastest possible speed, they instead choose a comfortable speed.
This relationship between weight and velocity forms the backbone of Progressive Weight Mode.
In the sections below, we’ll step through the critical choices we made that combine to create a smooth, accurate calibration for users across the spectrum of strength training experience and capability.
These components include:
Using velocity to understand when a user is struggling
Setting personalized thresholds for each user to determine struggle
Finding a personalized minimum and maximum weight for each user to calibrate their ideal weight within
Determining how much weight we should add during each rep
Progressive Weight Mode: How Does it Work?
Figure 3 walks us through the basic sequence of Progressive Weight Mode:
We start the user off at a low weight, and for the first few reps measure their speed while only slightly increasing the weight.
As the user continues to perform successful reps, the weight will increase more noticeably.
Eventually, the user hits a point where further increases in the weight start to impact their speed.
As the weight continues to increase, based on how significantly a user slows down, Tonal will either slow the rate of weight increase, stop adding weight, or decrease the weight.
We continue this process over the course of 10 repetitions, honing in on the maximum weight that the user can perform comfortably.
The process described above is straight forward. Let’s take a deeper look at how this functions in practice, with a real example.
Example Set
Position (Inches) shows the position of the barbell (red solid line) as the user progresses through their 10 reps. After an initial set up, seen on the left side of the graph, the user exhibits a relatively smooth pattern of lifting the bar (concentric phase), and then lowering it (eccentric phase).
Each pair of vertical, dotted red and blue lines represent the main portion of each concentric phase, delimiting when the Progressive Weight Mode algorithm is active. Weight cannot be added outside of those regions (although it can be decreased if a user is struggling).
Motor Speed (Inches Per Second) shows the barbell’s velocity (blue solid line) which tends to peak part way through the concentric phase. Positive speeds mean the user is lifting the weight away from the machine, and when below zero, they are returning the weight back to the starting position. The horizontal black and grey lines represent our calculated velocity thresholds, the target speed and minimum speed respectively. This is how we decide when to add or remove weight:
Velocity above target speed (black line): add weight
Velocity between grey (minimum speed) and black line: no weight change
Velocity below grey line: remove weight
Weight Applied (Pounds) shows the weight the user is lifting as it is increased and decreased through the set. Let’s walk through the reps to understand what’s happening.
Rep 1 and 2: Rep 1 includes a period where the user appears to be getting into position. You’ll notice the grey and black horizontal lines in the Motor Speed graph adjusting as we measure the user’s speed. The weight does not going up significantly during these reps.
Reps 3, 4, 5, and 6: In the concentric phase of these reps, the user is exceeding their threshold velocity (black horizontal line, Motor Speed Graph). As a result, the Tonal gradually increases their weight.
Rep 7: The user’s velocity is below both their black and grey thresholds. This means that we decrease their weight.
Reps 8, 9, and 10: The user’s speed fluctuates around their threshold, and their weight shifts within a ~5 pound range until the end of the set.
This is the power of Progressive Weight Mode. The user can continuously perform the exercise without being overburdened, and Tonal is able to detect when they are approaching their limit.
Based off of the user’s performance on this set, we are able to accurately project their One Rep Max for the Bench Press, and as we’ll discuss later, use this to suggest weights for other moves on Tonal as well.
Hopefully the above example makes clear the basics of how the mode works. But, there are a lot of details, decisions, and work that went into making the algorithm functional. Let’s explore some of the key challenges and solutions.
Progressive Weight Mode: Challenges
What sort of challenges did we have to tackle in order to turn Progressive Weight Mode from an idea into a working algorithm?
The first, and most central challenge, was deciding, 50 times a second, whether or not the user needs more weight, the same weight, or less weight. This decision logic has to work for all of our users: regardless of strength, speed, or range of motion. In other words, how do we generate the black and grey threshold lines seen in the Motor Speed Graph?
The second and third challenges are related: how quickly should we add weight when a user is succeeding, and what weights should we allow a user to build to?
Challenge: Should we add more weight?
Tonal monitors a user’s movement 50 times a second. In PWM, with each check, we have to answer the question of whether the user is struggling, doing okay, or needs more weight to be challenged.
As demonstrated above, the main aspect of this logic is simple: during most of the concentric phase if a user’s speed is above the black threshold line, we increase their weight. If it is between the black and grey lines, we maintain their weight, and when it is below the grey line, we decrease their weight.
But how do we generate those lines?
Early Approach: Static Target Speed per Movement
Progressive Weight Mode was a feature that we had our eye on for a long time. But, our first prototype had a big problem: while it worked well for many users, a significant chunk of users couldn’t get good results.
The principal reason for this flaw was how the velocity thresholds were designed at first. For each move in the calibration, we generated a static target velocity (black line) by combining:
A data analysis describing the range of velocities users at which performed the move on Tonal
Our experts’ perspective of what a good or ideal speed to perform each move
User testing
Limited in-house testing show these thresholds worked well, but early into user testing, we ran into the reality that a substantial portion of Tonal users simply moved slower than these targets. Even though they were performing reps consistently, their weight was not increasing.
Another issue was that we only had a single threshold per move. If you were above it, you gained weight, and if you were below it, you lost weight. There was no region where your weight remained constant. This experience proved to be too unstable in testing.
Current Approach: Dynamic Target Speeds per User
After our early testing, we realized that there was no static threshold that would work universally. If we lowered it to accommodate our slowest moving users, then we would fail to capture when a faster moving user was struggling.
Instead, we needed to personalize the target speed for each user. By analyzing Tonal users’ data, we were able to build a model that finds a relationship between how a user is moving in reps when they are comfortable versus reps when they are struggling.
We have a substantial dataset around fatigue, and we’ve identified variables indicating to how close a user is to failure, also know as Reps In Reserve. Each movement on Tonal has a unique pattern of user motion that indicates users are starting to struggle and may soon need support from the spotter. Variability exists here as well, both from person to person, and for the same person from set to set.
Our Reps in Reserve model is (as far as we know) the most accurate fatigue model in the world (keep an eye out for an upcoming publication and blog post on this)!
Howver, our full fatigue model is too computationally expensive to run 50 times a second. Instead, for progressive calibration, we’ve distrilled it down to a simpler system based on a smaller subset of features which can run much more quickly.
We’ve found this smaller subset of features works very well to determine struggle for an overwhelming majority of our users, from our slowest moving to the quickest.
Challenge: Minimum and Maximum Weight
One downside of building a customized threshold for each user is that we need to use a few reps of the PWM set to calculate these values. That’s why in the first two reps we won’t make significant changes to the weight, instead measuring the variables we use to determine the personalized target speeds. This leaves a user with 8 reps to calibrate their weight.
During those 8 reps, the weight they lift steps up in increments from a minimum to a maximum weight to find their comfortable limit.
The minimum weight is straight forward: we want to start off all users at a point where they are comfortable and capable. The system wouldn’t work very well if a user is immediately faced with something too challenging.
But why a maximum weight, why not allow users to climb all the way to Tonal 2’s peak of 250 pounds if they’re capable? The main reason is that calibration is smoother for a wider range of our users when the weight increments slowly. If the weight moves up in large steps, more users will find themselves running into their limits too quickly.
Figure 5 shows how much weight, on average, our strongest users (98th percentile) are lifting across each movement on the Tonal. For some movements you can see the One Rep Max (1RM) of this strongest group can be 200 or even 300 pounds, but for many movements the 1RM is considerably lower.
Let’s look at an example movement where the 1RM for our 98th percentile is 60 pounds. If we set the maximum weight for this movement to 60, then that will satisfy 98% of our users, and that means with each rep, the weight will increment by ~5 pounds instead of by the ~25 lbs required to reach a 250 high weight.
But, we don’t stop there. 98% of users is pretty good, but our goal is to find good weights for every single Tonal user.
One Step Further: Personalized Weight Ranges
For a user’s first set in a progressive calibration, we don’t yet have any motion data for them. In this case, we use a weight range based on their personal data they share with use when they create their account. For example, more experienced lifter will see a higher maximum weight than novice lifters.
For every set following the first, users do not get a static weight range: they receive a personalized minimum and maximum weight.
We leverage another world class model: Tonal’s Cold Start Suggested Weight model. This model, given a user’s performance on any movement(s), can accurately suggest weights for any other movement on the machine, typically to within a few pounds of their actual One Rep Max.
The Cold Start model uses a blend of performance data including velocity, range of motion, weight lifted, muscle group utilization per movement, and more.
Figure 6 shows the personalized range between user’s predicted low and high weights. Some users have significant spreads between their Low and High weight, but for many users, the range is considerably smaller, giving them a smooth, targetted experience.
Challenge: How Much Weight Should The System Add Per Repetition?
For this example, let’s consider two users performing the Barbell Seated Lat Pulldown. Since this is the first movement peformed during calibration, let’s say they have similar profiles so they have the same Low and High weights.
User A is in the 10th percentile for this movement, and can do a single repetition of 51 pounds.
User B is in the 90th percentile, and can do a single repetition of 142 pounds.
Over the course of 10 repetitions how can we increase the weight such that both of these users have a gentle, smooth experience while having the opportunity to demonstrate their maximum capability?
How much should the weight increase with each successful repetition?
The ideal experience would be for every person to be presented with a set of increasing weights that approach, but never quite reach or exceed their maximum. This would allow for the user to perform the moves comfortably while nevertheless being challenged appropriately, and allow for us to accurately project their maximum capabilities.
However, in reality, this is difficult to achieve. If the system is adding too much weight per rep, users may suddenly find themselves facing a weight increase that significantly exceeds their capabilities. On the other hand, if the system is adding too little weight per rep, then it would take much longer than 10 reps for our strongest users to reach their maximum capability. Although users have the option to continue past 10 reps, which continues to increment the weight and allows them to find their limits, our goal is achieve a successful calibration for as many users as possible within 10 reps.
There’s a second complication. PWM uses velocity to gauge whether a user is struggling with their weight. But, some users don’t start showing a statistically significant decrease in velocity until they are relatively close to their limit. What can happen is that a user will start a repetition at a weight they are comfortable with, moving at an acceptable speed, and they build up momentum as they move through their range of motion. The system sees that they are doing fine, so it increases the weight, sometimes to a level that would be challenging for them to lift if they didn’t already have that momentum. As a result, in later parts of that repetition, or the next repetition, the weight may be too difficult for them.
When this overshoot occurs, it is our goal to have the user presented with as little extra weight as possible. For example, if a user’s limit is 50 pounds, it is a much better experience for them to contend with 51 pounds and struggle, rather than 80 pounds and be unable to move the weight at all. In both cases, the algorithm will lower the weight for them, allowing them to continue the set, but the less additional weight a user is presented with, the better.
In summary, we have two competing desires:
Add as little weight as possible per rep to achieve a user’s target weight in a gradual fashion, avoiding significant overshooting of their maximum weight.
Add enough weight per rep to allow users to reach a challenging weight within 10 reps, including our very strongest users.
How can we achieve this for as many users across the strength distribution as possible?
Proposed Approach: Even Weight Increments
The simplest approach would be to steadily increase the weight by a fixed amount as users perform successful repetitions. But from which low weight to what high weight?
Approach 1a: Even Weight Increments up to 90th percentile
In this approach we allow users’ weight for the pulldown to grow steadily from a minumum weight of 10 pounds all the way up to the 90th percentile weight (142 pounds) over the course of 10 repetitions in steady increments. After the first two reps where we barely increase weight while measuring user speed, we’ll need to add 16.5 pounds during each of the final 8 reps in order to make it all the way to 142 pounds.
Rep: 1 2 3 4 5 6 7 8 9 10
Lbs: 10 → 10 → 27 → 43 → 60 → 76 → 93 → 109 → 126 → 142
Let’s recall our two users: A (51 lbs 1rm) and B (142 lbs 1rm). This approach may work for User B, but for User A they’re very quickly being challenged with weights that considerably exceed their maximum. By rep 5, they are seeing a weight of ~60 lbs. It is not an ideal experience to be presented with a weight that is ~20% over your maximum. The algorithm would still function: User A would struggle, and either move very slowly or not at all, and the weight would be decreased for that rep and subsequent reps, but we think we can do better.
Approach 1b: Up to the 50th percentile
In order to accommodate User A, we could lower the maximum weight. The 50th percentile 1RM for the Seated Barbell Lat Pulldown is 88 pounds. This may offer a more gradual experience for User A, who will still be challenged with weights that are too much, but in a less jarring fashion than in the first approach. However, the downsides for User B are significant: they will not reach anywhere close to their 1RM in the 10 rep calibration. For a considerable fraction of our users, the mode would considerably underestimate their capability. They could opt to perform more reps to continue increasing the weight, but our goal is to calibrate within 10 reps.
Actual Approach: (Approximated) Exponential Growth
Figure 8 shows a distribution of One Rep Max across our users across each movement on Tonal, normalized by our heaviest lifting users. The distribution has a considerable right-handed skew, which reflects that many of our users are lifting towards the lighter side of Tonal’s weight range.
This insight guides our calibration. Rather than equal sized weight increments, we start the weight increments slowly, and devote a larger portion of the process towards the users who are on the left side of this graph. Then, if a user continues to succeed, we increase the size of the weight increments more aggressively, allowing the users towards the right side of the graph to achieve their maximum.
For the Barbell Seated Lat Pulldown, where our high_weight = 142 and low_weight = 10, if a user succeeds in every rep, their weight progression will look like this:
Rep: 1 2 3 4 5 6 7 8 9 10
New: 10 → 10 → 18 → 28 → 41 → 56 → 73 → 93 → 115 → 142
Old: 10 → 10 → 27 → 43 → 60 → 76 → 93 → 109 → 126 → 142
In this new distribution, users are lifting ~50% less weight for a reps 3-5 than in the old distribution.
For our users who lift towards the lighter end of the weight range, the weight increments in early reps are considerably smaller. These smaller steps mean users are less likely to jump from a weight they are comfortable with to a weight that is way off.
For our heaviest lifting users, they still have an opportunity to push themselves to their limits, and if they are over-challenged, the errors are going to be smaller relative to their weight lifted. A 10 pound error for a user who lifts 20 pounds is 50% off, whereas a 10 pound error for a user lifting 120 pounds is only 8.3% off.
We’re essentially pushing our errors into the right side of the distribution, where there are fewer users and those errors are smaller relative to the amount of weight being lifted. This massaging of the errors creates an experience that satisfies many more of our users.
Conclusion
Hopefully, this blog post gave some interesting insight into how much work goes into a single feature on Tonal, and what that work looks like. We take pride in collaborating across teams and disciplines to create a product that works for all of our users. Edge cases in our work represent real people who are getting a sub-optimal experience, and we dedicate a lot of effort to ensuring that everyone can get the most out of the product.
Progressive Weight Mode, and the new Calibration that it powers, are currently live across all Tonal and Tonal 2 trainers in the Intro To Tonal workout with Coach Ackeem. You can also try a single move version of Progressive Weight Mode in the ‘Try Now’ demo on Tonal’s home screen.
My head is exploding!
You all are awesome. This is the future of weightlifting no doubt about it. Buying into tonal was the best decision I’ve ever made for my health. Keep it up.