Skip to main content

Session Time Budgeting & Timeline Predictions

How to allocate time within sessions and predict results based on user commitments. Status: Research Complete


Part 1: Session Time Budgeting

Session Time Breakdown

Session DurationWarmupMain WorkoutCooldownEffective Training Time
30 min5 min20 min5 min20 min
45 min5 min35 min5 min35 min
60 min8 min44 min8 min44 min
75 min10 min55 min10 min55 min
90 min10 min70 min10 min70 min

Sources: ISSA, Harvard Health


Exercise Count by Session Duration

Based on rest periods and set duration research:

Session DurationCompoundsAccessoriesIsolationTotal ExercisesTotal Sets
30 min210-13-49-12
45 min2-31-214-614-18
60 min3226-718-22
75 min3-42-327-922-27
90 min432-39-1027-32

Time Per Exercise Calculation

Compound Exercises (with 2-3 min rest)

Per Set Time:
- Execution: 30-45 sec (8-12 reps at 3-4 sec tempo)
- Rest: 120-180 sec

Total per 4-set compound:
- Sets: 4 × 40 sec = 160 sec (~2.7 min)
- Rest: 3 × 150 sec = 450 sec (~7.5 min)
- Total: ~10 min per compound exercise

Accessory Exercises (with 90 sec rest)

Per Set Time:
- Execution: 40-50 sec (10-12 reps)
- Rest: 90 sec

Total per 3-set accessory:
- Sets: 3 × 45 sec = 135 sec (~2.3 min)
- Rest: 2 × 90 sec = 180 sec (3 min)
- Total: ~5.5 min per accessory exercise

Isolation Exercises (with 60 sec rest)

Per Set Time:
- Execution: 40-60 sec (12-15 reps)
- Rest: 60 sec

Total per 3-set isolation:
- Sets: 3 × 50 sec = 150 sec (2.5 min)
- Rest: 2 × 60 sec = 120 sec (2 min)
- Total: ~4.5 min per isolation exercise

Session Builder Formula

interface SessionTimeConfig {
totalMinutes: number;
warmupMinutes: number;
cooldownMinutes: number;
}

interface ExerciseAllocation {
compounds: number;
accessories: number;
isolation: number;
totalSets: number;
}

function calculateExerciseAllocation(config: SessionTimeConfig): ExerciseAllocation {
const effectiveTime = config.totalMinutes - config.warmupMinutes - config.cooldownMinutes;

// Time constants (in minutes)
const COMPOUND_TIME = 10; // 4 sets, 2-3 min rest
const ACCESSORY_TIME = 5.5; // 3 sets, 90 sec rest
const ISOLATION_TIME = 4.5; // 3 sets, 60 sec rest

// Allocation strategy: 60% compounds, 25% accessories, 15% isolation
let compounds = 0;
let accessories = 0;
let isolation = 0;
let remainingTime = effectiveTime;

// Minimum 2 compounds for any session
compounds = Math.min(Math.floor(remainingTime * 0.6 / COMPOUND_TIME), 4);
compounds = Math.max(compounds, 2); // At least 2
remainingTime -= compounds * COMPOUND_TIME;

// Accessories
accessories = Math.min(Math.floor(remainingTime * 0.6 / ACCESSORY_TIME), 3);
remainingTime -= accessories * ACCESSORY_TIME;

// Isolation with remaining time
isolation = Math.min(Math.floor(remainingTime / ISOLATION_TIME), 3);

return {
compounds,
accessories,
isolation,
totalSets: (compounds * 4) + (accessories * 3) + (isolation * 3),
};
}

Volume Distribution by Session Duration

DurationSets/SessionSessions/Week (4-day)Weekly SetsWeekly Sets/Muscle (U/L)
30 min9-12436-489-12
45 min14-18456-7214-18
60 min18-22472-8818-22
75 min22-27488-10822-27
90 min27-324108-12827-32

Note: For body recomp, optimal range is 12-20 sets/muscle/week. Sessions of 45-60 min hit this perfectly.


Part 2: Ideal vs Adjusted Plan System

The Core Concept

