Skip to content

Hyperscaler PPA term-sheet sweep

Generated: 2026-05-08. Model: jb_vpp.models.ppa_termsheet. Layers REC, carbon credit, take-or-pay, performance LDs, and tenor onto the existing single-tariff PPA-floor model (breakeven.solve_ppa_floor). All scenarios use the 60 MW PV baseline delivering 78,617 MWh/yr (LP base case; matches ppa_pricing.md).

At the hyperscaler-carbon-stacked preset, a developer needs only RM 8.5/MWh in energy tariff to break even — carbon attribute revenue (RM 290/MWh) does the heavy lifting. This is consistent with the existing finding from carbon_re100_analysis.md: the carbon attribute alone is worth +211 M NPV (2.5× the BTM avoided cost), so a hyperscaler-anchored PPA can effectively sell energy at near-zero kWh tariff and still clear the deal on carbon.

ScenarioTenorEnergyRECCarbonBlendedFloorDev NPVTen NPVInv. tariff @ NPV=0
Vanilla 20-yr fixed PPA2030000300299+0.9+253298.8
REC-stacked 20-yr20300500350299+39.5+215248.8
Hyperscaler carbon-stacked 20-yr203000290590299+225.0+298.5
Fully stacked + 90% take-or-pay 20-yr2030050290640299+263.6−9−41.5
Short-tenor (10-yr) vanilla1030000300425−65.8+173424.8

(All NPVs in RM millions over the term horizon at 8% discount.)

  • Energy / REC / Carbon: per-MWh revenue stream the developer collects.
  • Blended: sum of energy + REC + carbon (developer’s gross per-MWh take).
  • Floor: developer’s energy-only breakeven tariff (capex/A + opex)/delivered.
  • Dev NPV: 20-yr (or 10-yr) NPV of the project from developer’s side.
  • Ten NPV: tenant’s net benefit = horizon-PV(kWh savings + carbon attribute).
  • Inv. tariff: the energy tariff that makes Dev NPV exactly zero — keeping every other contract term (REC, carbon, take-or-pay, tenor) fixed.

Reading 1 — Vanilla PPA: marginal deal, both sides clear

Section titled “Reading 1 — Vanilla PPA: marginal deal, both sides clear”

A standard 20-yr PPA at RM 300/MWh sits right at developer breakeven (NPV +0.9 M is rounding noise). Tenant gets +253 M because their carbon-attribute benefit (PV displaces grid carbon, they value that at internal price RM 460/tCO2) flows in even when the developer doesn’t sell carbon credits. The tenant is happy; the developer isn’t underwater. This is the minimum viable deal.

Adding a RM 50/MWh REC adder (paid by a separate REC offtaker — typical I-REC or MY-REC structure) gives the developer +39.5 M NPV without touching the tenant. REC-stacking is the cheapest single move from “breakeven” to “meaningfully positive” for the developer side.

Reading 3 — Hyperscaler carbon stack changes the deal entirely

Section titled “Reading 3 — Hyperscaler carbon stack changes the deal entirely”

If the developer can sell the carbon attribute to a hyperscaler tenant at the same internal carbon price the hyperscaler uses (RM 460/tCO2), the deal becomes carbon-anchored: at 300 RM/MWh energy + 290 RM/MWh carbon, developer clears +225 M but tenant is now only +29 M (they’re paying full price for the carbon they value, so the carbon arbitrage zeros out for them).

The inverse-solver result is the punchline: the developer only needs RM 8.5/MWh in energy tariff if also selling carbon at RM 290/MWh. This re-frames the negotiation:

“The energy is essentially free. We’re not selling kWh — we’re selling a certified-clean MWh attribute, and the energy is the delivery vehicle.”

This is the actual structure most hyperscaler-anchored CGPP / green-corridor deals are converging toward in 2024-2026.

The fully-stacked-with-ToP scenario is overcooked

Section titled “The fully-stacked-with-ToP scenario is overcooked”

Adding REC (50) + carbon (290) + 90% take-or-pay + RM 50k/pct LD on a 20-yr contract pushes developer NPV to +264 M, but tenant NPV goes negative (−9 M). The inverse-solver wants the developer to pay the tenant RM 41.5/MWh (negative tariff), because REC + carbon + take-or-pay-floor already cover all costs. This is a pure-paper outcome: a real hyperscaler counterparty would re-negotiate before signing. Useful to flag the upper bound, not to ship.

Short-tenor 10-yr is fundamentally infeasible at vanilla pricing

Section titled “Short-tenor 10-yr is fundamentally infeasible at vanilla pricing”

The same 300 RM/MWh tariff at 10-yr horizon leaves the developer −66 M underwater, because the annuity factor falls from 9.82 (20-yr @ 8%) to 6.71. To clear breakeven over 10 yr requires 425 RM/MWh, well above the tenant’s 338 RM/MWh avoided-cost ceiling. Any 10-yr PPA must either:

  • price-stack with REC + carbon attribute, OR
  • include a residual-value mechanism (developer keeps the asset post-PPA), OR
  • offer index-linked escalation that prices in the developer’s funding cost.
  1. Term-sheet drafting. Pass a custom PPATermSheet with proposed contract terms. Get back developer NPV, tenant NPV, and per-stream revenue breakdown. If developer NPV is barely positive, layer in REC or adjust take-or-pay before going to legal.
  2. Inverse pricing. Use solve_energy_tariff_for_developer_npv(..., target_npv_rm) to set a target IRR and back out the energy tariff. The function is closed-form and deterministic.
  3. Tenor stress test. Sweep horizon_years from 10 to 25 to see how much the energy tariff has to move. Below 12-13 yr the deal collapses without REC/carbon stacking.
  4. Scenario presets in code. DEFAULT_TERMSHEETS has the five preset structures used here for one-shot regression checks.
  • No price escalation. All revenue streams are flat-RM-per-MWh in perpetuity. A real PPA usually has CPI-linked or TNB-tariff-linked escalation; modeling that requires per-year cashflow simulation (deferred).
  • Take-or-pay only protects the expected delivery downside. It doesn’t account for force-majeure carve-outs, curtailment-related ToP relief, or the tenant’s option to over-take (which a real ToP usually allows).
  • Performance LD model is one-dimensional (linear shortfall × rate). Real LDs have caps, step functions, and cure periods.
  • REC and carbon are modeled as separate revenue streams flowing to the developer. In some hyperscaler structures they bundle, double-counting must be avoided. The model assumes they’re separately monetized — i.e., REC to a third-party REC market, carbon to the hyperscaler’s internal program. When bundled, set carbon_credit_rm_per_mwh = 0 and price into REC.
  • No discount-rate-vs-WACC distinction. Both developer and tenant use 8%. In reality, a hyperscaler’s internal hurdle is lower (~6-7%), which would raise tenant NPV further; a developer’s WACC could be higher (10-12% if unsponsored).

Combine with:

  • ppa_pricing.md — single-tariff floor/ceiling/surplus baseline (this report extends it).
  • carbon_re100_analysis.md — full carbon-pricing scenarios (USD 25-100/tCO2).
  • enegem_export_estimate.md — cross-border revenue stream that could substitute for or top up the PPA tariff.
  • aggregator_portfolio.md and portfolio_timeline.md — apply this term-sheet model per-anchor for portfolio-level deal structuring.

reports/ppa_termsheet.json has each preset’s full input/output pair plus the inverse-solve energy tariff for developer NPV = 0.