pH / KH / CO2 Relationship Chart

Enter your measured pH and carbonate hardness (KH) and the chart below highlights your cell and estimates dissolved CO2 in ppm. Green cells mark the 20–35 ppm zone most CO2-injected planted tanks aim for. The chart is genuinely useful — and genuinely misleading in tanks with active soil or other acids, so read the notes below before trusting a single number.

Find your cell

Cell values are CO2 in ppm (mg/L), from CO2 = 3 × KH × 10(7−pH). Colours: blue <15 (low), green 15–35 (injection target), amber 35–50 (high), red >50 (risk to livestock).

How the chart works

Dissolved CO2, carbonate hardness and pH are locked together by the carbonate equilibrium: CO2 in water forms carbonic acid, which lowers pH; carbonates (measured as KH) buffer against that acid. If carbonate is the only buffer present, knowing any two of the three values fixes the third:

CO2 (ppm) ≈ 3 × KH (dKH) × 10(7 − pH)

This relationship, standard water chemistry long used by the planted-tank community, is what generates every cell in the table above. Notice the two practical patterns it produces: at fixed KH, each 0.3 drop in pH roughly doubles CO2; and at fixed pH, CO2 scales linearly with KH. That second pattern is why the classic advice for CO2 injection is to watch the pH drop from your degassed baseline — a full 1.0 unit drop corresponds to a tenfold rise in CO2 regardless of your KH.

When the chart lies

The formula assumes carbonate is the only thing buffering your water. Real tanks violate that assumption constantly:

Two more trustworthy cross-checks: a drop checker filled with 4 dKH reference solution (its sealed air gap isolates it from your tank’s other buffers), and the degassed-sample method — let a glass of tank water sit 24 hours, measure its pH, and treat the difference from tank pH as your injection level (target ≈1.0 unit for high-tech tanks). Use the chart as a sanity check across methods, never as the single source of truth.

Reading the colours

Below ~10–15 ppm is where un-injected tanks sit (atmospheric equilibrium is 2–4 ppm; fish respiration lifts it a little). Injected planted tanks usually target 20–35 ppm during the photoperiod. Sustained levels above ~50 ppm impair oxygen transport in fish blood even with plenty of oxygen present — gasping at the surface, lethargy and losses follow. If you see that, increase surface agitation and cut injection first, then investigate. For persistent livestock problems, consult an experienced aquatic specialist; CO2 is only one of several possible causes.

Frequently asked questions

The chart says my low-tech tank has 30 ppm CO2. Is that real?

Almost certainly not — it is the classic symptom of a non-carbonate buffer (soil substrate, tannins, pH-down products) pushing your pH lower than the carbonate equilibrium would. A tank without injection physically cannot hold 30 ppm for long; it would outgas to single digits. Trust a degassed-sample comparison instead.

What if my KH is zero?

The formula divides the buffering role entirely to carbonates, so at KH 0 the chart is undefined and pH itself becomes unstable. Most keepers running remineralised RO or aquasoil aim for at least 1–2 dKH when injecting CO2, or rely on a drop checker (which carries its own KH reference and works regardless of tank KH).

Is 30 ppm CO2 safe for fish?

In an oxygen-rich, well-agitated tank, most common species tolerate ~30 ppm during the photoperiod — it is the de facto standard in high-tech planted tanks. Sensitive species, heavy stocking, poor surface movement or overnight injection change that picture quickly. Ramp up over days, watch behaviour at dawn (CO2 peaks overnight if not on a solenoid timer), and back off at any sign of gasping.

Why do pH readings drift during the day?

In a planted or injected tank that is the CO2 cycle itself: plants consume CO2 under light (pH rises), respiration adds it back overnight (pH falls). A 0.3–0.5 unit daily swing is normal and mostly harmless because the KH buffer means it does not reflect a swing in mineral chemistry. Measure at the same time of day when comparing readings.