The state comparison is a common retail-value benchmark, not an address-specific forecast. It values all assumed generation at a historical state retail average. The editable model can instead use your cash quote, annual production, import and export prices, self-consumption, ongoing costs and eligible incentive receipts. It does not discover those values or establish eligibility for you.
Download and reproduce the calculation
- 51-row CSV: units in the column names, source period, assumptions, sensitivity outputs and incentive review scope.
- 51-row JSON: the same inputs, full source records and ready-to-run model inputs.
- Readable JavaScript model: generated from the actual calculator, with no private repository access needed.
- Public provenance and reproduction recipe: input units, formulas and download instructions.
- state-insolation-pvwatts.json: every sunlight request and response described below.
Save the JavaScript download as solar-model.mjs when using Node, then import calcPayback and pass a row's model_input from the JSON. The reproduction recipe includes a complete invocation.
The "Source data" and "Calculator TypeScript" SHA-256 hashes in the provenance file identify the site's own source data file and calculator code at the time of export. Those source files are not published, so you cannot check those two hashes against the downloads above. To confirm later that a download has not changed, record your own SHA-256 of each file when you first save it. A matching hash shows a file is unchanged; it does not show that its inputs are accurate.
Benchmark assumptions, not market observations
| Illustrative system size | 7 kW DC |
|---|---|
| Assumed installed cost | $3.20/W; illustrative $22,400 before incentives. A round planning figure with no documented market source: it was not taken from a price survey or checked against current local quotes. Replace it with your own cash quote |
| Assumed performance ratio | 78%; a simplified loss factor, not a roof simulation |
| Assumed annual degradation | 0.5% |
| Assumed annual price escalation | 3%, with a separate 0% sensitivity |
| Retail-value convention | 100% of production valued at the historical import price; not a verified export tariff |
| Automatic incentives / ongoing costs | None applied; zero is a model assumption, not a finding of no programs or expenses |
| Model horizon | 25 years, undiscounted nominal cash flows |
Start with your own cash quote. The benchmark is sensitive to the assumed price. Running all 51 benchmark rows through the same model with nothing else changed, the median modelled payback is 11.2 years at $2.70/W, 13.0 years at $3.20/W, and 14.7 years at $3.70/W. If your quote divided by its size in watts is far from the assumed $3.20/W, the state benchmark is a weaker guide than a worksheet run with your own price.
Input provenance: what is and is not verified
Electricity prices: Calendar year 2024 annual average, residential cents/kWh, from EIA Electric Power Annual Table 2.10. Original retrieval 2026-08-23; the unchanged 51 numeric rates were rechecked 2026-09-24. These annual state averages are not your marginal avoided cost, current tariff, time-of-use price or export credit. No monthly series is mixed into them.
Sunlight: NSRDB typical-meteorological-year solar data via the NLR (formerly NREL) PVWatts v8 API, one request per state at the U.S. Census Bureau 2020 state center of population, for a 1 kW south-facing (azimuth 180°) fixed roof-mounted array tilted 20°. The value is PVWatts' solrad_annual: average daily solar energy on that tilted panel, in kWh/m²/day. The weather data PVWatts returned is NSRDB PSM V3 GOES tmy-2020 for 49 states and DC, and NSRDB PSM V4 Polar tmy-2023 for Alaska (the dataset PVWatts selected for that location). Retrieved September 24, 2026.
Exact recipe: for each state, take the latitude and longitude of the 2020 Census center of population from CenPop2020_Mean_ST.txt; request PVWatts v8 (https://developer.nlr.gov/api/pvwatts/v8.json) with system_capacity=1, module_type=0, losses=14, array_type=1, tilt=20, azimuth=180, dataset=nsrdb; and use outputs.solrad_annual rounded to two decimals. One location stands in for a whole state, so homes far from that point, and any shaded, east- or west-facing or steep roof, will differ. Every request, weather-file ID and response value is in state-insolation-pvwatts.json, so the 51 values can be re-requested and compared without any code from this site.
Version note: the sunlight inputs were re-derived from PVWatts v8 on September 24, 2026. Earlier versions of this site used different sunlight values, so older printouts will not match.
The shortcut is annual kWh = DC kW × daily sunlight on the tilted panel × 365 × performance ratio, treating kWh/m²/day on the panel as peak-sun hours. As a check, PVWatts' own AC output for the same 1 kW array, divided by this shortcut (sunlight × 365 × 0.78), ranges from 0.915 (Mississippi) to 1.057 (Alaska) across the 51 locations, with a median of 0.980. So the shortcut is within about 2% of PVWatts at the median, about 9% high at one extreme (Mississippi) and about 5% low at the other (Alaska). It does not model your roof's own tilt, direction, shading or local weather. For a quote, replace annual production with a site-specific estimate. The −20%/+20% production cases in the state table are stress tests, not confidence intervals or a measured error range.
Incentives: the input table carries scoped administrator-backed records for 17 rows and explicitly marks 34 rows unknown. A verification date applies only to the cited scope. Access dates and program effective dates are separate fields, and unresolved territory, eligibility, funding or legacy status is stated. Unknown does not mean no incentives. No table summary is automatically converted to a cash benefit.
Federal credit: the model applies no federal credit. The IRS Residential Clean Energy Credit page, checked September 24, 2026, excludes property placed in service after December 31, 2025. Carryforward from qualifying earlier expenditure and other tax provisions need separate eligibility checks; this calculator does not decide tax entitlement.
Annual cash flow and timing
Let E be first-year production; d annual degradation; g price escalation; f the self-consumed share; r the import price; x the export price; F annual fixed costs; A an eligible recurring incentive for N years; and T[y] the sum of scheduled receipts at the end of year y. Use fractions for d, g and f, and dollars/kWh for r and x in these formulas (the interface accepts percentages and cents/kWh).
production[y] = E × (1 − d)^(y − 1)
energy_value[y] = production[y] × (f × r + (1 − f) × x) × (1 + g)^(y − 1)
operating_cash[y] = energy_value[y] − F
end_year_receipts[y] = (y ≤ N ? A : 0) + T[y]
annual_net_cash[y] = operating_cash[y] + end_year_receipts[y]An explicit installed_cost_usd overrides kW × 1,000 × cost/W. The legacy state_credit_usd and utility_rebate_usd fields reduce initial cost upfront, floored at zero. They mean cash available at installation, not a tax credit expected later. For a delayed benefit, enter incentive_cashflows: [{year, amount_usd}] instead. Do not enter the same benefit as upfront, recurring and scheduled cash.
Cumulative cash starts at negative initial outlay. Operating savings are approximated as uniform within a year, allowing interpolation if they alone cross zero. Both recurring incentives and scheduled receipts arrive at year-end; they cannot create an earlier fractional payback. Repeated scheduled entries in a year are summed, so enter each actual benefit once. No crossing in 25 years returns null, not “25-year payback”. Zero initial outlay returns zero years. A first crossing is not a guarantee that cumulative cash stays positive after later losses or costs.
Export price defaults to import price, self-consumption to 100%, and annual fixed costs, annual incentive, incentive years and scheduled receipts to zero/empty. The escalator applies equally to import and export prices; recurring incentives and costs remain constant nominal dollars. Enter an effective annual export value only after accounting for tariff credit expiry and limits outside this simplified model.
An illustrative $1,100 versus $2,000 annual-value check
This is the same invented household used in the net metering and net billing guide, not an observed customer: an assumed 10 kW system producing 10,000 kWh in year one, a $30,000 cash quote, a 20¢/kWh import price, a 5¢/kWh export price and 40% self-consumption. Degradation, price escalation, operating costs and incentives are all set to zero to isolate the tariff effect. Valuing every kWh at retail gives an assumed $2,000 a year. The split gives 4,000 kWh × 20¢ + 6,000 kWh × 5¢ = $1,100 a year.
| Assumed change | Modelled year-one net cash | Modelled first break-even | Modelled cash position at year 25 |
|---|---|---|---|
| Assumed: all production valued at 20¢ retail | $2,000 | 15.0 years | $20,000 |
| Assumed baseline: 40% self-use at 20¢, 60% exported at 5¢ | $1,100 | No break-even within 25 years | -$2,500 |
| Assumed production 20% lower (8,000 kWh) | $880 | No break-even within 25 years | -$8,000 |
| Assumed production 20% higher (12,000 kWh) | $1,320 | 22.7 years | $3,000 |
| Assumed cash quote 25% lower ($22,500) | $1,100 | 20.5 years | $5,000 |
| Assumed cash quote 25% higher ($37,500) | $1,100 | No break-even within 25 years | -$10,000 |
| Assumed 3% annual price escalation | $1,100 | 20.2 years | $10,105 |
| Assumed operating cost of $200 a year | $900 | No break-even within 25 years | -$7,500 |
| Assumed one-time receipt of $3,000 at the end of year 2 | $1,100 | 24.5 years | $500 |
Each row changes only the named input from the 40% self-use baseline; changes are not stacked. The year-2 receipt row is an assumed timing test, not evidence that a particular household qualifies.
A result beyond the 25-year horizon. The baseline returns no break-even within 25 years; after year 25 the modelled household is still $2,500 short of its assumed $30,000 outlay. Dividing that outlay by $1,100 a year gives 27.3 years, but that point lies outside the model, so it is a straight-line extrapolation, not a payback this calculator reports. The guide shows the same result.
To reproduce the baseline in the worksheet, choose any state, enter the system size first (changing size resets an unedited price and production), then enter: System size (kW DC) 10; Assumed installed cash price ($) 30000; Assumed year-one production (kWh) 10000; Assumed avoided import price (¢/kWh) 20; Assumed export credit (¢/kWh) 5; Production used on site (%) 40; Assumed electricity-price escalation (%/year) 0; Assumed production degradation (%/year) 0. Leave Assumed recurring solar cost ($/year) and the optional incentive amounts at 0 (the delayed receipt year can stay at 1).
Which payback number am I seeing?
The site uses three payback definitions. Simple division (initial outlay ÷ first-year savings) ignores later degradation and price changes. A flat-price cumulative model keeps degradation but turns off price escalation. An escalating-price model adds the stated 3% price assumption.
- The state comparison table shows the escalating-price and flat-price results side by side.
- Each state page shows all three, including the simple division, in its assumptions box.
- The worksheet reports one cumulative break-even for the inputs you enter, then repeats it at 0%, your entered escalation and 6% a year.
These are different scenarios, not interchangeable answers or guaranteed best/worst cases.
At fixed cost/W and production/kW, with no fixed-dollar adjustments, changing system size scales cost and generation together and therefore does not change payback. A ZIP selecting a state cannot identify your roof, utility tariff or load profile. Change genuinely relevant inputs rather than treating a larger kW setting as personalization.
Limits to carry into a quote review
- No roof azimuth, pitch, tree shading, hourly weather or load/dispatch simulation.
- No automatic loan interest, discounting, tax-liability/carryforward calculation, resale value or inflation-adjusted purchasing power.
- Storage cost can be included in the cash quote, but battery operation, replacement and degradation are not simulated.
- A constant annual cost does not reproduce a one-time inverter or roof-replacement expense. Export credit expiry and bill minimums are not modelled automatically.
- Incentive eligibility and funding are not guaranteed; excluded benefits need not outweigh omitted costs.
If an input or cited scope is wrong, send the source and the affected calculation. A public model makes the arithmetic inspectable; it does not remove the need to verify the quote and its assumptions.