← Back to methodology

PPA Viability Scanner — Methodology

Five revenue scenarios for renewable energy offtake structuring
Engine v0.2.0-stage2 · Last updated July 2025

1. Overview

The PPA Viability Scanner models five revenue strategies for a utility-scale wind or solar project over a 25-year project lifetime. It answers the question: "Given this project's costs and market context, which offtake strategy delivers the best risk-adjusted return?"

The engine runs all five scenarios simultaneously with identical cost and generation assumptions — only the revenue structure changes. This allows an apples-to-apples comparison of NPV, IRR, payback period, and LCOE across strategies.

2. Core Formulas

2.1 Annual Energy Production (AEP)

AEPt = CapacityMW × 8,760 × CF × (1 − d)t−1

Where t is the year (1-indexed), CF is the capacity factor, and d is the annual degradation rate. Year 1 produces at full capacity; degradation compounds from year 2 onward.

TechnologyDegradation dSource
Onshore Wind0.5% / yrNREL ATB 2024
Solar PV0.7% / yrNREL ATB 2024

2.2 Net Present Value (NPV)

NPV = Σt=0T cft / (1 + r)t

Where cf0 = −CAPEX (initial investment), and cft = Revenuet − OPEXt for years 1–25. r is the discount rate (WACC).

2.3 Internal Rate of Return (IRR)

NPV(IRR) = 0  →  Σt=0T cft / (1 + IRR)t = 0

Solved numerically using Newton-Raphson iteration with multi-start ([0.10, 0.01, 0.25, −0.05]), max 200 iterations. Returns null if no root converges.

2.4 Levelised Cost of Electricity (LCOE)

LCOE = ( CAPEX + Σ OPEXt / (1+r)t ) / ( Σ AEPt / (1+r)t )

Both numerator and denominator are discounted at the WACC. OPEX is constant in real terms (no escalation). This is the same LCOE for all five scenarios because costs and generation are identical — only revenue changes.

2.5 Forward Merchant Price

Pricet = BasePrice × (1 + decay)t−1

Where decay = −1.5% / yr (real). This models long-term price erosion from increasing renewable penetration and the merit-order effect. By year 25, the forward merchant price is approximately 69% of the year-1 baseload.

⚠ FLAG: The −1.5% forward decay is a consensus simplification from BNEF New Energy Outlook 2025, Aurora ERCD 2024, and IEA WEO 2025. Actual merchant prices are path-dependent and highly volatile. This linear decay should not be interpreted as a price forecast.

3. The Five Scenarios

① MERCHANT

100% spot-price exposure. No PPA contract.

Revt = AEPt × BasePricet × (CaptureRate / 100)

All revenue comes from the spot market at the technology-weighted capture rate. The capture rate (entso_capture_rate) reflects how much of the baseload price the technology actually captures given its generation profile.

Risk level: HIGH — fully exposed to market volatility and price decay.

② FIXED PPA

Fixed-price PPA for the contract term, then merchant tail.

Revt = AEPt × PPAprice     if t ≤ term
Revt = AEPt × MerchantPricet × (CR / 100)   if t > term

During the PPA term, every MWh is sold at the fixed strike price. After the PPA expires, the project sells at prevailing merchant prices. If the PPA term covers the full 25 years, there is zero merchant exposure.

Risk level: NONE (full-term PPA) or MODERATE (partial-term).

③ SEQUENTIAL

PPA for contract term, then stressed merchant tail.

Revt = AEPt × PPAprice                      if t ≤ term
Revt = AEPt × MerchantPricet × (CR / 100) × 0.80   if t > term

Identical to Fixed PPA during the contract term. After expiry, the merchant tail is stressed by −20% to model P90-like downside risk. This is a sensitivity scenario — the "what if merchant prices are worse than expected" case.

Risk level: HIGH — post-PPA merchant revenues are stressed.

④ BLENDED

Partial PPA + partial merchant simultaneously.

During PPA term:
  PPA revenuet = AEPt × blendRatio × PPAprice
  Merchant revenuet = AEPt × (1 − blendRatio) × MerchantPricet × (residualCR / 100)
  Revt = PPA revenuet + Merchant revenuet

After PPA term: same as Merchant scenario.

A fraction (blendRatio = 70% default) is sold under PPA at the fixed price. The remaining 30% is sold on the spot market. The key innovation: the residual capture rate accounts for the PPA "cream-skimming" the best hours (typically peak), leaving the merchant portion with lower-value hours.

Residual Capture Rate

