Substituting an Exercise

Swap an exercise mid-workout when something hurts or equipment is unavailable.

client guide/workout-tracker
What this is for: Don't skip the workout — pick a smart alternative that hits the same muscle group.

When to substitute

Real-life reasons:

  • The squat rack is taken — no barbell back squat.
  • Your shoulder is twingy — barbell bench is sketchy.
  • You forgot your dumbbells.
  • The exercise just doesn't feel right today.

Don't skip the muscle group — substitute.

Step-by-step

  1. In the execution screen, on any exercise card, tap Substitute Exercise.
  2. The ExerciseSubstitution modal opens.
  3. The system shows alternatives from /api/exercises/alternatives. Each alternative is filtered to:
  • Same primary muscle group (e.g. chest)
  • Compatible equipment (or "anything available")
  • Similar difficulty
  1. Tap the alternative you want.
  2. The current exercise is replaced for THIS session only — the program template is not modified.
  3. Continue your workout.

How alternatives are picked

The /api/exercises/alternatives endpoint scores candidates by:

  • Muscle group overlap (primary + secondary)
  • Equipment match
  • Movement pattern (push / pull / squat / hinge / carry)
  • Difficulty within ±1 of original

Top 5-10 results are shown. The original sets / reps / RPE targets are kept.

What your trainer sees

Your session log marks the substitution explicitly:

  • Original exercise name struck through.
  • Replacement name shown.
  • Tag: [substituted].

If you keep substituting the same exercise repeatedly, it's a signal — message your trainer about it.

Permanent vs one-time

  • One-time substitution — just pick from the modal. Affects this session only.
  • Permanent change — ask your trainer to update the workout template. They can edit it for all future occurrences.

Common pitfalls

Where to find this

  • Trigger: any exercise card during workout → Substitute Exercise.
  • Component: ExerciseSubstitution.
  • API: GET /api/exercises/alternatives (query params: exerciseId, equipment).
Was this article helpful?