Inside the 25-Year Cash Flow Model
A 25-year savings figure is a stack of assumptions, and a calculator that hides them is not a calculator — it is a sales tool. This page documents every equation and default in HelioCalc, including the ones we know are…
Overview
A 25-year savings figure is a stack of assumptions, and a calculator that hides them is not a calculator — it is a sales tool. This page documents every equation and default in HelioCalc, including the ones we know are simplifications. The same kernel produces both the interactive results and the static answer tables on state pages, and a verification script runs the Python and JavaScript implementations against each other before any deployment so the two cannot drift apart.
Sizing and production
annual kWh = monthly bill × 12 ÷ retail rate (or your direct kWh input). specific yield = peak sun hours × 365 × derate × roof factor. kW = annual kWh × offset ÷ specific yield, capped at usable roof area ÷ 55 sq ft/kW. Production = final kW × specific yield. Default derate is 0.84, covering inverter, wiring, soiling and temperature losses.
Cost and incentives
Array cost = kW × 1,000 × $/W. Battery = kWh × $/kWh. A percentage state credit is min(pct × array cost, cap); a flat grant is capped at array cost; the federal residential credit is 0 by law in 2026; a user-entered utility rebate is capped at gross cost. Net cost = gross − state − federal − rebate, floored at zero.
Annual savings
Production splits into self-consumed and exported kWh. Full-retail: self-consumed = min(production, annual usage), surplus valued at retail. Net billing: self-consumed = min(production, annual usage × self-consumption share), remainder valued at the export credit. The share defaults to 45% and rises with battery capacity per 45% + 0.55 × battery kWh ÷ daily usage, capped at 95%.
The year loop
For year y: production × (1 − 0.005)^(y−1); rate × (1 + escalation)^(y−1); maintenance = $150 × 1.02^(y−1); net = savings − maintenance; cumulative starts at −net cost. Payback is interpolated in the crossing year. NPV discounts each net flow at 4% by default; IRR is solved by bisection. Sensitivity repeats the whole loop at 1%, 2.5%, 4% and 6% escalation.
Known omissions
Fixed monthly grid charges, non-bypassable charges, time-of-use arbitrage, annual true-up caps, inverter and battery replacement, insurance, roof work, taxes on production incentives, home-value effects, and utility-specific demand charges. We say this on every calculator page, not just here.
Key figures worth keeping
- 0.84 — the default combined system derate.
- $150 — default annual maintenance, growing 2% a year.
- 4% — the default discount rate for NPV.
- 1% / 2.5% / 4% / 6% — the four escalation scenarios in the sensitivity table.
- 55 sq ft/kW and 450 W per module — the two planning constants behind area and panel count.
How this shows up in a real estimate
Reproducibility is the point of publishing the equations. To check any state table, open that state's page, leave the defaults as loaded, set the monthly bill to the row's value, and read the same figures from the calculator. They come from one kernel: Python generates the static HTML table at build time, JavaScript computes the interactive result in your browser, and a verification script asserts that both agree on size, production, cost, savings, payback, NPV and IRR before the deployment package is written. If they ever disagree, the build fails rather than shipping a contradiction.
Checklist before you decide
- Use the CSV export if you want to audit the schedule in a spreadsheet.
- Change one assumption at a time so you can attribute the effect.
- Compare the sensitivity rows before quoting a lifetime figure.
- Read the known-omissions section before treating a result as a forecast.
- Report the 'as of' date alongside any number you cite.
Planning estimates only — not a quote, tax advice, legal advice or financial advice. State benchmarks are not your utility tariff. Verify every incentive with the program administrator and get at least three written installer quotes.
Frequently asked questions
Why 25 years?
It aligns with common panel performance warranties and industry convention. It is not a claim that the system stops working.
Why a 0.84 derate?
It is a planning-level combined loss factor. NREL PVWatts uses a similar order of magnitude; use your installer's modeled loss assumptions for a real design.
How do I know the JS and static tables agree?
The build runs both kernels against identical inputs and asserts agreement on size, production, cost, savings, payback, NPV and IRR before writing any page.
Can I export the schedule?
Yes — the calculator has a CSV download for the full year-by-year table.
Sources and further reading
- HelioCalc calculation kernel (Python and JavaScript)
- NREL PVWatts system loss documentation
- EIA Electric Power Monthly, Table 5.6.A, August 2026