┌─────────────────────────────────────────────────────────┐
│ IDEAL PLAN │
│ • Optimal frequency (4 days/week) │
│ • Optimal duration (60 min) │
│ • Optimal volume (14-16 sets/muscle/week) │
│ • Expected timeline: 12-16 weeks │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ USER ADJUSTS PLAN │
│ • "I can only do 3 days/week" │
│ • "I only have 45 minutes" │
│ • "I want to skip leg day" (not recommended!) │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ RECALCULATED PREDICTION │
│ • Adjusted volume: 10-12 sets/muscle/week │
│ • Progress rate: 70% of optimal │
│ • New timeline: 18-22 weeks │
│ • Trade-off explanation shown │
└─────────────────────────────────────────────────────────┘

Progress Rate Research

Muscle Gain Rates (Natural, Optimal Conditions)

Experience LevelMonthly GainWeekly Gain% Body Weight/Month
Beginner2-4 lbs0.5-1 lb1-1.5%
Intermediate1-2 lbs0.25-0.5 lb0.5-1%
Advanced0.25-0.5 lb0.06-0.12 lb0.25-0.5%

Sources: Precision Nutrition, Men's Health

Fat Loss Rates (For Muscle Retention)

ApproachWeekly LossMonthly LossMuscle Retention
Optimal (slow)0.5-0.7% BW2-3% BWExcellent
Moderate0.7-1% BW3-4% BWGood
Aggressive1-1.5% BW4-6% BWFair (risk of loss)
Too fast>1.5% BW>6% BWPoor (muscle loss likely)

Research Finding: Athletes aiming to gain lean body mass during weight loss should aim for weekly body weight loss of 0.7% (PubMed).


Volume-Progress Relationship

Research shows a dose-response relationship between volume and results:

Weekly Sets/MuscleProgress RateNotes
<4 sets~40%Below minimum effective dose
4-9 sets~60-70%Minimum effective
10-12 sets~80-85%Good results
12-20 sets100%Optimal range
20+ sets100-105%Diminishing returns, recovery concerns

Sources: Stronger by Science, SportRxiv Meta-Analysis


Frequency-Progress Relationship

FrequencyImpact on ProgressNotes
1x/week per muscle~70%Suboptimal MPS utilization
2x/week per muscle100%Optimal for most
3x/week per muscle~100-105%Slight edge for beginners

Key Finding: When volume is equated, frequency has minimal impact. The real issue with low frequency is fitting enough volume into single sessions.

Sources: PubMed Meta-Analysis, Stronger by Science


Timeline Prediction Algorithm

interface UserProfile {
experienceLevel: 'beginner' | 'intermediate' | 'advanced' | 'returning';
currentBodyFat: number; // percentage
targetBodyFat: number; // percentage
currentWeight: number; // lbs
targetWeight: number; // lbs (optional, often same for recomp)
}

interface PlanCommitment {
daysPerWeek: number; // 2-6
minutesPerSession: number; // 30-90
weeklyCardioMinutes: number; // 0-180
nutritionAdherence: 'poor' | 'fair' | 'good' | 'excellent';
sleepHours: number; // 5-9
}

interface TimelinePrediction {
optimalWeeks: number;
adjustedWeeks: number;
progressRate: number; // 0-100%
weeklyFatLoss: number; // lbs
weeklyMuscleGain: number; // lbs
tradeoffs: string[];
}

