Project Finance & Financial ModellingFinancial modelling structure and best practice · Lesson 9 of 20

Building revenue, costs, tax and cash flow

Article · 15 min · 9 min lecture

Video lecture

Building revenue, costs, tax and cash flow

9 chapters · about 9 min · full transcript

Coming soon

Chapter 1 of 9

From megawatts to CFADS

  • Revenue logic follows the contract
  • Indexation, opex, working capital and tax
  • Cash flow available for debt service

The narrated lecture is in production

Every chapter is scripted and ready. Browse the chapters and read the full transcript now — the video will appear here when it’s published.

Chapters

The operating model

Once structure and timing are in place, build the operating cash flows that everything else depends on.

Revenue

Revenue logic follows the contract:

  • Availability-based (many PPPs): payment for making the asset available to specified standards, less deductions for unavailability or poor performance.
  • Volume × price (e.g., energy sold × tariff; vehicles × toll).
  • Capacity + energy (some power contracts): a capacity payment for being available plus an energy payment per unit delivered.

Each component should have its own row: volume, price, indexation, deductions.

Energy output (MWh)            = capacity (MW) × hours × capacity factor × availability × (1 − degradation)^(years)
Tariff (USD/MWh)               = base tariff × indexation factor
Revenue (USD 000)              = output × tariff / 1,000 × operations flag

Indexation

Contracts often index prices and costs to inflation indices (CPI, local wage indices, USD exchange rates). Build an indexation factor row per index: factor_t = factor_(t−1) × (1 + rate_t), starting at 1.0 at the base date. Use the right base date and lag specified in the contract.

Operating costs

Separate fixed and variable costs, each with its own indexation:

CostDriverIndexation
O&M contract fixed feePer periodContract index
Variable O&MPer MWh or per unitContract index
InsurancePer period, % of asset valueMarket assumption
Land leasePer periodLease terms
SPV management and adminPer periodCPI
Lifecycle / major maintenanceScheduled (e.g., inverter replacement year 12)Relevant index

Lifecycle costs are lumpy; lenders often require a maintenance reserve account (MRA) to smooth them.

Working capital

Revenue is rarely received immediately and costs are rarely paid immediately. Model receivables (e.g., 45–60 days) and payables (e.g., 30 days). Working capital movements reduce or increase cash available for debt service.

Tax

Tax logic depends on jurisdiction and can be complex. Model the key elements:

  • Taxable profit = revenue − opex − tax depreciation (capital allowances) − deductible interest (subject to limits) ± other adjustments.
  • Tax losses carried forward (and their limits).
  • Tax holidays or exemptions available in some jurisdictions for certain sectors.
  • Withholding taxes on interest or dividends paid abroad.
  • Indirect taxes such as VAT/GST/sales tax, which mainly affect cash timing.

Corporate tax regimes vary: for example, the UAE introduced a federal corporate tax regime in 2023; KSA applies zakat and income tax depending on ownership; Pakistan and the UK have their own corporate tax and allowance rules; US projects may use federal tax credits and incentives under current law. Always obtain tax advice and have the tax logic reviewed.

From revenue to CFADS

The key operating output is cash flow available for debt service (CFADS):

Revenue
− Operating costs (incl. lifecycle costs, or + release from MRA)
− Tax paid
± Working capital movements
= CFADS

CFADS is typically defined precisely in the loan agreement; the model must follow that definition. (Some definitions exclude certain items or include reserve releases.)

Worked example: first operating year

Illustrative. A 50 MW solar plant in the UAE; capacity factor 24%; availability 99%; first-year degradation ignored; tariff USD 40/MWh.

Output = 50 × 8,760 × 0.24 × 0.99 ≈ 104,069 MWh
Revenue = 104,069 × 40 ≈ USD 4.16M
Opex (fixed O&M, insurance, lease, admin) ≈ USD 0.95M
Tax: assume none payable in year 1 due to allowances (illustrative)
Working capital: receivables increase ≈ USD 0.5M (45 days of revenue)
CFADS ≈ 4.16 − 0.95 − 0.5 ≈ USD 2.71M

In later years, working capital stabilises, degradation reduces output slightly and indexation adjusts tariff and costs.

Common mistakes

  • Revenue formulas that ignore contract deductions or caps.
  • Wrong indexation base dates.
  • Ignoring working capital in the first year.
  • Tax modelled as a flat percentage of revenue.
  • Defining CFADS differently from the loan agreement.

Quick self-check

Reconcile your first full operating year by hand: output, revenue, each opex line, tax and working capital. If you cannot reproduce the model's CFADS within a small rounding difference on a single page, something in the logic is either wrong or too complex to audit. This simple habit catches a surprising share of errors, including wrong indexation base dates and flags switched on in the wrong period.

Hands-on: an operating block in Excel

Inputs: MW, CF (capacity factor), Avail, Degr (annual), Tariff_base, Index_rate, Opex_fixed, Opex_var_per_MWh, DSO (days)
Output (MWh)       =MW*Hours_in_period*CF*Avail*(1-Degr)^(Op_year-1)*Ops_flag
Index factor       F: =1 at base date ; G: =F_idx*(1+Index_rate)^(Period_years)    (per contract base date and lag)
Tariff             =Tariff_base*Index_factor
Revenue (000)      =Output*Tariff/1000
Opex (000)         =(Opex_fixed*Period_years + Opex_var_per_MWh*Output/1000)*Opex_index*Ops_flag
Receivables        =Revenue*DSO/Days_in_period
WC movement        =Receivables - Receivables_prev - (Payables - Payables_prev)
CFADS              =Revenue - Opex - Tax_paid - WC_movement      (align to the loan agreement definition)

Hands-on: the first-year reconciliation in Python

mw, hours, cf, avail = 50, 8760, 0.24, 0.99
tariff = 40                       # USD/MWh, illustrative
opex = 0.95e6                     # fixed O&M, insurance, lease, admin (illustrative)
dso = 45                          # days of revenue outstanding at year end

output = mw * hours * cf * avail
revenue = output * tariff
receivables_build = revenue * dso / 365
tax_paid = 0.0                    # illustrative: allowances shelter year 1
cfads = revenue - opex - tax_paid - receivables_build
print(f"Output {output:,.0f} MWh | Revenue {revenue/1e6:.2f}M | WC {receivables_build/1e6:.2f}M | CFADS {cfads/1e6:.2f}M")

Output: about 104,069 MWh, revenue 4.16M, working-capital build 0.51M and CFADS about 2.70M (the lesson rounds the build to 0.5M, giving 2.71M). Match your model to this kind of one-page check.

How to measure success

  • First operating year reconciles by hand within rounding.
  • Every index has a documented base date and lag from the contract.
  • The CFADS row matches the loan agreement definition, confirmed by the model auditor.

Key takeaways

  • Model revenue as the contract defines it: availability, volume × price, or capacity + energy.
  • Build separate indexation factors and split fixed, variable and lifecycle costs.
  • Include working capital and jurisdiction-specific tax logic, reviewed by tax advisers.
  • CFADS = revenue − opex − tax ± working capital, as defined in the loan agreement.

Check your understanding

Quick questions to lock in the lesson. They don’t count towards your certificate.

  1. Which is the best description of CFADS?
  2. Why do lenders often require a maintenance reserve account?
  3. A model calculates tax as 10% of revenue every year. What is the main problem?

Put it into practice

Build a one-year revenue and CFADS calculation for a small asset (e.g., rooftop solar or a rental property) using the template, stating every assumption.

Enrol for free to save your progress

Reading is always free. Enrol to keep your place, take the final assessment and earn a verifiable certificate.