ResidualCR = BaseCR × (1 − cannibalisation)
cannibalisation = blendRatio × |PPA price − BandPriceavg| / BasePrice

The residual capture rate is computed from the hour-band price structure and the technology's generation profile. Solar, concentrated in peak hours, suffers more cannibalisation when peak-hour PPAs remove the best prices from the merchant stack.

Risk level: MODERATE — split exposure reduces both upside and downside.

⑤ CfD (Contract for Difference)

One-way floor CfD — guarantees minimum price, keeps upside.

During CfD term:
  ReferencePricet = MerchantPricet × (CR / 100)
  EffectivePricet = max(ReferencePricet, StrikePrice)
  Revt = AEPt × EffectivePricet

After CfD term: same as Merchant scenario.

The CfD acts as a one-way floor. If the market reference price falls below the strike, the CfD tops up the difference. If the market price is above the strike, the generator keeps the upside. The strike price defaults to baseload × 1.05 (+5% premium).

Risk level: LOW (full-term) or MODERATE (partial-term).

4. Constants & Defaults

ConstantValueSource
Hours per year8,760IRENA LCOE methodology
Project lifetime25 yearsIRENA 2024, standard RE finance tenure
Wind degradation0.5% / yrNREL ATB 2024
Solar degradation0.7% / yrNREL ATB 2024
Forward merchant decay−1.5% / yr (real)BNEF / Aurora / IEA consensus
Downside stress factor0.80 (−20%)Project finance P90 convention
Default blend ratio70% PPA / 30% merchantMarket convention (60–80% typical)
CfD strike premium+5% over baseloadUK CfD AR6, DE EEG conventions
Default PPA term15 yearsMarket convention for utility-scale RE
Default WACC8%IRENA 2024, emerging-market proxy

4.1 Hour-Band Generation Shares

The engine splits each day into three hour-bands (CET/CEST) and assigns technology-specific generation shares based on observed European generation profiles:

BandHoursSolar shareWind share
Peak08:00–19:5955%35%
Shoulder06:00–07:59 + 20:00–21:5940%35%
Off-peak22:00–05:595%30%

Source: ENTSO-E generation profiles 2023–2024, aggregated across EU bidding zones. Rounding to nearest 5% for transparency. These are European averages and may differ for non-European markets.

4.2 Capture Rate Thresholds

Capture RateCannibalisation Risk
≥ 90%LOW — technology retains most market value
75% – 89%MODERATE — some value erosion
< 75%HIGH — significant cannibalisation

Source: BNEF 2024 "Capture Rate Trends", Aurora 2024, ENTSO-E market reports. <75% is commonly cited as "problematic" for new-build investment decisions in mature RE markets (DE, DK, ES).

5. Data Sources

DataTableSource
Spot price by hour-band entso_price_buckets ENTSO-E Transparency Platform (aggregated monthly by zone, band)
Capture rate by technology entso_capture_rate ENTSO-E Transparency Platform (technology-weighted price / baseload)
Country CAPEX country_capex IRENA Renewable Cost Database 2024 (USD/kW, converted to EUR via live FX)
Country OPEX country_opex IRENA Renewable Cost Database 2024 (USD/kW/yr, converted to EUR)
Country WACC / financing country_financing IRENA 2024, Damodaran country risk premiums
FX rates (USD→EUR) KV cache @fawazahmed0/currency-api (daily, cached in Cloudflare KV)

6. Currency Handling

All internal calculations are performed in EUR. CAPEX and OPEX from IRENA are denominated in USD and converted at the point of data fetching using a live exchange rate from @fawazahmed0/currency-api. The FX rate and timestamp are included in the API response for transparency.

If FX data is unavailable, the engine falls back to a 1:1 USD/EUR rate and flags the result as stale.

7. Comparison Summary

After computing all five scenarios, the engine produces a comparison summary:

8. Known Limitations & Flags

⚠ Pre-feasibility only. This tool is designed for early-stage screening and structuring exploration. It is NOT a substitute for detailed financial modelling, investment-grade analysis, or professional offtake advice.

8.1 Model Simplifications

8.2 Data Gaps

9. Roadmap

StageScopeStatus
Stage 1Data layer, schemas, frontend skeleton✅ Complete
Stage 25 revenue scenarios + calculation engine + API✅ Complete
Stage 3PVGIS / GWA integration for capacity factorPlanned
Stage 4Country-specific capture rate projectionsPlanned
Stage 5PDF report export and shareable linksPlanned

10. Source Modules

Questions? Contact the preFeasibility team or open an issue on GitHub.