function predictTimeline(
profile: UserProfile,
ideal: PlanCommitment,
adjusted: PlanCommitment
): TimelinePrediction {

// Base rates for optimal conditions
const baseMuscleGain = getBaseMuscleGain(profile.experienceLevel); // lbs/week
const baseFatLoss = profile.currentWeight * 0.007; // 0.7% BW/week

// Calculate progress modifiers
const volumeModifier = calculateVolumeModifier(adjusted);
const frequencyModifier = calculateFrequencyModifier(adjusted.daysPerWeek);
const nutritionModifier = getNutritionModifier(adjusted.nutritionAdherence);
const sleepModifier = getSleepModifier(adjusted.sleepHours);

// Combined progress rate
const progressRate = Math.min(
volumeModifier * frequencyModifier * nutritionModifier * sleepModifier,
1.0 // Cap at 100%
);

// Adjusted rates
const adjustedMuscleGain = baseMuscleGain * progressRate;
const adjustedFatLoss = baseFatLoss * progressRate;

// Calculate timelines
const fatToLose = calculateFatToLose(profile);
const optimalWeeks = Math.ceil(fatToLose / baseFatLoss);
const adjustedWeeks = Math.ceil(fatToLose / adjustedFatLoss);

// Identify trade-offs
const tradeoffs = identifyTradeoffs(ideal, adjusted);

return {
optimalWeeks,
adjustedWeeks,
progressRate: Math.round(progressRate * 100),
weeklyFatLoss: adjustedFatLoss,
weeklyMuscleGain: adjustedMuscleGain,
tradeoffs,
};
}

function calculateVolumeModifier(commitment: PlanCommitment): number {
const allocation = calculateExerciseAllocation({
totalMinutes: commitment.minutesPerSession,
warmupMinutes: commitment.minutesPerSession <= 45 ? 5 : 8,
cooldownMinutes: commitment.minutesPerSession <= 45 ? 5 : 8,
});

// Weekly sets estimate (assuming Upper/Lower split)
const weeklySets = allocation.totalSets * commitment.daysPerWeek;
const setsPerMuscle = weeklySets / 2; // Rough estimate for U/L

// Volume-progress curve
if (setsPerMuscle < 4) return 0.4;
if (setsPerMuscle < 10) return 0.6 + (setsPerMuscle - 4) * 0.033;
if (setsPerMuscle < 12) return 0.8 + (setsPerMuscle - 10) * 0.025;
if (setsPerMuscle <= 20) return 1.0;
return 1.0; // Diminishing returns beyond 20
}

function calculateFrequencyModifier(daysPerWeek: number): number {
// Based on muscle frequency (2x/week optimal)
if (daysPerWeek <= 2) return 0.7; // 1x/muscle/week
if (daysPerWeek <= 4) return 1.0; // 2x/muscle/week
return 1.0; // 2-3x/muscle/week
}

function getNutritionModifier(adherence: string): number {
const modifiers = {
poor: 0.5,
fair: 0.7,
good: 0.9,
excellent: 1.0,
};
return modifiers[adherence] || 0.7;
}

function getSleepModifier(hours: number): number {
if (hours < 6) return 0.6;
if (hours < 7) return 0.8;
if (hours <= 9) return 1.0;
return 0.95; // Oversleeping slightly negative
}

Progress Rate Calculation Examples

Example 1: Optimal Commitment

User: Intermediate, 180 lbs, 20% BF → 15% BF goal

Commitment:
- 4 days/week (2x/muscle)
- 60 min sessions (18-22 sets)
- Good nutrition
- 7.5 hours sleep

Calculation:
- Volume modifier: 1.0 (14-16 sets/muscle/week)
- Frequency modifier: 1.0 (2x/muscle)
- Nutrition modifier: 0.9
- Sleep modifier: 1.0
- Progress rate: 90%

Timeline:
- Fat to lose: ~9 lbs
- Weekly loss: 1.26 lbs × 0.9 = 1.13 lbs
- Optimal timeline: 8 weeks
- Adjusted timeline: 8 weeks (minimal difference)

Example 2: Reduced Commitment

User: Same profile

Commitment:
- 3 days/week (1.5x/muscle)
- 45 min sessions (14-18 sets)
- Fair nutrition
- 6 hours sleep

Calculation:
- Volume modifier: 0.85 (10-12 sets/muscle/week)
- Frequency modifier: 0.85 (between 1x and 2x)
- Nutrition modifier: 0.7
- Sleep modifier: 0.8
- Progress rate: 40% (0.85 × 0.85 × 0.7 × 0.8)

Timeline:
- Fat to lose: ~9 lbs
- Weekly loss: 1.26 lbs × 0.4 = 0.5 lbs
- Optimal timeline: 8 weeks
- Adjusted timeline: 18 weeks

