Brewing Water Calculator and Mash pH Planner
Plan mash salts and acid with a transparent malt-buffer model. See the titration-curve intersection, residual alkalinity and a typical ±0.15 pH planning band.
This mash pH calculator helps all-grain brewers, brewing students and process-minded experimenters plan water treatment before dough-in. It connects a water report, a grain bill and weighed additions to a predicted mash pH. Every intermediate quantity is visible, so you can see why changing the water or malt changes the answer.
Start with the volume of water actually present in the mash. Enter source-water alkalinity as mg/L CaCO₃, plus calcium, magnesium, sodium, sulfate and chloride. Alkalinity is different from total hardness and from bicarbonate concentration. The RO/DI share dilutes the source report with water assumed to contain negligible minerals. Sparge water added later belongs in a separate treatment calculation.
Enter up to four malt contributions by mass. Select published samples or switch to your own measured distilled-water pH and buffering data. The sample names identify historical measurements; they are not specifications for today's bags. For a recipe with more components, combine a subgroup into one measured-data slot: add its buffering contributions and use their buffering-weighted pH. Do not average pH by mass alone when buffering differs.
Add mash-only gypsum, calcium chloride, Epsom salt, sodium chloride or baking soda. Match the calcium chloride hydration to the bag. Choose the correct lactic or phosphoric acid bottle, then enter the total dose already planned. The brewing water calculator reports both the total acid needed for your target and the change from the entered dose. A negative change means reduce the planned total; acid already added cannot be taken back. If the target needs alkali, the tool says so instead of suggesting a negative acid dose.
The titration chart makes the prediction inspectable. One curve is the net acid demand of malt, water and salt reactions; the other is the acid delivered at each trial pH. Their intersection is the prediction. A second chart shows dose sensitivity, with mL on its axis. Table headings identify each physical unit; the mass heading follows the Metric/US switch. The ion table describes treated water before malt reactions, not finished beer. Residual alkalinity remains a useful water statistic, while the individual malt buffers determine how strongly it moves pH.
Treat the result as typically uncertain by ±0.15 pH, not as a guaranteed interval. Malt lots, grind, extraction time, carbonate loss and calcium response can widen the error. Cool a representative sample to 20–25 °C, measure with a calibrated meter, and make small, mixed-in corrections. Automatic temperature compensation does not convert a hot sample's chemistry into cooled-sample pH.
This planner covers ordinary infusion mashes. It does not model souring, fermentation, extract brewing, detailed phosphate precipitation, sparging, or undissolved chalk. Acidulated malt needs measured data rather than a fixed percent-to-pH rule. The no-acid comparison is omitted outside pH 5.0–6.0. Both entered and target acid volumes must stay within 1% of mash water; salt dissolution and adjusted-ion checks reject concentrated mixtures even when the pH balance closes. Record actual readings alongside predictions.
How it is calculated
The planner combines a linear malt proton balance with a Kolbach-type water correction. This is an explicit engineering approximation, not a reproduction of a proprietary calculator.
For malt , use a positive buffer magnitude in mmol H⁺ equivalents/(kg·pH) and its distilled-water pH . Riffe & Spencer (2018), PDF pp. 2–3, derive the charge balance; their negative is represented here by . The selectable data are historical samples from their Tables I (p. 6) and V (p. 16).
Salt masses are converted to mmol of the stated hydrates, then to ion masses using molar masses. RO/DI dilution precedes salt additions. Alkalinity is reported as CaCO₃ with the conventional factor of H⁺ equivalents. The open, heated mash approximation consumes the full reported alkalinity.
Here is L, ion concentrations are mg/L, and molar masses are mg/mmol. Kolbach uses ; Mg then uses 7. The separately reported Kolbach residual alkalinity always uses these original divisors and excludes added acid. The sensitivity input changes only the prediction's mineral response. Troester (2009), PDF pp. 7–8, observed Ca divisors 2.6–3.1 and a roughly half-strength Mg effect; these are limited experiments, not universal constants.
For stock acid, in mmol/mL. Lactic acid delivers H⁺ equivalents per mL. Phosphoric acid uses the full triprotic mean charge from pKa values 2.15, 7.09 and 12.32 (Sigma P6560); it releases about one proton per molecule near mash pH, not three. Known-equivalent-strength mode assumes a constant measured strength.
The solved balance is
A 28-iteration bisection brackets pH 4–7. An unbracketed case is rejected by a condition. The crossing curves show the two sides. The target dose is the nonnegative target demand divided by acid strength at the target; a negative demand instead triggers an alkali-needed message. Reference cases test a published acid-dose example, a published residual-alkalinity example and stock molarities; properties test conservation and physically required trends.
The no-acid comparison is evaluated separately and replaced by a deliberate gap outside pH 5.0–6.0. Validity conditions compare both acid-solution volumes to 1% of mash water, each salt mass/volume to its dissolution screen, and each adjusted ion concentration to the authored operating envelope. These checks are independent of the proton balance, so a mathematical pH root cannot validate an undissolved or excessively concentrated mixture.
Assumptions
- All reported pH values refer to a cooled sample at 20–25 °C. No fixed hot-to-cold pH offset is applied.
- Malt buffering is linear and additive near normal mash pH. Its units are mmol H⁺ equivalents per kg per pH unit, numerically the same as mEq/(kg·pH); pH itself has no unit. These are fitted effective buffers, not individual molecular species.
- The selectable malt entries are published sample data. Batch, maltster, grind and mash-time differences are not represented. Measured-data mode replaces all four sample selections; zero-mass slots contribute nothing.
- Full water alkalinity is consumed as carbonate is acidified and CO₂ escapes. This is an open-mash approximation; retained carbonate would reduce acid demand and can make this estimate overstate the needed dose.
- Calcium/magnesium acidification follows the selected empirical divisor. Stock phosphoric acid is represented by acid dissociation, with no additional calcium-phosphate precipitation model.
- Salts dissolve completely, at the labeled hydration and purity. Plain-water solubility screens reject gross overdoses, but common-ion effects and precipitation in mixed brewing water are not solved. RO/DI water is mineral-free. Acid carrier water is neglected only when both the entered and target solution volumes are at most 1% of the entered mash-water volume. Salts are entered dry, not as an unaccounted carrier solution. The ion table excludes malt-derived ions and precipitation.
- Added liquid acid is food-grade at the stated w/w strength. A known equivalent strength for an unlisted solution must be measured at the intended pH. No flavor model or fixed sulfate/chloride recipe target is imposed.
- This tool's salt mass balance, weak-acid speciation and numerical solver are derived here from stoichiometry and acid–base equilibrium. No table is inferred from malt color.
Where it applies
Use for ordinary infusion mashes, preferably 2.5–8 L/kg with a predicted cooled-sample pH of 5.0–6.0. The target input spans 5.0–5.8. An entered-dose prediction outside the pH 4–7 numerical bracket is withheld; this bracket is a solver limit, not a brewing recommendation. The separate no-liquid-acid comparison is displayed only at pH 5.0–6.0; otherwise its card says “Outside model range” and a warning identifies the unsupported extrapolation. This does not invalidate an acid-corrected prediction whose own conditions pass.
Typical planning uncertainty is ±0.15 pH, not a confidence interval or a guaranteed error bound. Larger errors are possible for an uncharacterized malt lot, extreme alkalinity/mineral content, unusual grind or rest times, acidulated malt, or substantial carbonate retention. The solver's tiny residual measures numerical convergence only.
Barth & Zaman (2015), DOI 10.1094/ASBCJ-2015-0621-01, report that the classic Kolbach relation requires malt-dependent modification for mashing. Their publisher abstract supports this limitation; the full paper's coefficients were not available as an open attached source and are not claimed to be implemented. The calcium control is a sensitivity exploration, not a substitute for measured calibration.
Do not apply this to sparge-water acidification, kettle/beer pH, fermentation, biological souring, extract brewing or undissolved chalk. For more than four ingredients, use a combined measured-data slot with , and .
Choose the right bottle and hydrate, measure additions accurately, mix thoroughly, and confirm with a cooled mash sample before making further corrections.
Neglected solution volume: both the entered dose and the dose required for the target must be at most 1% of the entered mash-water volume. The dose chart ends at that same limit. The 1% threshold is an authored approximation guardrail; exceeding it requires a model that includes carrier water, not an unchanged mash ratio.
Dissolution and mineral envelope: dry-dose concentration is screened against gypsum 2 g/L, calcium chloride 740 g/L (conservatively for either hydration), Epsom salt 710 g/L, sodium chloride 358 g/L and baking soda 96 g/L. The attached physical-data sources are identified in the salt-screen table. These plain-water screens are necessary checks, not a guarantee of mixed-salt dissolution. Never treat residual-alkalinity cancellation as evidence that salts dissolve.
The planner also withholds results if the adjusted pre-reaction profile exceeds Ca 400, Mg 150, Na 300, SO₄ 600, Cl 500, or alkalinity 600 mg/L as CaCO₃ for the alkalinity row only. These are authored operating guardrails, matching the source-input envelope and constraining highly concentrated mixtures; they are not published phase boundaries, beer-style targets, or experimentally validated accuracy limits. Passing all guards does not remove the model uncertainty.
References
- Kai Troester (2009), The effect of brewing water and grist composition on the pH of the mash. https://braukaiser.com/documents/effect_of_water_and_grist_on_mash_pH.pdf — PDF pp. 2–3 measurement protocol, 7–8 Ca/Mg response, 11 titration, 15–20 experimental data.
- D. Mark Riffe & Mick Spencer (2018), A Homebrewing Perspective on Mash pH III: Distilled-Water pH and Buffering Capacity of the Grist. https://sonsofalchemy.org/wp-content/uploads/2019/01/GristpHBuff.pdf — pp. 2–3 proton balance, p. 6 Table I, p. 16 Table V; author announcement: https://homebrewingphysics.blogspot.com/2018/05/a-homebrewing-perspective-on-mash-ph-iii.html .
- D. Mark Riffe (2013), A Homebrewing Perspective on Mash pH II: Water. https://oldfashionbrewery.wordpress.com/wp-content/uploads/2018/02/a-homebrewing-perspective-on-mash-ph-ii-water-d-m-riffe.pdf — p. 2 Kolbach equation and representative Burton water; review and independent reanalysis of Troester's experiments.
- Paul Kolbach (1953), Der Einfluss des Brauwassers auf das pH von Würze und Bier. Original residual-alkalinity convention, as reproduced and discussed in Riffe (2013), p. 2 and Troester (2009), pp. 1, 7–8. https://homebrewingphysics.blogspot.com/ .
- Roger Barth & Rameez Zaman (2015), Influence of Strike Water Alkalinity and Hardness on Mash pH, J. Am. Soc. Brew. Chem. 73(3), 240–242. DOI: https://doi.org/10.1094/ASBCJ-2015-0621-01 — publisher/author-repository abstract consulted; not used as a source of numerical coefficients.
- Breckland Scientific, DL-Lactic acid 88% (conc.), density 1.209 g/mL and molarity 11.81 M. https://breckland-scientific-supplies-ltd.helpjuice.com/chemicals/702224-dl-lactic-acid-88-conc . Lactic pKa 3.86: PubChem CID 612 (IUPAC/HSDB record), https://pubchem.ncbi.nlm.nih.gov/compound/Lactic-Acid .
- Sigma-Aldrich P6560, Phosphoric acid product information, p. 1: molar mass, 85% solution density and pKas. https://www.sigmaaldrich.com/deepweb/assets/sigmaaldrich/product/documents/124/330/p6560pis.pdf .
- Merck 480951, Phosphoric acid 10%, density 1.053 g/cm³ at 20 °C. https://www.merckmillipore.com/SG/en/product/mm/480951 .
- Merck 102161, Calcium sulfate dihydrate: published solubility 2 g/L. https://www.merckmillipore.com/BG/en/product/mm/102161 . Used as a necessary plain-water screen, not a mixed-ion saturation model.
- Merck 102379, Anhydrous calcium chloride: published solubility 740 g/L. https://www.merckmillipore.com/AF/en/product/mm/102379 . Conservatively also used as this planner's dry-mass screen for dihydrate.
- Carl Roth T888, Magnesium sulphate heptahydrate SDS, Section 9: water solubility 710 g/L at 20 °C. https://www.carlroth.com/downloads/sdb/en/T/SDB_T888_MT_EN.pdf .
- Merck S6150, Sodium chloride: published water solubility 358 g/L at 20 °C. https://www.merckmillipore.com/GE/en/product/sial/s6150 .
- OECD SIDS, Sodium Bicarbonate Initial Assessment Report, p. 8: solubility 96 g/L at 20 °C. https://hpvchemicals.oecd.org/ui/handler.axd?id=e1859b4e-f6a4-4da8-8945-6294354cdf45 .
Inputs
| Input | Symbol | Unit | Default |
|---|---|---|---|
| Mash water volume Use strike water actually in the mash. Exclude later sparge water; include all mash water for full-volume BIAB. | V_mash | L | 15 |
| Target mash pH Target is for a cooled sample at 20–25 °C. pH is dimensionless. | p_target | 5.4 | |
| RO/DI share of mash water 0 = all source water; 0.5 = half source water and half mineral-free water. Residual minerals in RO water are assumed zero. | f_ro | 0 | |
| Alkalinity as CaCO₃ Enter alkalinity, not bicarbonate or total hardness. For bicarbonate-dominated water, alkalinity ≈ HCO₃ × 50/61.0168. Use values before dilution. | Alk_source | mg/L | 80 |
| Calcium (Ca²⁺) Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃. | Ca_source | mg/L | 30 |
| Magnesium (Mg²⁺) Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃. | Mg_source | mg/L | 5 |
| Sodium (Na⁺) Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃. | Na_source | mg/L | 10 |
| Sulfate (SO₄²⁻) Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃. | SO4_source | mg/L | 30 |
| Chloride (Cl⁻) Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃. | Cl_source | mg/L | 20 |
| Use my measured malt data Replaces all four sample selections with editable distilled-water pH and positive buffering magnitudes. Weights still apply. | use_measured | false | |
| Malt 1 mass Set mass to zero to omit this slot. | m_1 | kg | 4.5 |
| Malt 1 published sample Select a measured sample, not a prediction from color. Historical sample values may differ from your batch. | malt_1 | Rahr Pale Ale — Walts | |
| Malt 1 distilled-water pH Measure a small mash in distilled water using the same grind and cooled-sample protocol. | p_user_1 | 5.67 | |
| Malt 1 buffering per pH unit Positive magnitude: mmol H⁺ equivalents per kg per pH unit, numerically mEq/(kg·pH). | b_user_1 | mmol/kg | 49.7 |
| Malt 2 mass Set mass to zero to omit this slot. | m_2 | kg | 0.3 |
| Malt 2 published sample Select a measured sample, not a prediction from color. Historical sample values may differ from your batch. | malt_2 | Weyermann Munich II — Troester | |
| Malt 2 distilled-water pH Measure a small mash in distilled water using the same grind and cooled-sample protocol. | p_user_2 | 5.54 | |
| Malt 2 buffering per pH unit Positive magnitude: mmol H⁺ equivalents per kg per pH unit, numerically mEq/(kg·pH). | b_user_2 | mmol/kg | 56.7 |
| Malt 3 mass Set mass to zero to omit this slot. | m_3 | kg | 0.2 |
| Malt 3 published sample Select a measured sample, not a prediction from color. Historical sample values may differ from your batch. | malt_3 | Briess Caramel L40 — Riffe/Spencer | |
| Malt 3 distilled-water pH Measure a small mash in distilled water using the same grind and cooled-sample protocol. | p_user_3 | 4.9 | |
| Malt 3 buffering per pH unit Positive magnitude: mmol H⁺ equivalents per kg per pH unit, numerically mEq/(kg·pH). | b_user_3 | mmol/kg | 72.2 |
| Malt 4 mass Set mass to zero to omit this slot. | m_4 | kg | 0 |
| Malt 4 published sample Select a measured sample, not a prediction from color. Historical sample values may differ from your batch. | malt_4 | Briess Roasted Barley — Riffe/Spencer | |
| Malt 4 distilled-water pH Measure a small mash in distilled water using the same grind and cooled-sample protocol. | p_user_4 | 4.67 | |
| Malt 4 buffering per pH unit Positive magnitude: mmol H⁺ equivalents per kg per pH unit, numerically mEq/(kg·pH). | b_user_4 | mmol/kg | 67.5 |
| Gypsum (CaSO₄·2H₂O) Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material. | m_gyp | g | 2 |
| Calcium chloride Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material. | m_cacl | g | 1 |
| Epsom salt (MgSO₄·7H₂O) Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material. | m_eps | g | 0 |
| Sodium chloride (NaCl) Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material. | m_nacl | g | 0 |
| Baking soda (NaHCO₃) Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material. | m_bicarb | g | 0 |
| Calcium chloride form Match the bag. Hygroscopic flakes may contain extra water; the calculation assumes the pure selected compound. | cacl_form | Dihydrate — CaCl₂·2H₂O | |
| Acid strength entry Known equivalent strength is acidity delivered at the target pH, or a standardized strong-acid titrant; it is treated as pH-independent. | strength_mode | Nominal bottle preset | |
| Acid bottle Percentages are by mass (w/w), not volume. Dilute and concentrated bottles need very different doses. | acid_stock | Lactic acid 88% w/w | |
| Known effective acid strength mmol H⁺ equivalents per mL at the intended pH; numerically mEq/mL. Use measured/titrated strength for an unlisted bottle. | N_known | mmol/mL | 1 |
| Entered total mash acid dose All acid already planned or added to this mash. The result reports the total required and the signed change from this dose. | V_acid | mL | 4 |
| Calcium response divisor Kolbach: 3.5 Ca equivalents per acid equivalent; magnesium uses twice this divisor. Troester measured 2.6–3.1 in limited mash tests. Lower values strengthen predicted acidification; this is a sensitivity control, not a calibrated fit. | k_Ca | 3.5 |
Results
With the default inputs above, the calc gives:
| Result | Value |
|---|---|
| Predicted mash pH (typically ±0.15) | 5.46 |
| Total acid for target pH | 5.38 mL |
| Acid change (+ add / − reduce total) | 1.38 mL |
| pH before liquid acid (only at 5–6) | 5.64 |
| Kolbach residual alkalinity as CaCO₃ | 20.6 mg/L |
| Mash water-to-grist ratio | 3 L/kg |
Checked against sources
Each case below was calculated by this calc and agrees with the value from its source (within the tolerance where one is shown).
Riffe & Spencer worked example: 20 mEq/kg acid
Source: Riffe & Spencer (2018), PDF p. 3, worked example under Eq. (1): Maris Otter pHi 5.85, |Bi| 51 mEq/kg, 20 mEq/kg acid gives pH 5.46. The worked example rounds its inputs; the measured-table row uses 5.84 and 51.4 and is deliberately not substituted here. Known-equivalent mode represents the stated strong-acid dose.
Inputs: Gypsum (CaSO₄·2H₂O) = 0 g; Calcium chloride = 0 g; Mash water volume = 4 L; Alkalinity as CaCO₃ = 0 mg/L; Calcium (Ca²⁺) = 0 mg/L; Magnesium (Mg²⁺) = 0 mg/L; Use my measured malt data = yes; Malt 1 mass = 1 kg; Malt 2 mass = 0 kg; Malt 3 mass = 0 kg; Malt 1 distilled-water pH = 5.85; Malt 1 buffering per pH unit = 51 mmol/kg; Acid strength entry = Known equivalent strength; Entered total mash acid dose = 20 mL; the others as above.
| Result | Source | This calc |
|---|---|---|
| Predicted mash pH (typically ±0.15) | 5.46 | 5.458 |
Riffe representative Burton water: near-zero RA
Source: Riffe (2013), PDF p. 2, representative Burton water: alkalinity 4.43, calcium 13.75, magnesium 3.29 mEq/L, reported RA 0.03 mEq/L. Converted to elemental mg/L using Ca 40.078 and Mg 24.305 mg/mmol; no added salts. Published result is rounded.
Inputs: Gypsum (CaSO₄·2H₂O) = 0 g; Calcium chloride = 0 g; Alkalinity as CaCO₃ = 221.5 mg/L; Calcium (Ca²⁺) = 275.5 mg/L; Magnesium (Mg²⁺) = 39.982 mg/L; Entered total mash acid dose = 0 mL; the others as above.
| Result | Source | This calc |
|---|---|---|
| Kolbach residual alkalinity in equivalents | 0.03 ± 0.005 mmol/L | 0.03143 mmol/L |
Breckland 88% lactic acid: 11.81 mol/L
Source: Breckland Scientific, DL-Lactic acid 88% (conc.), https://breckland-scientific-supplies-ltd.helpjuice.com/chemicals/702224-dl-lactic-acid-88-conc . Published density 1.209 g/mL, assay 88%, MW 90.08; published molarity 11.81 M. mmol/mL is numerically mol/L. This checks stock concentration, before the separate dissociation correction.
Inputs: the default inputs above.
| Result | Source | This calc |
|---|---|---|
| Stock acid molarity before dissociation | 11.81 mmol/mL | 11.811 mmol/mL |
Sigma 85% phosphoric acid: 14.7 mol/L
Source: Sigma-Aldrich P6560 Product Information, PDF p. 1, https://www.sigmaaldrich.com/deepweb/assets/sigmaaldrich/product/documents/124/330/p6560pis.pdf . Published effective molarity 14.7 M based on density at 25 °C. Density 1.685 g/mL and nominal 85% assay give 14.61 M with MW 98.00; retain stoichiometry, allow the source's coarser rounding/assay (0.09 M). Do not confuse this molarity with three-proton normality.
Inputs: Acid bottle = Phosphoric acid 85% w/w; the others as above.
| Result | Source | This calc |
|---|---|---|
| Stock acid molarity before dissociation | 14.7 ± 0.09 mmol/mL | 14.615 mmol/mL |

Responses