Skip to content
Igor Sabodakha

Battery Storage Investment Calculator — Ukraine · Methodology

How the battery storage model works

This page documents what the calculator computes, in which order and with which formulas (methodology revision S1.3 · contract R3.1). The battery is fictional; every input comes from a public source or is a documented assumption — both are listed on the sources page. Prices run to 30 Sep 2026. The numbers below come from the same engine that runs in the calculator.

Illustrative calculation — not investment, tax or legal advice. Fictional case.

The base case at a glance

Battery
“Zoria Storage”: 50 MW / 100 MWh of usable AC energy at the start of life (2 h), one site in the Kyiv region, connected to the 110 kV distribution network
Revenue
Day-ahead trading only: buying in cheap hours, selling in dear ones. A multi-year reserve contract with Ukrenergo is an option, off in the base case (section 10)
Timeline
Financial close 1 Feb 2027 → 12 months of construction → commercial operation 1 Feb 2028 → 15 years of operation, the last month January 2043 → three months of settlement
Company
A Ukrainian limited company owned 100% by a German GmbH through share capital
Investment
€23.1m without VAT (€231 per kWh of usable energy)
Debt
A euro loan from an international development bank at 8.0% fixed, sized on the lender’s case: €4.1m (17% of the investment)
Result
Investor IRR −6.9% in euros; NPV at 15% −€16.8m; break-even at spreads 1.96 times the reference path

1. Principles

  • Monthly and dated. The model runs month by month from financial close to the end of settlement. Cash flows fall at month ends; debt service on 1 February and 1 August. IRR and NPV use exact dates with an Actual/365 day count, like XIRR and XNPV.
  • Two currencies. The company keeps its books in hryvnias. Euro items — the equipment, the loan, the reserve account, euro costs — are converted at the month’s exchange rate. The investor is measured in euros.
  • Honest about what is missing. The base case values day-ahead trading only, and the result is shown as it is: the first screen of the calculator says what it would take to break even. A special-auction reserve contract with Ukrenergo can be added; daily reserve auctions, the balancing market and the intraday market are not in the model.
  • No raw prices on the site. The revenue comes from a library computed in advance on the Market Operator’s hourly prices. The site publishes only results derived from them.
  • Checks, not hidden fixes. A failed check is shown, never smoothed over; what the model does not cover is marked as outside its scope, never as passed.

2. Revenue

The revenue library

For every day of a price year, an optimiser finds the best charge and discharge schedule with perfect foresight — a mixed-integer program per day and per MW:

maximise   Σ_t  p[t]·d[t] − p[t]·c[t] − fee·c[t]
subject to x[t+1] = x[t] + RTE·c[t] − d[t]        all losses on charging
           0 ≤ c[t] ≤ P·u[t],  0 ≤ d[t] ≤ P·(1 − u[t])   no charging and discharging at once
           0 ≤ x[t] ≤ usable hours · P;  x = 0 at the start and the end of each day
           Σ_t d[t] ≤ cycle limit · duration · P

Ties are broken towards less discharge, so the battery does not wear itself out for nothing. The library holds monthly sums of sales, purchases and energy for 4,320 combinations: two price years (2025 and the 12 months to September 2026), durations of 1, 2 and 4 hours, usable energy on a fine grid as the battery fades, efficiency nodes of 85, 88 and 90%, cycle limits of 1.0 and 1.5 a day, and an effective fee per MWh bought of 0 to 4,000 UAH. The calculator interpolates between nodes and never extrapolates: an input outside the grid is reported, not clamped.

Before release, every midpoint between nodes is solved exactly and compared with the interpolation: the largest error is 0.10% of a year’s value along the usable-energy axis and 0.14% along the fee axis (0.30% and 1.42% for a single month), within the release limits of 0.5% and 1.5%.

From history to the future

Future prices are the historical ones, shifted to a future price level and with their spreads scaled:

p_future = L(y) + m(y) · (p_hist − L̄)        L̄ = average price of the chosen price year

The price level L falls from €112.6 per MWh in 2028 to €105.9 in 2031 (2025 euros), from Ukraine’s 2025 average towards that of its EU neighbours. The spread multiplier m(y) follows one of three paths:

