Skip to main content
💧 TapWaterData

Water Hardness in Minnesota

Across 49 measured cities — with 341 more covered by labeled county-level estimates — Minnesota's median tap water hardness is 162.0 mg/L (9.5 gpg): hard on the USGS scale. Below: every covered city, the state's hardest and softest water, and the geology that explains it.

Data updated July 6, 2026. Sources: utility-reported water quality data and USGS/EPA Water Quality Portal samples.

State Median
162.0
mg/L (9.5 gpg), measured cities
Measured Range
13.8-435.2
mg/L across measured cities
Measured Cities
49
utility-reported or computed values
County Estimates
341
87% of covered cities

Minnesota Cities by Hardness Category

Measured cities only — labeled county estimates never enter the category counts or the median.

CategoryRangeMeasured citiesShare
Soft0-60 mg/L612.2%
Moderately hard60-120 mg/L1326.5%
Hard120-180 mg/L918.4%
Very hard>180 mg/L2142.9%

Hardest and Softest Water in Minnesota

Measured values only; labeled county estimates and values under active dispute never rank.

Hardest water in Minnesota

  1. New Prague 435.2 mg/L (25.4 gpg), very hard
  2. Waconia 378.0 mg/L (22.1 gpg), very hard
  3. Sartell 352.4 mg/L (20.6 gpg), very hard
  4. Cottage Grove 330.0 mg/L (19.3 gpg), very hard
  5. Minnetrista 319.0 mg/L (18.6 gpg), very hard

Softest water in Minnesota

  1. Stewartville 13.8 mg/L (0.8 gpg), soft
  2. Lino Lakes 39.2 mg/L (2.3 gpg), soft
  3. Two Harbors 40.1 mg/L (2.4 gpg), soft
  4. Duluth 42.8 mg/L (2.5 gpg), soft
  5. Maplewood 55.6 mg/L (3.3 gpg), soft

Every Covered City in Minnesota

All 390 covered Minnesota cities, sorted by population served. "County estimate" rows are labeled context values from USGS/EPA Water Quality Portal county sampling — they never enter the median above. City names link to each city's full water quality page.

