> For the complete documentation index, see [llms.txt](https://docs.suno.finance/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.suno.finance/financial-model/valuation-engine.md).

# The valuation engine

The engine builds one row per calendar year, from the commissioning year to the end of the asset's useful life: `L + 1` rows for a lifetime of `L` years. Quantities within a year are treated as uniformly distributed in time, and partial years are handled through fractional time factors.

#### Time structure

Let `a` be the project age at the valuation date, in years of 365.2425 days, and `y_o` the fraction of the commissioning calendar year that follows the commissioning date. Row `n` carries:

$$
tf\_n = \min\big(\max(y\_o + n - a,\ 0),\ 1\big), \qquad tf\_L = \max\big(0,\ \min(L - a,\ 1 - y\_o)\big)
$$

Rows before the valuation date get `tf = 0` and produce no cash flow, since the valuation is strictly forward-looking. The row containing the valuation date gets the remaining fraction of that year, full years get 1, and the final row covers the head of its calendar year up to the end-of-life anniversary, net of anything already elapsed. The factors sum to the remaining life, `Σ_n tf_n = L - a`, and a valuation dated past end-of-life is rejected.

#### Generation

Panel efficiency follows a yearly degradation ladder. A calendar year straddles two panel-age steps whenever commissioning was mid-year, so row `n ≥ 1` uses the step average of the window it covers:

$$
\eta\_n = \eta\_0 - (n - 1 + y\_o),\delta
$$

with the commissioning row at full initial efficiency. Generation is:

$$
G\_n = P\_0 \cdot 365.2425 \cdot kWp \cdot \eta\_n \cdot tf\_n \cdot (1 - h\_n)
$$

where `P_0` is the year-zero baseline from [telemetry](/financial-model/inputs-and-data.md) and `h_n` is the expected downtime from any [equipment replacement](/financial-model/equipment-replacement.md) scheduled that year.

#### Energy revenue

`R^(energy)_n = G_n · p_n`, with `p_n` resolved from the PPA curve: base-year money escalated by the chosen index and, for anchored contracts, blended between the two overlapping 12-month batches. The blend weight is computed over the sub-window of the year the row actually covers, so for the valuation-year row only the remaining tail of the year participates and an expired batch cannot affect the price applied to future cash.

#### Certificates

$$
R^{REC}*n = \left\lfloor \frac{G\_n}{1000} \right\rfloor \cdot c^{REC}*{USD} \cdot \frac{U(y\_n)}{U(y\_{eval})} \cdot FX\_{y\_n}
$$

Certificate revenue counts whole MWh. The price is denominated in USD/MWh, the denomination of the I-REC market, escalates with the US CPI index `U`, and converts at each year's projected exchange rate. A legacy local-currency mode escalating with local CPI remains for projects not yet migrated; under the PPP-consistent FX path the two are close to equivalent in real USD terms.

#### Operating expenses

$$
C^{opex}*n = 12 \cdot O*{used} \cdot \frac{CPI(y\_n)}{CPI(y\_{eval})} \cdot (1 + \delta\_{opex})^{,y\_n - y\_{eval}} \cdot tf\_n
$$

The baseline `O_used` comes from [invoice telemetry](/financial-model/inputs-and-data.md) and is expressed in valuation-date money, hence the CPI escalation from the valuation year. The optional real escalator `δ_opex` (default 0; industry benchmarks run at CPI +0.5 to 1% for aging assets) captures recurring O\&M outpacing general inflation. Major replacements are excluded from this line; they live in the [discrete-event schedule](/financial-model/equipment-replacement.md), and the boundary between the two prevents double counting.

#### Protocol fee and additional income

The protocol fee is proportional to gross revenue: `C^(fee)_n = φ · (R^(energy)_n + R^(REC)_n + R^(add)_n)`. Additional income streams, such as tax benefits or ancillary revenues, enter per year in declared base-year money and escalate with CPI from their base.

#### Net cash flow and conversion

$$
F^{LC}\_n = R^{energy}\_n + R^{REC}\_n + R^{add}\_n - C^{opex}\_n - C^{equip}\_n - C^{fee}\_n, \qquad F^{USD}\_n = \frac{F^{LC}*n}{FX*{y\_n}}
$$

Within the forecast horizon `FX` comes directly from the macro set; beyond it, the PPP drift applies. USD-denominated projects skip conversion.

#### The published table

The full year-by-year table ships with every valuation: time factors, efficiency, generation, prices, each revenue and cost line, exchange rates, discount factors, and discounted flows. The discounted column sums to the NPV, so a published NAV can be verified line by line.

#### Warnings

When an input situation weakens a calculation, the engine says so. A truncated FX forecast without US inflation data, insufficient telemetry, or a replacement event falling in the valuation year each produce an explicit warning that travels with the draft and freezes into the published version.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.suno.finance/financial-model/valuation-engine.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