Path2028202920302031 on
Reference1.0000.9250.8500.773
Low0.8500.7500.6500.600
High1.1501.1001.0501.000

The reference path converges by 2031 to where Hungary, Romania, Slovakia and Poland were in 2025: their average daily top-two-hour spread was €140.52 per MWh against €181.75 in Ukraine. The low path — the lender’s view — has 1.4 GW of batteries in the pipeline flatten spreads to 60% of 2025. The high path starts 2028 at the level of 2026 and comes down to that of 2025 by 2031. No probabilities are attached.

For a given schedule, the transformation is linear in the library’s sums, so a month’s sales and purchases follow without solving again: S = m·S_hist + (L − m·L̄)·O and P = m·P_hist + (L − m·L̄)·I, with O and I the energy delivered and drawn.

Tariffs and fees inside the dispatch

Network tariffs on net withdrawal, the Market Operator’s fee per MWh bought and sold, and the shift of the price level all change which schedule is best. In a day that starts and ends empty, the energy delivered equals the efficiency times the energy bought, so each of them is exactly a fee per MWh bought:

fee = (1 − RTE) · (tariff on net withdrawal + level shift)
    + (1 + RTE) · market fee per MWh
    + tariff on all withdrawal                     from May 2037, or if the legacy treatment is lost

Each is converted to the library’s base-year hryvnias, and the library is read at that fee: the battery cycles less when it costs more. The tariffs and fees are then charged in cash on the actual volumes.

From the optimum to cash

captured   = 0.75 · max(margin, 0) + min(margin, 0)
fee        = 10% · max(captured, 0)
energy     × availability (95% in the first year, 97% after) × (1 − expected war downtime)

The realism factor stands for what perfect foresight overstates: bids are placed before prices are known, a 50 MW battery moves the evening price, and the state of charge has to be managed. In 2029 the base case earns €127k per MW with perfect foresight and €86k after the realism factor and the fee.

3. Battery

The usable AC energy of 100 MWh at the start needs 1.18445 times as much DC nameplate capacity: a state-of-charge window of 90% and the discharge losses. The battery fades with age and use (NREL BLAST-Lite, lithium iron phosphate at 25 °C):

state of health = 1 − 0.011 · years^0.526 − 1.55e-4 · EFC^0.828
EFC = 0.9 · energy delivered / usable energy at the start
  • Modules are added once, in the 121st month of operation: 15% of the original DC capacity at €86 per kWh (2026 prices, indexed). They age on their own curve; the old modules are not restored.
  • The power conversion system is overhauled after 144 months for €30k per MW.
  • A group of modules below 60% state of health is taken out of service.
  • Decommissioning costs €15 per kWh of usable energy, paid at the end; the battery has no residual value.

4. Investment

The investment is built from drivers rather than taken as one price: battery blocks per DC kWh, power conversion and the substation per MW, shares for balance of plant, the energy management system and the contractor’s margin, then the grid connection, a 110 kV line, protection against attacks, development, owner’s costs and a contingency. Without VAT, in 2026 prices:

1 h2 h4 h
DC nameplate, MWh59.2118.4236.9
EPC (turnkey)€12.70m€18.10m€28.90m
All-in€17.26m€23.10m€34.76m
Per kWh of usable energy€345€231€174
  • Inputs: battery blocks €75 per DC kWh; power conversion and MV €60k and the 110 kV substation €60k per MW; balance of plant 10.8%, controls 2.4%, margin 8.4%; protection €1.5m; owner’s costs 3% and contingency 5% of the EPC.
  • The connection fee (935 UAH per kW) and the line (5 km) are priced in hryvnias; the rest in euros. Payments follow the construction schedule and the month’s exchange rate.
  • Lithium-ion batteries and inverters are imported free of VAT and duty until 1 January 2029; transformers and everything else pay 20% VAT, refunded after 2 months.
  • A bay in Ukrenergo’s substation instead of the distribution network adds €0.44m.

