Double progression, and how to actually run it
Double progression adds reps first and load second. Here is the rule, the two numbers it needs, and the three places lifters break it without noticing.
Written while building GETSIXPACK — a training log that scores the session against your range and calls the next load.
Double progression is the simplest progression model that still works after the first month of training, and it is the one most people think they are running while actually running something else.
The rule is two lines long:
- Pick a rep range. Add reps inside it, week to week, at the same load.
- When every working set reaches the top of the range, add load — and the reps fall back toward the bottom.
That is the whole thing. The “double” is that you are progressing two variables in sequence rather than one, which is what makes it survive a bad week: on a day when you can only match last session’s reps, you have not failed the programme, you have just not triggered the second step yet.
The two numbers it needs
A rep range, and a cutoff for how hard the last set was.
The range is the part people get right. 6–10 for a compound, 10–15 for an
isolation lift, 15–20 for something you are chasing a pump on. Any sensible
span works as long as it is a span. A range of 10–10 is broken.
There is nothing to progress through, the first step of the model is
unreachable by construction, and ordinary variance reads as a shortfall.
The effort cutoff is the part people skip, and skipping it is what turns double progression into a grinder. If you hit 10 reps on the top set by burying yourself, adding load next session is a promise you cannot keep. So the load only moves when the top of the range is reached and the last set came in at roughly 2 reps in reserve or better. Two conditions, both binding.
That second condition is why a log has to store effort per set, not per session. See RIR vs RPE for what to actually write down.
Where it breaks
Adding load on one good set. The rule says every working set. Three sets of 8, 8, 6 against a 6–8 range is a session that ran out. Hold the load and chase the reps on set three next time.
Treating the drop in reps as a regression. This is the big one. Load goes up, reps come down. That is the mechanism working. If you or your app reads a lower rep count on a heavier bar as going backwards and cuts the load, the model eats itself: it prescribes an increase and then punishes the exact session it asked for. Any comparison between two sessions has to check whether the weight moved before it decides whether the reps did.
Comparing total reps instead of reps per set. A session where you ran four sets instead of five has fewer total reps and identical performance. Sum the reps and it looks like a decline. Compare per set and it looks like what it is.
Ranges chosen once and never revisited. A range is a decision about what you want the lift to do, and it does not have to be the same for a top set and a back-off set. What it must not be is accidental — inherited from whatever happened to be in the log the day the programme was written.
What a session looks like
Incline bench, 6–8 reps, three working sets, currently 185 lb.
| Week | Set 1 | Set 2 | Set 3 | Call |
|---|---|---|---|---|
| 1 | 185 × 7 | 185 × 6 | 185 × 6 | Hold. Chase reps. |
| 2 | 185 × 8 | 185 × 7 | 185 × 7 | Hold. One set short. |
| 3 | 185 × 8 | 185 × 8 | 185 × 8 @ 2 RIR | Add load. |
| 4 | 190 × 7 | 190 × 6 | 190 × 6 | Hold. Chase reps. |
Week 4 looks worse than week 3 on every line and is the best week of the block. That table is the entire argument for writing progression rules down instead of deciding them in the moment, tired, between sets.
Why the load step is small
The increment is whatever the equipment actually allows, and it should be the smallest one it allows. A barbell that takes 2.5 kg a side moves in 5 kg steps; a machine stack moves in whatever the stack moves in. The temptation is to jump further because the sweep felt easy, and the cost is that you spend the next three weeks failing to reach the top of the range at the new load.
On a lift with no load to add at all — a bodyweight movement, a hanging leg raise — the model does not stop working, it just stops at step one. Keep the load and raise the rep target instead. Prescribing a 2.5 kg increase on something that has nowhere to put 2.5 kg is a category error, and a log that does it is not reading its own data.
Double progression is not a periodisation model
It decides one thing: what the next session’s load and rep target are, for one lift, given the last one. It has no opinion on how much total volume you should be doing, when you should deload, or how the block is structured. Those are separate questions with separate answers — the first of which is sets per muscle per week.
What it does do is remove the single most common source of stalled training, which is not the programme. It is that nobody remembers what happened three weeks ago, so the load creeps up on the days you feel good and never comes back down on the days you do not.