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.
| Scenario | Tenor | Energy | REC | Carbon | Blended | Floor | Dev NPV | Ten NPV | Inv. tariff @ NPV=0 |
|---|---|---|---|---|---|---|---|---|---|
| Vanilla 20-yr fixed PPA | 20 | 300 | 0 | 0 | 300 | 299 | +0.9 | +253 | 298.8 |
| REC-stacked 20-yr | 20 | 300 | 50 | 0 | 350 | 299 | +39.5 | +215 | 248.8 |
| Hyperscaler carbon-stacked 20-yr | 20 | 300 | 0 | 290 | 590 | 299 | +225.0 | +29 | 8.5 |
| Fully stacked + 90% take-or-pay 20-yr | 20 | 300 | 50 | 290 | 640 | 299 | +263.6 | −9 | −41.5 |
| Short-tenor (10-yr) vanilla | 10 | 300 | 0 | 0 | 300 | 425 | −65.8 | +173 | 424.8 |
(All NPVs in RM millions over the term horizon at 8% discount.)
Reading the table
Section titled “Reading the table”- 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.
Three commercial readings
Section titled “Three commercial readings”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.
Reading 2 — REC adds breathing room
Section titled “Reading 2 — REC adds breathing room”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.
How to use this model
Section titled “How to use this model”- Term-sheet drafting. Pass a custom
PPATermSheetwith 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. - 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. - Tenor stress test. Sweep
horizon_yearsfrom 10 to 25 to see how much the energy tariff has to move. Below 12-13 yr the deal collapses without REC/carbon stacking. - Scenario presets in code.
DEFAULT_TERMSHEETShas the five preset structures used here for one-shot regression checks.
Limitations
Section titled “Limitations”- 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 = 0and 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).
Stacking with other reports
Section titled “Stacking with other reports”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.mdandportfolio_timeline.md— apply this term-sheet model per-anchor for portfolio-level deal structuring.
JSON output
Section titled “JSON output”reports/ppa_termsheet.json has each preset’s full input/output pair plus
the inverse-solve energy tariff for developer NPV = 0.