5. Operating costs and grid

  • Maintenance €9 per kW a year; property insurance 0.4% of the replacement value; a guard post 52,000 UAH a month; company, accounting and asset management €120k a year; metering; land lease. Euro items rise with euro inflation, hryvnia items with Ukrainian inflation.
  • Market Operator fee 6.88 UAH per MWh bought and sold plus a monthly charge; the regulator’s levy of 0.061% of sales.
  • Network tariffs: transmission and dispatch 1,047.09 UAH per MWh in 2027 plus the class 1 distribution tariff of 628.37 UAH, both indexed. A storage plant in operation by 30 April 2028 pays them on its net withdrawal until 30 April 2037; afterwards the model charges them on everything it draws, until the regulator sets the method. A later start loses this treatment from the first day.
  • Public service surcharges announced from 2030 are not quantified: the checks mark them as outside the model.

6. War risk

The base case carries war risk as an expected loss rather than insurance, because cover for energy assets is scarce:

expected loss   = 8% market premium × 0.35 = 2.8% of the replacement value a year
chance of a hit = 2.8% / 40% damage = 7% a year
downtime        = 7% × 6 months / 12 = 3.5% of revenue

The expected loss is a monthly cost, deducted for tax. It is an estimate of average repair costs, not a forecast of a strike: the NPV of the expected cash flow is meaningful, but the IRR of the expected cash flow is not the expected IRR. With insurance switched on, a hypothetical policy replaces it: a premium of 8% a year, claims after a deductible of 5% (at least €0.25m) paid nine months later, and the state refund of the premium above 1% up to 5 million UAH a year.

7. Financing

  • Sources and uses. Investment, construction VAT, interest during construction, fees, the debt service reserve and a liquidity reserve are funded by equity first, then the loan; VAT refunds reduce the need. Construction follows the contract dates even if operation starts late.
  • Loan. Euros, 8.0% fixed all-in, an upfront fee of 1% and a commitment fee of 0.5% a year; 18 half-yearly instalments from 1 Aug 2028 to 1 Feb 2037.
  • Sizing. The lender looks at the low spread path with the lower library node and sculpts the repayments so that cash covers each instalment 1.75x; the loan never exceeds 60% of the investment and its balance never rises. Because the loan changes interest, fees, reserves and tax, sizing iterates until it moves by less than one cent. Stresses and the sensitivity keep the loan as signed.
  • Reserves and covenants. The reserve account holds the next instalment and is topped up from cash every month. Dividends need two full periods of debt service, a cover of at least 1.15x in the last two, a full reserve and no arrears; below 1.05x the loan is in default. A shortfall stays owed with interest.
  • Liquidity. Day-ahead buyers pay in advance; a reserve of three peak days of purchases plus the balance-responsibility guarantee covers that.

8. Taxes

  • Corporate income tax 18% on the result in hryvnias, after depreciation, interest and exchange differences on the euro loan and reserve; losses carried forward without limit.
  • Straight-line depreciation over the operating life, the same in the books and for tax; later additions over the rest of the life but not faster than five years. The optional two-year depreciation is left for a later version.
  • Annual returns for 2027 and 2028, quarterly from 2029, with the final payment for a year in March of the next.
  • Dividends are paid only from the taxed profit of closed years, so the advance tax on dividends never arises; 5% withholding tax applies under the German–Ukrainian treaty. Interest to the development bank is free of withholding tax.

9. Currency and cash out

  • EUR/UAH annual averages of 51.5 (2026), 54.6, 57.0 and 58.8 (2029), then 2.9% weaker a year; the stress adds 10% from 2028.
  • The National Bank lets a company transfer dividends of up to €1 million a month abroad. The model keeps this limit for the whole life and applies it to the return of capital when the company is wound up, paying out month by month after the model ends. A stress blocks that final transfer altogether.

10. Reserve contract (option)

Ukrenergo buys reserve capacity in special auctions: an award of 13 months to five years, paid for availability at a euro price per MW and hour. The price is fixed at the National Bank’s average rate of the auction month and paid in hryvnias at each month’s rate. Rounds for symmetric aFRR — automatic frequency restoration reserve, up and down — cleared at about €17–29 in 2024–2025; none was held in 2026. The calculator can add one award and, as a hypothesis, a second one after it. It is off in the base case. By default: 40 MW for the 2-hour battery (20 and 45 MW for 1 and 4 hours), €17 per MW-hour, 60 months from March 2028. This is a screen of expected cash flows, not a simulation of hourly operation.

What the award takes from the battery

