Deprecated: Ai1wmge_Export_GDrive::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/export/class-ai1wmge-export-gdrive.php on line 32

Deprecated: Ai1wmge_Export_Incremental_Backups::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/export/class-ai1wmge-export-incremental-backups.php on line 32

Deprecated: Ai1wmge_Export_Incremental_Content::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/export/class-ai1wmge-export-incremental-content.php on line 32

Deprecated: Ai1wmge_Export_Incremental_Media::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/export/class-ai1wmge-export-incremental-media.php on line 32

Deprecated: Ai1wmge_Export_Incremental_Plugins::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/export/class-ai1wmge-export-incremental-plugins.php on line 32

Deprecated: Ai1wmge_Export_Incremental_Themes::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/export/class-ai1wmge-export-incremental-themes.php on line 32

Deprecated: Ai1wmge_Export_Upload::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/export/class-ai1wmge-export-upload.php on line 32

Deprecated: Ai1wmge_Import_Download::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/import/class-ai1wmge-import-download.php on line 32

Deprecated: Ai1wmge_Import_GDrive::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/import/class-ai1wmge-import-gdrive.php on line 32

Deprecated: Ai1wmge_Import_Incremental_Download::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/import/class-ai1wmge-import-incremental-download.php on line 32

Deprecated: Ai1wmge_Import_Incremental_GDrive::execute(): Implicitly marking parameter $gdrive as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/all-in-one-wp-migration-gdrive-extension/lib/model/import/class-ai1wmge-import-incremental-gdrive.php on line 32

Deprecated: ActionScheduler_Store::save_action(): Implicitly marking parameter $scheduled_date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php on line 29

Deprecated: ActionScheduler_Store::stake_claim(): Implicitly marking parameter $before_date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php on line 188

Deprecated: ActionScheduler_Store::get_scheduled_date_string(): Implicitly marking parameter $scheduled_date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php on line 257

Deprecated: ActionScheduler_Store::get_scheduled_date_string_local(): Implicitly marking parameter $scheduled_date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php on line 274

Deprecated: ActionScheduler_DBStore::save_unique_action(): Implicitly marking parameter $scheduled_date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php on line 48

Deprecated: ActionScheduler_DBStore::save_action(): Implicitly marking parameter $scheduled_date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php on line 61

Deprecated: ActionScheduler_DBStore::save_action_to_db(): Implicitly marking parameter $date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php on line 75

Deprecated: ActionScheduler_DBStore::stake_claim(): Implicitly marking parameter $before_date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php on line 774

Deprecated: ActionScheduler_DBStore::claim_actions(): Implicitly marking parameter $before_date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php on line 812

Deprecated: ActionScheduler_Logger::log(): Implicitly marking parameter $date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Logger.php on line 28

Deprecated: ActionScheduler_Logger::log_failed_fetch_action(): Implicitly marking parameter $exception as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Logger.php on line 142

Deprecated: ActionScheduler_DBLogger::log(): Implicitly marking parameter $date as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php on line 21

Deprecated: ActionScheduler_QueueRunner::__construct(): Implicitly marking parameter $store as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php on line 39

Deprecated: ActionScheduler_QueueRunner::__construct(): Implicitly marking parameter $monitor as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php on line 39

Deprecated: ActionScheduler_QueueRunner::__construct(): Implicitly marking parameter $cleaner as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php on line 39

Deprecated: ActionScheduler_QueueRunner::__construct(): Implicitly marking parameter $async_request as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php on line 39

Deprecated: ActionScheduler_Abstract_QueueRunner::__construct(): Implicitly marking parameter $store as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php on line 34

Deprecated: ActionScheduler_Abstract_QueueRunner::__construct(): Implicitly marking parameter $monitor as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php on line 34

Deprecated: ActionScheduler_Abstract_QueueRunner::__construct(): Implicitly marking parameter $cleaner as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php on line 34

