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.

#acid dosing #brewing water #malt buffering #mash pH #residual alkalinity #salt solubility

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 ii, use a positive buffer magnitude βi\beta_i in mmol H⁺ equivalents/(kg·pH) and its distilled-water pH pip_i. Riffe & Spencer (2018), PDF pp. 2–3, derive the charge balance; their negative BiB_i is represented here by βi=−Bi\beta_i=-B_i. The selectable data are historical samples from their Tables I (p. 6) and V (p. 16).

B=∑imiβi,pDI=∑imiβipiB.B=\sum_i m_i\beta_i,\qquad p_{DI}=\frac{\sum_i m_i\beta_i p_i}{B}.

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 50 mg/mmol50\,\mathrm{mg/mmol} of H⁺ equivalents. The open, heated mash approximation consumes the full reported alkalinity.

QRA=V[Alk50−2CaMCakCa−2MgMMg(2kCa)].Q_{RA}=V\left[\frac{Alk}{50}-\frac{2Ca}{M_{Ca}k_{Ca}}-\frac{2Mg}{M_{Mg}(2k_{Ca})}\right].

Here VV is L, ion concentrations are mg/L, and molar masses are mg/mmol. Kolbach uses kCa=3.5k_{Ca}=3.5; 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, N=1000ρw/MN=1000\rho w/M in mmol/mL. Lactic acid delivers N/[1+10(3.86−pH)]N/[1+10^{(3.86-pH)}] 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

B(pDI−pH)+QRA=Vaca(pH).B(p_{DI}-pH)+Q_{RA}=V_a c_a(pH).

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 m=∑mim=\sum m_i, β=∑miβi/m\beta=\sum m_i\beta_i/m and pDI=∑miβipi/∑miβip_{DI}=\sum m_i\beta_i p_i/\sum m_i\beta_i.

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

InputSymbolUnitDefault
Mash water volume
Use strike water actually in the mash. Exclude later sparge water; include all mash water for full-volume BIAB.
V_mashL15
Target mash pH
Target is for a cooled sample at 20–25 °C. pH is dimensionless.
p_target5.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_ro0
Alkalinity as CaCO₃
Enter alkalinity, not bicarbonate or total hardness. For bicarbonate-dominated water, alkalinity ≈ HCO₃ × 50/61.0168. Use values before dilution.
Alk_sourcemg/L80
Calcium (Ca²⁺)
Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃.
Ca_sourcemg/L30
Magnesium (Mg²⁺)
Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃.
Mg_sourcemg/L5
Sodium (Na⁺)
Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃.
Na_sourcemg/L10
Sulfate (SO₄²⁻)
Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃.
SO4_sourcemg/L30
Chloride (Cl⁻)
Enter the water report value before dilution. These are elemental or ion concentrations, not hardness as CaCO₃.
Cl_sourcemg/L20
Use my measured malt data
Replaces all four sample selections with editable distilled-water pH and positive buffering magnitudes. Weights still apply.
use_measuredfalse
Malt 1 mass
Set mass to zero to omit this slot.
m_1kg4.5
Malt 1 published sample
Select a measured sample, not a prediction from color. Historical sample values may differ from your batch.
malt_1Rahr 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_15.67
Malt 1 buffering per pH unit
Positive magnitude: mmol H⁺ equivalents per kg per pH unit, numerically mEq/(kg·pH).
b_user_1mmol/kg49.7
Malt 2 mass
Set mass to zero to omit this slot.
m_2kg0.3
Malt 2 published sample
Select a measured sample, not a prediction from color. Historical sample values may differ from your batch.
malt_2Weyermann 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_25.54
Malt 2 buffering per pH unit
Positive magnitude: mmol H⁺ equivalents per kg per pH unit, numerically mEq/(kg·pH).
b_user_2mmol/kg56.7
Malt 3 mass
Set mass to zero to omit this slot.
m_3kg0.2
Malt 3 published sample
Select a measured sample, not a prediction from color. Historical sample values may differ from your batch.
malt_3Briess 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_34.9
Malt 3 buffering per pH unit
Positive magnitude: mmol H⁺ equivalents per kg per pH unit, numerically mEq/(kg·pH).
b_user_3mmol/kg72.2
Malt 4 mass
Set mass to zero to omit this slot.
m_4kg0
Malt 4 published sample
Select a measured sample, not a prediction from color. Historical sample values may differ from your batch.
malt_4Briess 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_44.67
Malt 4 buffering per pH unit
Positive magnitude: mmol H⁺ equivalents per kg per pH unit, numerically mEq/(kg·pH).
b_user_4mmol/kg67.5
Gypsum (CaSO₄·2H₂O)
Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material.
m_gypg2
Calcium chloride
Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material.
m_caclg1
Epsom salt (MgSO₄·7H₂O)
Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material.
m_epsg0
Sodium chloride (NaCl)
Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material.
m_naclg0
Baking soda (NaHCO₃)
Total dry mass added to this mash only. Use the stated hydration and a suitable food-grade material.
m_bicarbg0
Calcium chloride form
Match the bag. Hygroscopic flakes may contain extra water; the calculation assumes the pure selected compound.
cacl_formDihydrate — 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_modeNominal bottle preset
Acid bottle
Percentages are by mass (w/w), not volume. Dilute and concentrated bottles need very different doses.
acid_stockLactic 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_knownmmol/mL1
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_acidmL4
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_Ca3.5

Results

With the default inputs above, the calc gives:

ResultValue
Predicted mash pH (typically ±0.15)5.46
Total acid for target pH5.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 ratio3 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.

ResultSourceThis calc
Predicted mash pH (typically ±0.15)5.465.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.

ResultSourceThis calc
Kolbach residual alkalinity in equivalents0.03 ± 0.005 mmol/L0.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.

ResultSourceThis calc
Stock acid molarity before dissociation11.81 mmol/mL11.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.

ResultSourceThis calc
Stock acid molarity before dissociation14.7 ± 0.09 mmol/mL14.615 mmol/mL

Responses

Your email address will not be published. Required fields are marked *

L ading...