σ_P = C · (1 + ρ + λ) / P                power: the command, the recovery margin, the standing load
σ_E = C · (h_up + h_down) / (u · P)         energy: full activation held h hours each way; u = usable hours
σ*  = max(σ_P, σ_E)                         the share of the battery the award takes
σ_a = 1 − σ* · Z − τ                        the share left for day-ahead trading

C is the award and P the battery’s power; ρ = 10% is power kept free to restore the energy stock, and h = 1 hour is the minimum full activation for aFRR. Z is the share of the award still in force: a hit ends the contract for the share hit (an option suspends it instead), and that share trades again after its repair. τ withholds one day in the months the stock is filled and sold. The revenue library is scaled by σ_a. With the default award the contract takes 88% of the battery; in 2029 17% is left for trading.

The award must fit on every day of service and on the days the stock is filled and sold, on the selected path and on the lender’s:

  • on the busiest day — activation 2 times the month’s average over a 25-hour day — the energy the reserve delivers and exports stays within its share of the daily warranty quota;
  • on that day, the energy bought or exported to keep the stock constant fits through the recovery margin;
  • the stock is bought on the last day before service and sold on the first day after it, within C · (1 + ρ) over a 23-hour day.

A failed check rejects the case instead of shrinking the award, and the calculator shows the largest award that passes every check: 45 MW for the base battery. After a full command, restoring the stock takes h / (RTE · ρ) = 11.8 hours up and RTE · h / ρ = 8.5 hours down; repeated commands beyond the stock are not modelled.

Money

  • Availability fee: price × the month’s exchange rate × awarded MW × hours × the share in service; invoiced with VAT and paid the next month.
  • Activation energy: 5% of the award per hour each way, of which 50% is left after up and down commands in the same hour cancel out. It is paid at the month’s day-ahead price level, because balanced hours are settled at the day-ahead price; an option uses the balancing prices of 2025. Claims on and debts to Ukrenergo offset within a month; a remaining claim is paid after 12 months.
  • Energy stock: bought before service, kept topped up at day-ahead prices with network charges and market fees, sold when the contract ends.
  • Security and cash: €30,000 per MW in escrow from the auction to the end of service, paid in by the owner; a liquidity reserve of 3 days of reserve purchases and balancing payables. A start up to 4 months late costs a 20% top-up, of which a quarter is kept each month; a later start cancels the award and the security is kept.
  • Penalties: 2 failures a year without wartime relief, each charged at 2 times the fee over 1 hour — an expected cost, not the rules’ look-back window. The certificate is renewed every 60 months for €15,000 (2026 prices).
  • VAT and tax: the contract’s VAT is tracked by source; penalties, the security kept and written-off claims reduce taxable profit — an assumption the calculator can switch off.

The loan

The lender splits the cash available for debt service into the contract’s share and the trading share. Each instalment may not exceed the contract’s cash divided by 1.35 plus the trading cash divided by 1.75, on the lender’s low case — without a second contract and with activation energy at day-ahead prices. The security is equity and does not count towards the debt share. With the default award the loan is €10.5m and the investor IRR −5.0%, NPV −€10.7m.

Break-even contract price

p* is the contract price at which the investor NPV at the hurdle is zero, with the loan sized again at every price. Every whole euro from €0 to €40 per MW-hour is calculated; between neighbouring prices whose NPVs have opposite signs, bisection narrows the price until the NPV is within €1 and the bracket within 0.001, and every root is checked by a fresh run. The price is then compared with the auction cap: 1,339.82 UAH per MW-hour for 2027, €25.08 at the auction month’s rate. For the base battery with the default award p* = €30.96: above the cap, so no bid could win it. The search runs on a grid of €1, so another crossing between grid points cannot be ruled out.

11. Results

  • Investor IRR and NPV in euros: share capital paid in against the dividends and capital actually transferred, after withholding tax; the NPV at the 15% hurdle on the day of financial close is the main measure. An IRR can be valid, ambiguous (several roots), not defined, or not shown because the company runs out of cash.
  • Project IRR and NPV before financing, with construction VAT and the liquidity reserve; the NPV at 10%.
  • Cover ratios: minimum and average DSCR on the selected path and on the lender’s case; LLCR at the start of operation.
  • LCOS: the present value of all costs including charging power, the optimiser’s fee and the expected war loss, divided by the present value of the energy delivered, at 10%.
  • Cash held in the company at each year end beyond the reserves.
  • With a contract: its lines in 2029 per MW, its share of the cash for debt service, the escrow and the liquidity reserve; LCOS counts the energy delivered on command. A case whose contract inputs lie outside the model, or which the battery cannot hold, shows its status and no figures.

