SolarSoiled · Tools

When does cleaning your solar panels pay off?

The curve shows how recoverable losses build over a dry season. When it crosses the red line, the cost of waiting exceeds the cost of cleaning. For older systems, persistent soiling that rain cannot remove shifts the entire curve upward.

Your system

2 kW30 kW
$0.20$0.42 CA avg$0.65

Soiling conditions

0.02% light0.25% severe

Roughly 1 in 4 California arrays soils at 0.10%/day or faster. The statewide average is 0.05%/day. Arrays near highways, farms, or with low-tilt panels tend to soil faster. At 0.10%/day, panels lose about 18% of their peak output by the end of a six-month dry season.

Cleaning method

~$90 · 70% recovery · water-fed pole, no roof access

$50$500

System age

Year 2: persistent residue from one season of carryover is now detectable. Both seasonal and persistent components are active.

0% (resets with rain)15% (severe carryover)

Pollen films, cemented dust, and biological growth that rain does not wash away. Detected by comparing this month's output to the same month last year.

Where are you now?

Enter days above to see where you stand.

Breakeven curve

Recoverable value over dry days versus cleaning cost threshold.
Persistent floor Recoverable value (combined) Cleaning cost threshold

Breakeven

dry days until worth cleaning

Persistent floor

carryover loss, day one

Cleaning cost

— recovery

How the two components work

Seasonal soiling builds up during the dry season and resets with winter rain. More dust each day means the loss accelerates. This produces the upward-curving shape.

Persistent soiling is the portion that rain does not wash away. Pollen films, cemented deposits, and biological growth carry over year to year. Because it is always present, it shifts the entire curve upward so your breakeven arrives sooner and you may already be past it on day one. For older systems this carryover multiplies: a system in Year 3 has had two full seasons to accumulate what rain could not remove.

The flagging rule: in Year 1, flag when seasonal loss alone exceeds cleaning cost.


The math

Seasonal loss (the curve shape)

On day N of a dry spell, the panel is N × soiling_rate dirtier than on day 0, so it loses a little more energy each successive day. Summing those daily losses from day 1 to day N gives a triangular sum:

heavy_loss($) = daily_kWh × soil_rate × N(N+1)/2 × $/kWh

The N(N+1)/2 term is what makes the curve bend. At day 60 it equals 1,830. At day 120 it equals 7,260 — four times larger rather than twice. Waiting twice as long does not double the loss; it quadruples it.

Persistent offset (the flat starting line)

This value does not grow with dry days because the production is already being lost year-round from carryover residue. The persistent model derives it by comparing this month's top-quartile 4-hour production block to the same month last year, then projecting that percentage deficit across the full annual output. For older systems the offset compounds with each additional year of accumulation:

R_persist($) = year_over_year_loss% × (kW × 1,750 kWh × $0.375/kWh) × years_of_accumulation

For a 3% persistent loss on a 6.9 kW system in Year 3 (two years of accumulation): 0.03 × $4,528 × 2 = $272, which already exceeds a typical cleaning cost.

Combined breakeven

In Year 2 and beyond, the total recoverable value is the sum of both components. Cleaning pays once that total, multiplied by how much a cleaning actually recovers, exceeds the cleaning cost:

(heavy_loss(N) + R_persist) × recovery% ≥ cleaning_cost

Solving for the breakeven day directly:

N ≈ sqrt( (cleaning_cost / recovery% − R_persist) × 2 / (daily_kWh × soil_rate × rate) )

If the term inside the square root is already negative, R_persist alone covers the cleaning cost and the breakeven is day zero. That is the persistent soiling case this model is most concerned about: arrays that should be cleaned at the start of every season regardless of how little seasonal dust has accumulated.

Two-consecutive-months rule

The model evaluates systems at the end of May, June, and July. For Year 2 and beyond, the combined value must exceed the cleaning cost in two consecutive evaluation windows before a flag is issued. One weak month might be weather noise; two in a row signals a real pattern. The faint vertical lines on the chart mark those three windows.

Seasonal curve uses Kimber (2007) linear accumulation. Persistent offset uses an Enphase-based flagging model: year-over-year loss vs same month prior year, adjusted for 0.5%/yr panel degradation, valued at $0.375/kWh blended annual rate. Persistent accumulation compounds linearly with system age. Heavy soiling rate: average 0.05%/day; heavy soiler (top quartile) 0.10%/day per Mejía and Kleissl (2013). Recovery percentages from UCSD 2013 field cleaning data. Assumes 5.5 peak sun hours per day. Default system size 6.9 kW reflects median permitted system in Santa Cruz County 2014–2025.