CityHardness (mg/L)gpgCategoryData
Minneapolis88.85.2Moderately hardUtility-reported
St. Paul125.07.3HardCounty estimate
Mendota82.14.8Moderately hardUtility-reported
St. Paul82.14.8Moderately hardUtility-reported
Moorhead78.74.6Moderately hardComputed from Ca+Mg
Osseo120.07.0Moderately hardUtility-reported
Brooklyn Park120.07.0Moderately hardUtility-reported
Bloomington100.05.8Moderately hardUtility-reported
Duluth42.82.5SoftUtility-reported
Woodbury160.09.4HardUtility-reported
Hopkins162.89.5HardUtility-reported
Lexington191.011.2Very hardUtility-reported
Andover200.011.7Very hardCounty estimate
Blaine191.011.2Very hardUtility-reported
Eagan132.07.7HardUtility-reported
St. Cloud240.014.0Very hardCounty estimate
St. Cloud240.014.0Very hardCounty estimate
Farmington270.015.8Very hardCounty estimate
Lakeville270.015.8Very hardCounty estimate
Coon Rapids201.011.8Very hardUtility-reported
Eden Prairie98.95.8Moderately hardUtility-reported
Wayzata186.010.9Very hardUtility-reported
Burnsville193.011.3Very hardUtility-reported
Minnetonka186.010.9Very hardUtility-reported
Edina146.08.5HardUtility-reported
St. Louis Park112.06.5Moderately hardUtility-reported
Mankato343.520.1Very hardCounty estimate
Shakopee420.024.6Very hardCounty estimate
Cottage Grove330.019.3Very hardUtility-reported
Inver Grove Heights270.015.8Very hardCounty estimate
Birchwood Village162.09.5HardUtility-reported
Roseville78.04.6Moderately hardUtility-reported
Savage309.818.1Very hardComputed from Ca+Mg
Brooklyn Center78.84.6Moderately hardUtility-reported
Shoreview192.011.2Very hardUtility-reported
Owatonna308.018.0Very hardCounty estimate
Chaska230.013.4Very hardCounty estimate
Faribault302.017.7Very hardUtility-reported
Prior Lake196.011.5Very hardUtility-reported
Chanhassen121.07.1HardUtility-reported
Champlin234.013.7Very hardCounty estimate
Hastings270.015.8Very hardCounty estimate
Golden Valley89.65.2Moderately hardUtility-reported
New Brighton230.013.4Very hardUtility-reported
Albertville260.015.2Very hardCounty estimate
St. Michael260.015.2Very hardCounty estimate
Rosemount270.015.8Very hardCounty estimate
Willmar238.513.9Very hardCounty estimate
Sartell352.420.6Very hardComputed from Ca+Mg
Lino Lakes39.22.3SoftUtility-reported
Albert Lea294.017.2Very hardCounty estimate
Anoka200.011.7Very hardCounty estimate
Elk River170.09.9HardCounty estimate
Red Wing285.016.7Very hardCounty estimate
Buffalo260.015.2Very hardCounty estimate
Hibbing77.84.5Moderately hardCounty estimate
Bemidji170.09.9HardCounty estimate
Hutchinson215.012.6Very hardCounty estimate
Lake Benton390.022.8Very hardCounty estimate
Robbinsdale201.011.8Very hardUtility-reported
Fergus Falls210.012.3Very hardCounty estimate
Marshall554.032.4Very hardCounty estimate
Brainerd215.012.6Very hardUtility-reported
Alexandria193.011.3Very hardCounty estimate
Monticello260.015.2Very hardCounty estimate
New Ulm490.028.6Very hardCounty estimate
Worthington374.021.9Very hardCounty estimate
Waconia378.022.1Very hardUtility-reported
Maplewood55.63.3SoftUtility-reported
Sauk Rapids146.08.5HardCounty estimate
North St. Paul55.63.3SoftUtility-reported
Hugo108.56.3Moderately hardCounty estimate
St. Peter450.026.3Very hardCounty estimate
St. Peter450.026.3Very hardCounty estimate
Big Lake170.09.9HardCounty estimate
Cloquet214.012.5Very hardComputed from Ca+Mg
Fairmont322.518.9Very hardCounty estimate
Detroit Lakes170.09.9HardCounty estimate
St. Anthony254.014.8Very hardUtility-reported
East Grand Forks300.017.5Very hardCounty estimate
Waseca288.016.8Very hardCounty estimate
Cohasset130.07.6HardCounty estimate
Grand Rapids130.07.6HardCounty estimate
Willernie162.09.5HardUtility-reported
Gilbert77.84.5Moderately hardCounty estimate
Dellwood162.09.5HardUtility-reported
Mahtomedi162.09.5HardUtility-reported
Lake Elmo249.014.6Very hardUtility-reported
Minnetrista319.018.6Very hardUtility-reported
Waite Park240.014.0Very hardCounty estimate
New Prague435.225.4Very hardComputed from Ca+Mg
Crookston300.017.5Very hardCounty estimate
Belle Plaine420.024.6Very hardCounty estimate
Stewartville13.80.8SoftUtility-reported
Kasson255.014.9Very hardCounty estimate
Delano260.015.2Very hardCounty estimate
Welch285.016.7Very hardCounty estimate
Glencoe215.012.6Very hardCounty estimate
Isanti125.57.3HardCounty estimate
St. Paul Park108.56.3Moderately hardCounty estimate
St. Bonifacius234.013.7Very hardCounty estimate
Montevideo450.026.3Very hardCounty estimate
Zimmerman170.09.9HardCounty estimate
North Branch109.06.4Moderately hardCounty estimate
Circle Pines200.011.7Very hardCounty estimate
Lindstrom109.06.4Moderately hardCounty estimate
Spring Park234.013.7Very hardCounty estimate
Becker170.09.9HardCounty estimate
Windom353.020.6Very hardCounty estimate
Sauk Centre240.014.0Very hardCounty estimate
Hamel234.013.7Very hardCounty estimate
Loretto234.013.7Very hardCounty estimate
Maple Plain234.013.7Very hardCounty estimate
Elko New Market420.024.6Very hardCounty estimate
Pipestone406.523.8Very hardCounty estimate
Cannon Falls285.016.7Very hardCounty estimate
Wadena238.013.9Very hardCounty estimate
Le Sueur380.022.2Very hardCounty estimate
Lonsdale322.018.8Very hardCounty estimate
St. Charles290.017.0Very hardCounty estimate
St. Charles290.017.0Very hardCounty estimate
Eveleth77.84.5Moderately hardCounty estimate
Melrose240.014.0Very hardCounty estimate
Ely14.70.9SoftCounty estimate
Two Harbors40.12.4SoftUtility-reported
Sleepy Eye490.028.6Very hardCounty estimate
Norwood Young America230.013.4Very hardCounty estimate
Chisago City109.06.4Moderately hardCounty estimate
Benson470.527.5Very hardCounty estimate
Mora71.54.2Moderately hardCounty estimate
Perham210.012.3Very hardCounty estimate
Long Prairie180.010.5HardCounty estimate
Annandale260.015.2Very hardCounty estimate
Breckenridge279.016.3Very hardCounty estimate
Plainview286.516.8Very hardCounty estimate
Montrose260.015.2Very hardCounty estimate
Waverly260.015.2Very hardCounty estimate
Zumbrota285.016.7Very hardCounty estimate
Warren300.017.5Very hardCounty estimate
Blue Earth340.519.9Very hardCounty estimate
Pine City63.03.7Moderately hardCounty estimate
Long Lake234.013.7Very hardCounty estimate
Rush City109.06.4Moderately hardCounty estimate
Milaca97.05.7Moderately hardCounty estimate
Montgomery380.022.2Very hardCounty estimate
Chatfield300.017.5Very hardCounty estimate
Staples180.010.5HardCounty estimate
St. Bonifacius234.013.7Very hardCounty estimate
Mountain Iron77.84.5Moderately hardCounty estimate
Granite Falls602.535.2Very hardCounty estimate
Dodge Center255.014.9Very hardCounty estimate
Caledonia290.017.0Very hardCounty estimate
Excelsior83.44.9Moderately hardUtility-reported
Roseau200.011.7Very hardCounty estimate
Cokato260.015.2Very hardCounty estimate
Albany240.014.0Very hardCounty estimate
Bayport108.56.3Moderately hardCounty estimate
Lakeland108.56.3Moderately hardCounty estimate
Glenwood337.019.7Very hardCounty estimate
Foley146.08.5HardCounty estimate
Barnesville372.021.8Very hardCounty estimate
Pelican Rapids210.012.3Very hardCounty estimate
Spring Valley300.017.5Very hardCounty estimate
Lake Crystal343.520.1Very hardCounty estimate
Paynesville240.014.0Very hardCounty estimate
Wabasha286.516.8Very hardCounty estimate
Eagle Lake343.520.1Very hardCounty estimate
Le Center380.022.2Very hardCounty estimate
Nett Lake38.52.3SoftCounty estimate
Northfield322.018.8Very hardCounty estimate
Crosby111.06.5Moderately hardCounty estimate
Winsted215.012.6Very hardCounty estimate
Olivia492.028.8Very hardCounty estimate
Wells340.519.9Very hardCounty estimate
Madelia270.015.8Very hardCounty estimate
Gaylord390.022.8Very hardCounty estimate
Janesville288.016.8Very hardCounty estimate
Arlington390.022.8Very hardCounty estimate
Hawley372.021.8Very hardCounty estimate
Aitkin97.05.7Moderately hardCounty estimate
Maple Lake260.015.2Very hardCounty estimate
Tracy554.032.4Very hardCounty estimate
Slayton350.020.5Very hardCounty estimate
Mountain Lake353.020.6Very hardCounty estimate
Springfield490.028.6Very hardCounty estimate
Eyota316.018.5Very hardCounty estimate
Ortonville600.035.1Very hardCounty estimate
Hoyt Lakes77.84.5Moderately hardCounty estimate
Howard Lake260.015.2Very hardCounty estimate
Blooming Prairie308.018.0Very hardCounty estimate
Stacy109.06.4Moderately hardCounty estimate
Bovey130.07.6HardCounty estimate
Clearwater240.014.0Very hardCounty estimate
Lester Prairie215.012.6Very hardCounty estimate
Mayer230.013.4Very hardCounty estimate
Hinckley63.03.7Moderately hardCounty estimate
Silver Bay14.70.9SoftCounty estimate
Waterville380.022.2Very hardCounty estimate
Rushford300.017.5Very hardCounty estimate
Warroad200.011.7Very hardCounty estimate
Kenyon285.016.7Very hardCounty estimate
Braham71.54.2Moderately hardCounty estimate
Oronoco316.018.5Very hardCounty estimate
Osakis180.010.5HardCounty estimate
Canby602.535.2Very hardCounty estimate
Aurora77.84.5Moderately hardCounty estimate
Mapleton343.520.1Very hardCounty estimate
Ada360.021.1Very hardCounty estimate
Cologne230.013.4Very hardCounty estimate
Lakefield363.021.2Very hardCounty estimate
Lewiston290.017.0Very hardCounty estimate
Collegeville240.014.0Very hardCounty estimate
St. Joseph240.014.0Very hardCounty estimate
Madison493.028.8Very hardCounty estimate
Dawson493.028.8Very hardCounty estimate
Dundas322.018.8Very hardCounty estimate
Dassel260.015.2Very hardCounty estimate
Wheaton730.042.7Very hardCounty estimate
Richmond240.014.0Very hardCounty estimate
Avon240.014.0Very hardCounty estimate
Fosston300.017.5Very hardCounty estimate
Sandstone63.03.7Moderately hardCounty estimate
Grand Marais21.71.3SoftCounty estimate
Appleton470.527.5Very hardCounty estimate
Winthrop390.022.8Very hardCounty estimate
Winnebago340.519.9Very hardCounty estimate
Starbuck337.019.7Very hardCounty estimate
Minneota554.032.4Very hardCounty estimate
Hayfield255.014.9Very hardCounty estimate
Clara City450.026.3Very hardCounty estimate
Menahga238.013.9Very hardCounty estimate
Red Lake Falls296.017.3Very hardCounty estimate
Frazee170.09.9HardCounty estimate
Preston300.017.5Very hardCounty estimate
Fulda350.020.5Very hardCounty estimate
Glyndon372.021.8Very hardCounty estimate
Fairfax492.028.8Very hardCounty estimate
New York Mills210.012.3Very hardCounty estimate
Spring Grove290.017.0Very hardCounty estimate
Renville492.028.8Very hardCounty estimate
Bagley160.09.4HardCounty estimate
Rice146.08.5HardCounty estimate
New London238.513.9Very hardCounty estimate
Elbow Lake380.022.2Very hardCounty estimate
Moose Lake39.82.3SoftCounty estimate
Royalton160.09.4HardCounty estimate
Mahnomen230.013.4Very hardCounty estimate
Spicer238.513.9Very hardCounty estimate
Cottonwood554.032.4Very hardCounty estimate
Adrian374.021.9Very hardCounty estimate
New Richland288.016.8Very hardCounty estimate
Babbitt77.84.5Moderately hardCounty estimate
Goodhue285.016.7Very hardCounty estimate
Medford308.018.0Very hardCounty estimate
Pequot Lakes130.07.6HardCounty estimate
Mantorville255.014.9Very hardCounty estimate
Edgerton406.523.8Very hardCounty estimate
Shafer109.06.4Moderately hardCounty estimate
Grand Meadow259.015.2Very hardCounty estimate
Coleraine130.07.6HardCounty estimate
Atwater238.513.9Very hardCounty estimate
Hector492.028.8Very hardCounty estimate
Tyler390.022.8Very hardCounty estimate
Nicollet450.026.3Very hardCounty estimate
Truman322.518.9Very hardCounty estimate
Elgin316.018.5Very hardCounty estimate
Wanamingo285.016.7Very hardCounty estimate
Parkers Prairie210.012.3Very hardCounty estimate
Keewatin130.07.6HardCounty estimate
Sherburn322.518.9Very hardCounty estimate
Eden Valley260.015.2Very hardCounty estimate
Harmony300.017.5Very hardCounty estimate
Bird Island492.028.8Very hardCounty estimate
Madison Lake343.520.1Very hardCounty estimate
Mazeppa286.516.8Very hardCounty estimate
Buhl77.84.5Moderately hardCounty estimate
Carlton39.82.3SoftCounty estimate
Morristown322.018.8Very hardCounty estimate
Nashwauk130.07.6HardCounty estimate
Biwabik77.84.5Moderately hardCounty estimate
Deer River130.07.6HardCounty estimate
Battle Lake210.012.3Very hardCounty estimate
Blackduck170.09.9HardCounty estimate
Kerkhoven470.527.5Very hardCounty estimate
Browerville180.010.5HardCounty estimate
Gibbon390.022.8Very hardCounty estimate
Brownton215.012.6Very hardCounty estimate
Rockville240.014.0Very hardCounty estimate
Cass Lake130.07.6HardCounty estimate
Trimont322.518.9Very hardCounty estimate
Hendricks390.022.8Very hardCounty estimate
Marble130.07.6HardCounty estimate
Clarks Grove294.017.2Very hardCounty estimate
Heron Lake363.021.2Very hardCounty estimate
Clarissa180.010.5HardCounty estimate
Motley130.07.6HardCounty estimate
Kasota380.022.2Very hardCounty estimate
Welcome322.518.9Very hardCounty estimate
White Earth170.09.9HardCounty estimate
Ottertail210.012.3Very hardCounty estimate
Balaton554.032.4Very hardCounty estimate
Courtland450.026.3Very hardCounty estimate
Stephen343.020.1Very hardCounty estimate
Good Thunder343.520.1Very hardCounty estimate
Ironton111.06.5Moderately hardCounty estimate
Rochester316.018.5Very hardCounty estimate
Green Isle390.022.8Very hardCounty estimate
Kandiyohi238.513.9Very hardCounty estimate
Ivanhoe390.022.8Very hardCounty estimate
Eagle Bend180.010.5HardCounty estimate
Pennock238.513.9Very hardCounty estimate
Rothsay279.016.3Very hardCounty estimate
Prinsburg238.513.9Very hardCounty estimate
Bertha180.010.5HardCounty estimate
Kellogg286.516.8Very hardCounty estimate
Pillager130.07.6HardCounty estimate
New Auburn390.022.8Very hardCounty estimate
Vermillion270.015.8Very hardCounty estimate
Lynd554.032.4Very hardCounty estimate
Wykoff300.017.5Very hardCounty estimate
Upsala160.09.4HardCounty estimate
New Germany230.013.4Very hardCounty estimate
Comfrey490.028.6Very hardCounty estimate
Wrenshall39.82.3SoftCounty estimate
Hanska490.028.6Very hardCounty estimate
Alvarado343.020.1Very hardCounty estimate
Emmons294.017.2Very hardCounty estimate
Underwood210.012.3Very hardCounty estimate
Ceylon322.518.9Very hardCounty estimate
Ghent554.032.4Very hardCounty estimate
Bricelyn340.519.9Very hardCounty estimate
Ogilvie71.54.2Moderately hardCounty estimate
Swanville160.09.4HardCounty estimate
Wilmont374.021.9Very hardCounty estimate
St. Martin240.014.0Very hardCounty estimate
Foreston97.05.7Moderately hardCounty estimate
Vergas210.012.3Very hardCounty estimate
Forest Lake200.011.7Very hardCounty estimate
Grey Eagle180.010.5HardCounty estimate
Taconite130.07.6HardCounty estimate
New Munich240.014.0Very hardCounty estimate
Plato215.012.6Very hardCounty estimate
Murdock470.527.5Very hardCounty estimate
Cyrus337.019.7Very hardCounty estimate
Nerstrand322.018.8Very hardCounty estimate
Hollandale294.017.2Very hardCounty estimate
Darwin260.015.2Very hardCounty estimate
Milroy520.030.4Very hardCounty estimate
Pease97.05.7Moderately hardCounty estimate
Ruthton406.523.8Very hardCounty estimate
Oslo343.020.1Very hardCounty estimate
Lake Lillian238.513.9Very hardCounty estimate
Waldorf288.016.8Very hardCounty estimate
Northrop322.518.9Very hardCounty estimate
Princeton97.05.7Moderately hardCounty estimate
Okabena363.021.2Very hardCounty estimate
Ogema170.09.9HardCounty estimate
Beaver Bay14.70.9SoftCounty estimate
Blomkest238.513.9Very hardCounty estimate
Dennison285.016.7Very hardCounty estimate
Dunnell322.518.9Very hardCounty estimate
Wendell380.022.2Very hardCounty estimate
Warba130.07.6HardCounty estimate
Kinney77.84.5Moderately hardCounty estimate
Wolverton279.016.3Very hardCounty estimate
Conger294.017.2Very hardCounty estimate
Garvin554.032.4Very hardCounty estimate
Kilkenny380.022.2Very hardCounty estimate
Laporte160.09.4HardCounty estimate
Deerwood111.06.5Moderately hardCounty estimate
Bingham Lake353.020.6Very hardCounty estimate
Brook Park71.54.2Moderately hardCounty estimate
Hampton270.015.8Very hardCounty estimate
Alpha363.021.2Very hardCounty estimate
Bock97.05.7Moderately hardCounty estimate
Darfur270.015.8Very hardCounty estimate
Holloway470.527.5Very hardCounty estimate
Rogers234.013.7Very hardCounty estimate
Viking343.020.1Very hardCounty estimate
Arco390.022.8Very hardCounty estimate
Tintah730.042.7Very hardCounty estimate
Park Rapids160.09.4HardCounty estimate
Scandia108.56.3Moderately hardCounty estimate
Victoria230.013.4Very hardCounty estimate
Stillwater108.56.3Moderately hardCounty estimate
Houston290.017.0Very hardCounty estimate
Lake Bronson348.920.4Very hardCounty estimate
Pierz160.09.4HardCounty estimate
Taylors Falls109.06.4Moderately hardCounty estimate
Walker130.07.6HardCounty estimate