12. Sensitivity and break-even

The tornado moves one driver at a time with the loan as signed: spreads ±20%, the realism factor 0.65 / 0.85, investment −10% / +11%, the expected war loss 1.6% / 4.0%, the interest rate ±1.5 points, a weaker hryvnia, the efficiency nodes, faster wear, own consumption and the tariff on all withdrawal from the start. The alternative cases change the battery or the market before investing and size the loan again.

With a contract, the tornado adds its own drivers: the price ±20%, activation 0 and 10%, netting 0 and 100%, 1.5 hours of full activation, a recovery margin of 25%, a peak day three times the average, 0 and 12 failures a year, a 720-hour penalty window, other loss of the contract 5% a year, a 2% balancing fee, the fee paid after four months, 90% of balancing claims collected, penalties not deductible and a standing load of 0.5%. A setting the battery cannot hold is reported as such, not as a number.

Break-even is the multiplier k on the spread path at which the investor NPV at the hurdle is zero, with the loan fixed: a scan from 0.5 to 3.0 in steps of 0.1, then bisection in the first bracket the library supports.

13. Checks and verification

Every run checks that the balance sheet balances each month, loan draws equal the loan, cash never turns negative, the loan is repaid with no arrears, the debt share holds, and the reserve account is topped up; it reports lock-ups, the transfer limit, thin capitalisation, written-off receivables and inputs outside the library. What the model does not cover — the tariff method after 2037, the public service surcharges, the final wording of the tax deadlines — is marked as such.

The library build reproduces six reference values of the optimiser to the hryvnia, among them 753,228 UAH per MW for a 2-hour battery in September 2026.

A second implementation of this methodology, written separately in Python from the written specification without the calculator’s code, was frozen before the two were compared. Across nine cases — the base case, the lender’s case, no loan, a three-month delay, insurance, the last 12 months’ prices, four hours, blocked transfers at the end and the high path — all 144 comparisons agree within the acceptance tolerances: the status and every root of each IRR, the NPVs, the loan, the cover ratios, LCOS, payback, break-even and the cash in the company at each year end. The investor’s cash flows agree date by date to within €51.

The contract was checked the same way: a separate implementation, written from the specification without the calculator’s code, on 54 cases — the default award, the late starts, both strike scenarios, the second contract, the cases the model must reject, and the break-even searches. Each difference was traced to its cause and corrected on the side that was wrong, in the calculator or in the second implementation, and recorded. Every field of every case was then compared, about one million values: the statuses, dates and events exactly, the contract’s own monthly flows to the cent or kopiyka, flows read from the revenue library within 0.1%, the loans within €35, the investor NPVs within €69 and the break-even prices within €0.0001 per MW-hour. With the contract on, each run also checks that activation energy balances, the energy stock and its cost close, the escrow and the claims settle, VAT reconciles, and the contract and trading cash add up.

14. Limitations

  • Day-ahead trading and, as an option, one special-auction contract for symmetric aFRR: no daily reserve auctions, balancing market, FCR, upward-only aFRR or intraday trading (next version).
  • The contract’s activation, netting, balancing prices and peak day are assumptions, not yet calibrated to Ukrenergo’s minute data; the 30% failure threshold and the certificate rules are not modelled.
  • Perfect foresight scaled by one realism factor; the schedule is historical, not a forecast of hourly trades.
  • One site; no portfolio effects, no correlation between sites.
  • War risk as an expected loss; no dated scenario of a strike.
  • No early closure: the battery runs its full life even where operation turns loss-making, as after the tariff change of 2037 on the low path; the owner does not inject cash, so such a case shows a cash shortfall.
  • The network tariff after April 2037 and the surcharges from 2030 are assumptions.
  • Currency restrictions are kept for the whole life; their end is not assumed.
  • Germany and the comparison of the two markets follow in the next version.
  • The battery is fictional and the results are illustrative.