How We Calculate: Pool Chemistry and Math
The exact chemistry and formulas behind our pool calculators — FC/CYA, pH, alkalinity, calcium, salt, CYA and borates — with the constants, where they come from, and where they break down.
What this page is
Every dosing number our calculators give you comes from a specific formula with a specific constant. This page shows all of them — what we use, why it's justified, and where the simple version stops being exact. It's here for the curious; you never need to read it to use the tools.
Free chlorine & CYA — why FC scales with stabilizer
This is the one piece of pool chemistry most worth understanding, and the place a flat "keep chlorine at 3 ppm" rule goes wrong.
The chemistry
Free chlorine in water splits between hypochlorous acid (HOCl) — the part that actually kills pathogens and algae — and hypochlorite ion (OCl⁻). Cyanuric acid (CYA, "stabilizer") acts as a reservoir: it binds the great majority of your free chlorine into chlorinated isocyanurates, protecting it from sunlight but holding it in reserve. Only a small, equilibrium-controlled fraction stays as active HOCl at any moment.
The consequence — established by measured equilibrium constants (O'Brien, Wojtowicz, et al.) — is that the active sanitizer level depends on the FC ÷ CYA ratio, not on FC alone. Double the CYA and you must roughly double the FC to keep the same killing power. That's why every number below is a percentage of your CYA.
What we use
| Level | Formula | At CYA 40 | Meaning |
|---|---|---|---|
| Minimum FC | 7.5% × CYA | 3 ppm | Bare floor — below this, algae can establish. |
| Target FC (chlorine pool) | 10% × CYA | 4 ppm | The level you actually maintain. A little above the floor for cushion. |
| Target FC (salt / SWG) | 6% × CYA | — | Salt pools run higher CYA (70–80) but lower FC%, since the cell replenishes continuously. |
| SLAM / shock | 40% × CYA | 16 ppm | Temporary level to clear algae (TFP SLAM process). |
All four are floored for very low CYA (Target/Min never drop below 2 ppm of sanitizer; SLAM never below 10) and snapped to the nearest 0.5 ppm so the dial moves in step with each 5‑ppm CYA click.
Is it really linear? (No — but close, on purpose)
The true relationship is nonlinear: CYA can hold one, two or three chlorines per molecule (mono‑, di‑ and tri‑chloroisocyanurate) and has its own pH‑dependent dissociation, so the full free‑HOCl curve bends. We use a fixed percentage because, in normal pool conditions, CYA is in large excess over chlorine — almost all chlorine binds as the mono‑ species, and the system collapses to:
[active HOCl] ≈ K · (FC / CYA)That's the large‑excess limit of the real equilibrium, not a guess. Across CYA 30→80 at a fixed ratio, true active chlorine drifts only ~±10–15% — smaller than a test kit's resolution (FAS‑DPD reads in 0.5 ppm steps). Modeling the exact curve would be false precision. Where the linear shortcut genuinely fails, we patch it:
- CYA near 0: the ratio model breaks, so we floor at 2 ppm of sanitizer.
- CYA above ~90: linear slightly under-recommends; the tools warn you to lower CYA (partial drain) rather than chase ever-higher FC.
- pH also shifts the HOCl/OCl⁻ split; the chart assumes ~7.5, and pH is handled by its own target.
Chlorine dose
To raise free chlorine, the weight (or volume) of product depends on its available‑chlorine percentage:
amount = (gallons / 10,000) × ΔFC × (133.3 / product%)The 133.3 constant is the stoichiometric amount of available chlorine to raise 10,000 gal by 1 ppm. Divide by the product's strength to get the real dose — e.g. 12.5% liquid chlorine needs 133.3 / 12.5 ≈ 10.7 fl oz per 10k gal per ppm. Liquids are shown by volume, solids by weight.
Side effects we also report: cal‑hypo adds ~0.71 ppm calcium hardness per ppm FC; dichlor adds ~0.9 ppm CYA per ppm FC; trichlor adds ~0.6 ppm CYA per ppm FC. That's why stabilized chlorine slowly drives CYA up.
pH
Lowering pH — muriatic acid (31.45%)
fl oz = (gallons / 10,000) × (TA / 100) × (ΔpH / 0.1) × 8.0Acid demand scales with how much buffer (total alkalinity) is in the water, so the dose is multiplied by TA / 100. Weaker acid is scaled up by 31.45 / its%. Because acid also pulls alkalinity down, big moves are staged (drop pH to ~7.2, aerate back up, repeat).
Raising pH — soda ash (sodium carbonate)
oz = (gallons / 10,000) × (ΔpH / 0.2) × 6~6 oz of soda ash per 10k gal raises pH about 0.2. Soda ash also raises alkalinity, which is the trade-off versus aeration (which raises pH without adding anything).
Total alkalinity (TA)
Raising TA — baking soda (sodium bicarbonate)
lb = (gallons / 10,000) × (ΔTA / 10) × 1.40Why 1.40: raising TA 10 ppm (as CaCO₃) in 10k gal is 0.834 lb of CaCO₃‑equivalent alkalinity; each pound of NaHCO₃ supplies ~0.595 lb of it (50 g CaCO₃ per 84 g NaHCO₃), so 0.834 ÷ 0.595 = 1.40 lb. (Soda ash would do it in ~0.88 lb but spikes pH, so baking soda is preferred for TA‑only moves.)
Lowering TA — muriatic acid (31.45%)
fl oz (total) = (gallons / 10,000) × (ΔTA / 10) × 25.6Why 25.6: 10 ppm TA in 10k gal is 7.57 equivalents of alkalinity; 31.45% muriatic supplies ~0.296 equivalents per fl oz, so 7.57 ÷ 0.296 = 25.6 fl oz. This is the total across the acid‑and‑aerate stages — there's no chemical that lowers TA without also dropping pH, so you do it in cycles.
Calcium hardness
lb = (gallons / 10,000) × (ΔCH / 10) × 1.22Why 1.22: 10 ppm CH (as CaCO₃) is 0.834 lb of calcium‑equivalent; calcium chloride dihydrate (CaCl₂·2H₂O, the common flake product, ~77–80%) supplies it at 100/147 by weight, so 0.834 ÷ 0.68 = 1.22 lb. If your product is anhydrous (94%+), use ~20–25% less. Nothing removes calcium chemically — you lower it by dilution.
CYA / stabilizer
oz = (gallons / 10,000) × (ΔCYA / 10) × 1313 oz of granular cyanuric acid per 10k gal raises CYA about 10 ppm. CYA dissolves slowly — add it through a sock in the skimmer and re-test in 24–48 h before adding more. Nothing lowers CYA chemically; it breaks down very slowly on its own (~a few percent a month), so you reduce it by partial drain and refill.
Salt
lb = (gallons / 10,000) × (Δppm / 1,000) × 83.4 bags = lb / 40Why 83.4: 1 ppm = 1 mg/L; 10,000 gal = 37,850 L; raising 1,000 ppm therefore needs 37.85 kg = 83.4 lb of salt — pure unit conversion, exact. Pool salt is ~99%+ pure, so no purity fudge is needed.
Borates
boric acid (lb) = (gallons / 1,000) × Δppm × 0.0280.028 lb of boric acid per 1,000 gal raises borate 1 ppm. Boric acid barely moves pH. Using 20 Mule Team borax instead takes slightly more (~0.0286 lb) and requires muriatic acid afterward to offset the pH rise the borax causes.
Assumptions & limits
- Estimates, not lab values. Real results vary with temperature, exact product purity, fill‑water chemistry, and how well things mix. Always test your own water and read product labels before adding chemicals.
- Product strength matters. The constants assume common strengths (12.5% liquid chlorine, 31.45% muriatic, CaCl₂ dihydrate, etc.). The calculators let you set the actual percentage where it matters.
- Precision is bounded by your test kit. A drop or strip test is ±0.5–1 ppm; chasing two‑decimal doses is meaningless. We round to what you can actually measure and pour.
- Add less, re‑test, repeat. It's always easier to add more than to undo an overdose. For big moves, go partway and re‑test.
Sources & further reading
- Trouble Free Pool — the FC/CYA Chart and "ABCs of Pool Water Chemistry" (the basis for our FC %, SLAM level, and overall approach). troublefreepool.com
- PoolMath — the dosing conventions our chemical constants match. troublefreepool.com/poolmath
- Chlorine–cyanurate equilibrium chemistry — J. A. Wojtowicz; O'Brien, Morris & Weil; and later equilibrium modeling (R. Falk). The measured equilibrium constants behind "active chlorine scales with FC/CYA." Journal of the Swimming Pool & Spa Industry ↗
- CDC / MAHC — public‑pool guidance confirming CYA reduces chlorine's disinfection rate (why CYA is capped in commercial pools). cdc.gov