Maintaining the perfect chemical balance in your hot tub is critical for both swimmer safety and equipment longevity. High temperatures in spas lead to rapid bacterial growth and chemical evaporation, making regular testing and dosage calculation essential.
Standard Chemical Guidelines
Free Chlorine: 3.0 – 5.0 ppm
Bromine: 3.0 – 5.0 ppm
pH Level: 7.2 – 7.8 (Ideal: 7.4 – 7.6)
Total Alkalinity: 80 – 120 ppm
Calcium Hardness: 150 – 250 ppm
How to Use This Calculator
Determine Volume: Most standard hot tubs hold between 300 and 500 gallons. Check your owner's manual for the exact figure.
Test the Water: Use a high-quality test strip or liquid test kit to find your current levels.
Input Data: Enter your current reading and the target reading from the guidelines above.
Adjust: Add the calculated amount of product. Always add chemicals to water, never water to chemicals.
Pro Tip: Always run the jets for at least 15-20 minutes with the cover off after adding chemicals to ensure proper mixing and to prevent gas buildup that can damage the underside of your cover.
function calculateDosage() {
var volume = parseFloat(document.getElementById('tubVolume').value);
var type = document.getElementById('chemType').value;
var current = parseFloat(document.getElementById('currentLevel').value);
var target = parseFloat(document.getElementById('targetLevel').value);
var resultDiv = document.getElementById('chemResult');
var output = document.getElementById('resultOutput');
var note = document.getElementById('dosageNote');
if (isNaN(volume) || isNaN(current) || isNaN(target) || volume <= 0) {
alert('Please enter valid numbers for volume and levels.');
return;
}
var dosage = 0;
var unit = "ounces";
var product = "";
if (type === "chlorine") {
// Calculation for Granular Dichlor (approx 0.25 oz per 1000 gallons to raise 1 ppm)
var diff = target – current;
if (diff <= 0) {
dosage = 0;
} else {
dosage = (volume / 1000) * diff * 0.25;
}
product = "Sodium Dichlor (Granular Chlorine)";
note.innerHTML = "Wait 20 minutes before re-testing.";
}
else if (type === "bromine") {
// Calculation for Bromine Granules (approx 0.4 oz per 1000 gallons to raise 1 ppm)
var diff = target – current;
if (diff <= 0) {
dosage = 0;
} else {
dosage = (volume / 1000) * diff * 0.4;
}
product = "Bromine Granules";
note.innerHTML = "Bromine takes longer to dissolve than chlorine.";
}
else if (type === "alkalinity") {
// Calculation for Sodium Bicarbonate (approx 2.4 oz per 1000 gal to raise 10 ppm)
var diff = target – current;
if (diff <= 0) {
dosage = 0;
} else {
dosage = (volume / 1000) * (diff / 10) * 2.4;
}
product = "Sodium Bicarbonate (Alkalinity Increaser)";
note.innerHTML = "High alkalinity can cause scale and cloudy water.";
}
else if (type === "phDown") {
// Calculation for Sodium Bisulfate (approx 0.5 oz per 500 gal to drop 0.2 pH)
var diff = current – target;
if (diff 0) {
output.innerHTML = dosage.toFixed(2) + " " + unit + " of " + product;
resultDiv.style.display = 'block';
} else {
output.innerHTML = "No chemicals needed.";
note.innerHTML = "Your current level is already at or above the target.";
resultDiv.style.display = 'block';
}
}
// Update labels based on selection
document.getElementById('chemType').onchange = function() {
var type = this.value;
var l1 = document.getElementById('labelCurrent');
var l2 = document.getElementById('labelTarget');
var i1 = document.getElementById('currentLevel');
var i2 = document.getElementById('targetLevel');
if (type === "phDown") {
l1.innerHTML = "Current pH Level";
l2.innerHTML = "Target pH Level";
i1.placeholder = "e.8.0";
i2.placeholder = "7.4";
} else if (type === "alkalinity") {
l1.innerHTML = "Current Alkalinity (ppm)";
l2.innerHTML = "Target Alkalinity (ppm)";
i1.placeholder = "60";
i2.placeholder = "100";
} else {
l1.innerHTML = "Current Level (ppm)";
l2.innerHTML = "Target Level (ppm)";
i1.placeholder = "1.0";
i2.placeholder = "3.0";
}
};