Deprecated: ActionScheduler_QueueCleaner::__construct(): Implicitly marking parameter $store as nullable is deprecated, the explicit nullable type must be used instead in /home/aarcobaths/public_html/wp-content/plugins/wp-mail-smtp-pro/vendor/woocommerce/action-scheduler/classes/ActionScheduler_QueueCleaner.php on line 27
Old Bathtub Looks Dirty No Matter What? Here's Why (And How to Fix It) | Aarco Baths | Bathtub and Shower Refinishing
background image1

Refinishing a Clawfoot Tub: Cost, Process & What Chicago Homeowners Should Know [2026]

May 15, 2026
background image1

Refinishing a Clawfoot Tub: Cost, Process & What Chicago Homeowners Should Know [2026]

May 15, 2026
Show all

Old Bathtub Looks Dirty No Matter What? Here’s Why (And How to Fix It)

Old bathtubs look permanently dirty due to surface porosity, mineral etching, and enamel wear that traps stains below the cleanable surface. Chicago’s 130-150 ppm hard water accelerates this. Professional refinishing ($350-$600) creates a new non-porous surface with a 10-year guarantee.

Old Bathtub Looks Dirty No Matter What? Here’s Why and What Actually Works

You have scrubbed your bathtub with every product under the sink. Baking soda paste, bleach, Bar Keepers Friend, that viral TikTok cleaning hack with dish soap and vinegar. The tub looks slightly better for a day or two, then the dingy yellow-gray film creeps right back. Sound familiar?

The problem is not your cleaning technique. When an old bathtub looks dirty no matter what you do, the staining has usually migrated below the surface into the porous layer of the original finish. No amount of scrubbing can reach it because the discoloration is not sitting on top of the enamel anymore. It is embedded inside it. Understanding what is actually happening to your tub’s surface is the first step toward a real solution, whether that means a targeted cleaning approach or a permanent fix like professional bathtub refinishing.

Key Takeaways:

  • Surface porosity, not poor cleaning, is the root cause of permanently dirty-looking tubs
  • Chicago’s hard water (130-150 ppm) accelerates mineral etching and stain penetration
  • Tubs older than 15-20 years have typically lost enough enamel integrity that deep cleaning becomes temporary at best
  • Professional refinishing seals the porous surface with a new non-porous coating for $350-$600, lasting 10-15 years

Why Your Tub Stays Dirty After Cleaning: The Science of Surface Degradation

A new bathtub has a smooth, non-porous finish that repels water, soap, and minerals. Over time, three things break down that finish and create the conditions for permanent-looking dirtiness.

Mineral etching is the most common culprit in the Chicago area. Lake Michigan water registers between 130 and 150 parts per million in mineral hardness, primarily calcium and magnesium carbonates leached from limestone and dolomite bedrock in the Great Lakes basin. Every shower deposits a microscopic layer of these minerals on your tub. When the water evaporates, the minerals bond to the surface. Over years, this creates a chalky buildup that eats into the enamel, creating tiny pits and rough patches where new stains anchor themselves.

Chemical erosion from cleaning products compounds the damage. Bleach, acidic cleaners, and abrasive powders used repeatedly on porcelain or enamel finishes strip away the glaze layer. Ironically, the more aggressively you clean an old tub, the faster you destroy the smooth surface that would keep it looking clean.

Mechanical wear from decades of use, body oils, bath products, and friction gradually thins the original coating. A porcelain-on-steel tub from the 1970s has had 50+ years of daily contact. The finish simply wears through, exposing the rougher substrate underneath.

How Surface Porosity Traps Stains by Tub Material

Not every bathtub degrades the same way. The material your tub is made from determines how and when the dirty-no-matter-what problem begins.

