*Standard springs come in 50lb increments. Results assume a typical rear weight bias of 67%.
Understanding Coil Spring Rates
Choosing the correct coil spring rate is the single most important step in setting up a coil shock on your mountain bike. Unlike air shocks, where you can simply grab a pump to adjust sag, coil shocks require the physical spring to match your body weight and bike kinematics.
How This Calculator Works
This calculator uses a physics-based approach considering your weight, the bike's mechanical leverage ratio, and your desired sag point. The formula used is:
Where Bias is the rear weight distribution (typically 65-70% for mountain bikes) and Leverage Ratio is the Wheel Travel divided by the Shock Stroke.
Input Guide
Total Rider Weight: Do not use your "morning bathroom scale" weight. Put on your helmet, shoes, hydration pack, and riding kit. This usually adds 10-15 lbs.
Frame Travel: The vertical distance the rear wheel moves (in millimeters). Check your bike manufacturer's spec sheet.
Shock Stroke: The amount the shock shaft compresses. This is the second number in metric shock sizing (e.g., in a 230×60 shock, 60mm is the stroke).
Sag: The amount the bike compresses under your body weight alone.
25%: Firm feel, better pedaling efficiency, less sensitive to small bumps.
30%: The industry standard for Enduro/Trail. Good balance of grip and support.
33%+: Very plush, maximum grip, used mostly for Downhill (DH) applications.
Standard vs. Calculated Rates
Your calculated "Ideal Rate" might be 432 lbs/in, but springs are typically manufactured in 50 lb increments (e.g., 400, 450, 500). If you fall between sizes:
Condition
Recommendation
Aggressive / Jump Lines
Round Up (Stiffer). Prevents bottom-outs on hard landings.
Technical / Roots / Wet
Round Down (Softer). Improves traction and wheel tracking.
Preload Adjuster
You can add up to 2 turns of preload to a softer spring to fine-tune sag, but never preload a spring more than 2-3 turns.
function calculateSpringRate() {
// 1. Get Inputs
var weightInput = document.getElementById("riderWeight").value;
var travelInput = document.getElementById("rearTravel").value;
var strokeInput = document.getElementById("shockStroke").value;
var sagInput = document.getElementById("desiredSag").value;
// 2. Validate Inputs
if (weightInput === "" || travelInput === "" || strokeInput === "") {
alert("Please fill in all fields (Weight, Travel, and Stroke).");
return;
}
var weight = parseFloat(weightInput);
var travelMM = parseFloat(travelInput);
var strokeMM = parseFloat(strokeInput);
var sagPercent = parseFloat(sagInput);
if (isNaN(weight) || isNaN(travelMM) || isNaN(strokeMM) || weight <= 0 || strokeMM <= 0) {
alert("Please enter valid positive numbers.");
return;
}
// 3. Constants and Conversions
// Convert MM to Inches for the calculation (Spring rates are Lbs/Inch)
var strokeInches = strokeMM / 25.4;
var travelInches = travelMM / 25.4;
// Rear Weight Bias: Percentage of weight on rear wheel while standing in "attack position"
// 67% (0.67) is a widely accepted industry standard for modern geometry
var rearBias = 0.67;
// 4. Calculate Leverage Ratio
var leverageRatio = travelMM / strokeMM;
// 5. Calculate Required Spring Rate
// Formula: k = (RiderWeight * Bias * Leverage) / (StrokeInches * SagDecimal)
// Explanation:
// Force on Wheel = Weight * Bias
// Force on Shock = Force on Wheel * LeverageRatio
// Sag Displacement (inches) = StrokeInches * (SagPercent / 100)
// Spring Rate = Force on Shock / Sag Displacement
var forceOnWheel = weight * rearBias;
var forceOnShock = forceOnWheel * leverageRatio;
var sagDisplacement = strokeInches * (sagPercent / 100);
var idealRate = forceOnShock / sagDisplacement;
// 6. Calculate Standard Spring Options (Nearest 50lbs)
// Springs usually come in 25lb or 50lb increments. We will use 50lb for general recommendation.
var roundedRate = Math.round(idealRate / 50) * 50;
var softOption = Math.floor(idealRate / 50) * 50;
var stiffOption = Math.ceil(idealRate / 50) * 50;
// Handle case where ideal is exactly a multiple of 50
if (softOption === stiffOption) {
softOption -= 50;
stiffOption += 50;
}
// 7. Update DOM
document.getElementById("idealRateDisplay").innerHTML = Math.round(idealRate) + " lbs/in";
document.getElementById("leverageDisplay").innerText = leverageRatio.toFixed(2);
document.getElementById("softOption").innerText = softOption + " lbs";
document.getElementById("stiffOption").innerText = stiffOption + " lbs";
// Logic for "Recommended"
// If the ideal rate is closer to the stiff option, recommend stiff, otherwise soft.
var distToSoft = Math.abs(idealRate – softOption);
var distToStiff = Math.abs(idealRate – stiffOption);
var recommended = (distToStiff < distToSoft) ? stiffOption : softOption;
document.getElementById("recOption").innerText = recommended + " lbs";
// Show result box
document.getElementById("results").style.display = "block";
// Scroll to results
document.getElementById("results").scrollIntoView({ behavior: 'smooth' });
}