Trade-offs shown:
- "Reducing to 3 days/week decreases weekly volume by ~25%"
- "45-minute sessions limit exercise variety"
- "Sleep under 7 hours impairs recovery and fat loss"
- "Nutrition adherence is the biggest factor - improving this alone adds 20%"

UI Concept: Timeline Slider

┌─────────────────────────────────────────────────────────────────┐
│ YOUR RECOMP TIMELINE │
├─────────────────────────────────────────────────────────────────┤
│ │
│ OPTIMAL PLAN YOUR PLAN │
│ ──────────── ───────── │
│ 4 days/week 3 days/week │
│ 60 min sessions 45 min sessions │
│ 16 sets/muscle/week 11 sets/muscle/week │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ TIMELINE COMPARISON │ │
│ │ │ │
│ │ Optimal: ████████░░░░░░░░░░░░░░ 12 weeks │ │
│ │ Your Plan: ████████████████████░░░░░░░░░ 18 weeks │ │
│ │ │ │
│ │ Progress Rate: 67% │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 💡 WHAT'S IMPACTING YOUR TIMELINE: │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Training Volume ████████░░ -15% │ │
│ │ Training Frequency ███████░░░ -20% │ │
│ │ Nutrition ██████░░░░ -30% ← Biggest factor │ │
│ │ Sleep ████████░░ -20% │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ [Adjust My Plan] [Continue with Current Plan] │
│ │
└─────────────────────────────────────────────────────────────────┘

Key Trade-off Messages

AdjustmentImpactMessage
4→3 days/week-15-20% progress"Training 3 days instead of 4 reduces muscle stimulus. Consider longer sessions to compensate."
4→2 days/week-30-40% progress"Training only 2 days significantly limits results. Each muscle only gets trained once per week."
60→45 min-10-15% progress"Shorter sessions mean fewer exercises. Focus on compounds to maximize efficiency."
60→30 min-25-35% progress"30-minute sessions are maintenance-level. Results will be slow but steady."
Good→Fair nutrition-20% progress"Nutrition is the #1 factor. Hitting protein targets alone can recover most of this."
7→6 hrs sleep-20% progress"Sleep deprivation impairs fat loss and muscle recovery. Consider this non-negotiable."
Skip cardio-5-10% progress"Cardio accelerates fat loss but isn't essential. Prioritize lifting first."

Integration with Plan Generation

3-Option Plan Presentation

When generating plans, present 3 options:

OptionNameDescription
PeakMaximum ResultsOptimal frequency, duration, and volume. Fastest timeline.
OptimizedBalancedSlightly reduced commitment with 85-90% results.
SustainableLifestyle FitMinimum effective dose. Slower but maintainable.
interface PlanOption {
id: 'peak' | 'optimized' | 'sustainable';
name: string;
frequency: number;
sessionDuration: number;
weeklyVolume: number;
progressRate: number;
estimatedWeeks: number;
tradeoffs: string[];
}

function generatePlanOptions(profile: UserProfile, constraints: UserConstraints): PlanOption[] {
return [
{
id: 'peak',
name: 'Peak Performance',
frequency: 4,
sessionDuration: 60,
weeklyVolume: 16,
progressRate: 100,
estimatedWeeks: calculateTimeline(profile, 1.0),
tradeoffs: [],
},
{
id: 'optimized',
name: 'Optimized Balance',
frequency: Math.min(constraints.maxDays, 4),
sessionDuration: Math.min(constraints.maxDuration, 55),
weeklyVolume: 13,
progressRate: 85,
estimatedWeeks: calculateTimeline(profile, 0.85),
tradeoffs: ['Slightly longer timeline for better work-life balance'],
},
{
id: 'sustainable',
name: 'Sustainable Progress',
frequency: Math.min(constraints.maxDays, 3),
sessionDuration: Math.min(constraints.maxDuration, 45),
weeklyVolume: 10,
progressRate: 65,
estimatedWeeks: calculateTimeline(profile, 0.65),
tradeoffs: [
'Longer timeline but highly maintainable',
'Focus on compound movements',
'Perfect for busy schedules',
],
},
];
}

Sources



Last Updated: 2025-12-08