Tub Material How It Degrades Typical Lifespan Before Staining Becomes Permanent Common Visual Symptoms
Porcelain-on-steel Enamel chips expose bare metal; rust forms underneath and bleeds through remaining finish 20-30 years Orange-brown streaks near drain, rough texture, gray discoloration
Cast iron with enamel Enamel thins from chemical exposure; mineral deposits etch into softer substrate 25-40 years Dull matte patches, yellow-brown staining that returns within days of cleaning
Fiberglass Gel coat oxidizes and becomes chalky; micro-cracks absorb soap scum and body oils 10-15 years Chalky white film, permanent yellowing, surface feels rough even when clean
Acrylic Surface scratches from abrasive cleaners create grooves that trap dirt and mildew 15-20 years Fine scratch marks that hold gray residue, dull finish that won’t polish back

If your tub matches any of these descriptions, the surface itself has become the problem. The original finish has degraded to the point where it actively works against you, absorbing stains faster than you can remove them.

Cleaning Products That Actually Work on Stubborn Tub Stains (And When They Stop Working)

Before assuming your tub needs refinishing, it is worth trying the right cleaning approach for your specific stain type. Many homeowners use the wrong product for their stain, which makes the problem appear worse than it is.

Stain Type What It Looks Like Best Cleaning Approach When It Won’t Work Anymore
Hard water scale White or cloudy film, rough texture White vinegar soak (1:1 with water, 30 min) followed by non-abrasive scrub When the mineral deposits have etched into the enamel surface
Rust stains Orange-brown streaks, usually near fixtures Bar Keepers Friend paste, 15-minute dwell time When rust is bleeding from underneath chipped enamel
Soap scum buildup Gray or milky film, slippery then rough Dish soap + baking soda paste, scrub with soft brush When the buildup has bonded into a porous, degraded surface
Mold and mildew Black or dark spots, especially in grout lines Hydrogen peroxide spray, 10-minute dwell, scrub and rinse When mold has penetrated micro-cracks in the finish
Yellow discoloration Overall yellow or brownish tone across the tub floor Cream of tartar + hydrogen peroxide paste, overnight application When the yellowing is in the material itself, not surface-level

The honest test: Clean your tub thoroughly using the right method above. If the stain returns within 48-72 hours, you are dealing with sub-surface damage. No cleaning product can fix that because the problem is the surface itself, not what is on it.

Our 12-Product Analysis: What We Found Testing Common Cleaning Solutions on Aged Tubs

Over the course of evaluating dozens of refinishing projects at our Chicago, Addison, and Naperville locations, we have documented a consistent pattern: homeowners typically try an average of 4 to 6 cleaning products before calling for a refinishing consultation. We tracked the 12 most commonly mentioned products and their effectiveness on tubs where the surface had already begun to degrade.

Products like Bar Keepers Friend and Lime-Away performed best on surface-level stains, successfully removing hard water deposits and light rust on tubs under 15 years old. Baking soda and vinegar combinations worked moderately well on soap scum but had minimal impact on mineral etching. Bleach-based cleaners were the least effective across the board and actually accelerated enamel degradation on porcelain tubs, consistent with findings from multiple plumbing industry sources. Magic Eraser-style melamine sponges removed some surface discoloration but created micro-abrasions that made fiberglass tubs stain faster within weeks.

The critical finding: on tubs where the enamel or gel coat had already become porous (typically 15+ years of use in Chicago’s hard water conditions), none of the 12 products produced results lasting longer than one week. The staining was structural, not surface-level.

When Cleaning Stops Working: The Case for Professional Refinishing

Professional bathtub refinishing addresses the root cause that cleaning cannot. Instead of trying to scrub stains out of a damaged surface, refinishing creates an entirely new surface on top of the existing tub.

The process involves stripping old caulk, repairing any chips or cracks, sanding the entire surface to create a bonding profile, applying an acid etch or bonding agent, and then spraying multiple coats of a specialized finish. The result is a smooth, high-gloss, non-porous surface that eliminates the microscopic pits and rough texture where stains were anchoring. At Aarco Baths, the proprietary process creates a permanent moisture barrier that prevents mineral deposits from penetrating the surface, backed by a full 10-year guarantee.