Above 120 mg/L (7 gpg), scale is usually worth treating — see our water softener guide, or size a system with the hardness calculator & converter.

The Geology Behind Minnesota's Water Hardness

Minnesota sits in the Midwestern glacial-drift and carbonate bedrock region.

Ice-age glaciers ground up limestone and dolomite bedrock and spread it across the Midwest as thick, carbonate-rich drift. Groundwater percolating through that drift - and through the shallow carbonate bedrock beneath it - dissolves calcium and magnesium readily, which is why the USGS maps the region hard to very hard almost everywhere. Cities drawing Great Lakes surface water tend to run somewhat softer than their groundwater-supplied neighbors.

Source: USGS Water Science School - Hardness of Water

Minnesota Water Hardness FAQ

Does Minnesota have hard water?

Yes — across Minnesota's measured cities, typical tap water is hard. The median is 162.0 mg/L (9.5 gpg) — hard on the USGS scale, where anything above 120 mg/L (7 gpg) counts as hard. 30 of Minnesota's 49 measured cities fall in the hard or very hard bands (61%), so check your own city rather than the state average.

How hard is tap water in Minnesota?

Across the 49 Minnesota cities with measured values in our index, the median hardness is 162.0 mg/L (9.5 gpg) — hard on the USGS scale. Individual cities range from 13.8 to 435.2 mg/L, so check your own city rather than assuming the state number.

Which city in Minnesota has the hardest water?

New Prague has the hardest measured tap water in our Minnesota index at 435.2 mg/L (25.4 gpg) — very hard on the USGS scale. Rankings use measured utility values only; labeled county estimates and values under active dispute are excluded.

Do I need a water softener in Minnesota?

30 of Minnesota's 49 measured cities (61%) fall in the hard or very hard bands — above 120 mg/L (7 gpg), the level where most water treatment professionals suggest considering an ion-exchange softener. Hardness varies utility to utility, so look up your own city's value before sizing equipment.

How do I find my city's exact water hardness?

Enter your ZIP code in our free lookup at tapwaterdata.com/zip to see the value we hold for your Minnesota city from utility-reported water quality data, check your water utility's annual Consumer Confidence Report (CCR), or use a home test-strip kit.

Stay Informed About Your Water Quality

Get EPA reports, filter recommendations, and safety alerts for your area.

Join 10,000+ people protecting their families. Unsubscribe anytime.