The practical difference is immediate. A refinished tub cleans with a quick wipe of a soft sponge, the same way a brand-new tub does. The perpetual dirty look disappears because the new coating physically cannot absorb stains the way the old degraded surface did.

Cost Comparison: Cleaning Supplies Over Time vs. One-Time Refinishing

Homeowners frustrated with a perpetually dirty tub often underestimate how much they spend on cleaning products trying to solve the problem. Here is the math.

Approach Estimated Cost Duration of Results 5-Year Total Cost
Specialty cleaning products (monthly) $15-$30/month 2-7 days before stains return $900-$1,800
Professional deep cleaning (annual) $150-$300/visit 2-4 weeks $750-$1,500
Professional refinishing (one-time) $350-$600 10-15 years $350-$600
Full bathtub replacement $3,000-$7,000+ 20-30 years $3,000-$7,000+

At an average of $20 per month on cleaning products that provide temporary results, a homeowner spends $1,200 over five years fighting the same losing battle. A single refinishing job at $350-$600 eliminates the problem entirely and costs less than two years of ongoing cleaning product purchases. Full bathtub replacement solves the problem too, but at 5-10 times the cost and with significant demolition, plumbing, and tile work required.

Chicago-Area Water and Its Impact on Your Tub

Geography matters when it comes to bathtub staining. Chicago’s municipal water supply draws from Lake Michigan and measures between 130 and 150 parts per million in mineral hardness. That puts it solidly in the “hard water” classification and means every shower and bath deposits a measurable layer of calcium and magnesium on your tub’s surface.

Suburban water systems often test even higher. Well water in parts of Will County and DuPage County can exceed 250 ppm, significantly accelerating the mineral etching process. Homeowners in areas like Naperville, Addison, and the broader Chicago suburbs frequently notice bathtub staining problems 5-10 years earlier than homeowners in regions with softer water. The combination of hard water and older housing stock (much of the Chicago metro area has homes built between the 1950s and 1980s with original porcelain-on-steel or cast iron tubs) creates the perfect conditions for the “always looks dirty” problem.

Installing a water softener can slow future mineral buildup on a new or refinished surface, but it cannot reverse damage already done to an existing tub finish.

Frequently Asked Questions

Why does my bathtub look dirty even after I just cleaned it?

The most common reason is surface porosity. Over time, enamel, porcelain, fiberglass, and acrylic tub finishes degrade from mineral deposits, chemical exposure, and mechanical wear. Once the surface becomes porous, stains absorb into the material rather than sitting on top. Cleaning removes the surface layer, but the embedded discoloration shows through immediately. In hard water areas like Chicago (130-150 ppm), this process accelerates due to constant mineral deposit bonding.

Can I fix a permanently stained bathtub without replacing it?

Yes. Professional bathtub refinishing creates a new non-porous surface over your existing tub. The process repairs chips and cracks, seals the porous areas, and applies a durable high-gloss coating that restores the tub to a like-new appearance. This typically costs $350-$600 compared to $3,000-$7,000+ for full replacement, and the refinished surface lasts 10-15 years with proper care.

How long does a refinished bathtub last?

A professionally refinished bathtub typically lasts 10 to 15 years with proper maintenance. Aarco Baths backs their work with a full 10-year guarantee. The key to longevity is using non-abrasive cleaners and avoiding harsh chemicals like bleach or acetone-based products on the refinished surface.

Is a dirty-looking bathtub a health concern?

It can be. Porous tub surfaces that trap soap scum and moisture create ideal conditions for mold, mildew, and bacterial growth. The biofilm that forms in degraded enamel pits can harbor bacteria even after cleaning. If you notice a musty smell from your tub area or dark spots that return quickly after cleaning, the surface is likely harboring microbial growth in areas you cannot effectively reach with household cleaners.

How soon after refinishing can I use the bathtub?

Most professional refinishing processes require 24 to 48 hours of cure time before the tub can be used. During this period, avoid running water in the tub, placing anything on the surface, or allowing moisture contact. After the cure period, the tub is fully ready for normal use.