Battery Storage Investment Calculator — Germany · Methodology
How the German battery storage model works
This page documents what the German calculator computes, in which order and with which formulas (specification revision v1.2 R2.4). 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. The Ukrainian model has its own methodology; section 14 sets the two side by side.
Illustrative calculation — not investment, tax or legal advice. Fictional case.
The base case at a glance
- Battery
- “Batteriespeicher Musterfeld”: 50 MW / 100 MWh of usable AC energy at the start of life (2 h), one site in Germany, connected to the 110 kV distribution grid
- Revenue
- A tolling contract for 80% of the battery’s power and energy, 84 months at €120,000 per tolled MW a year; day-ahead trading for the rest, and for the whole battery after the toll
- Timeline
- Financial close 1 Feb 2027 → 12 months of construction → commercial operation 1 Feb 2028 → 15 years of operation, the last month Jan 2043 → 3 months of settlement → liquidation payout 30 Apr 2044
- Company
- A German GmbH; its only shareholder is a German corporation
- Investment
- €38.3m without VAT (€765 per kW of grid connection)
- Debt
- A commercial bank’s loan at 5.60% fixed, 20 half-yearly payments, sized on the lender’s case: €17.8m (44% of the uses of funds without VAT)
- Result
- Investor IRR −3.0% in euros; NPV at 12% −€16.4m
- Break-even
- A toll of €229,486 per tolled MW a year, against €110,000–€150,000 quoted in the market for 2-hour batteries
1. What the model is
The calculator values one fictional battery in Germany. “Batteriespeicher Musterfeld” stands for no real place, and no real municipality is named. One project company, a GmbH, builds a 50 MW battery with 2 hours of storage, rents 80% of it to a toll buyer for 7 years and trades the rest on the day-ahead market. After the toll the whole battery trades.
It answers one question: what toll fee would the investor need? The answer is the break-even toll price T* — the fixed fee per MW a year at which the investor’s NPV at the hurdle rate is zero, with the loan sized again at every price (section 12). The first screen shows it next to the tolling offers quoted in the market for 2-hour batteries, €110,000–€150,000 per MW a year — a benchmark, not an offer.
- An honest result. Nothing is tuned to reach a target. The model is a scenario of the day-ahead market only: reserves (FCR, aFRR) and the intraday market, which gave German batteries most of their revenue in 2026, are left out, and the first screen says so. The market share and the years after the toll earn day-ahead margins only.
- Monthly and dated. The model runs month by month from financial close to the end of settlement. Operating cash moves at month ends; debt service and payouts fall on 1 February and 1 August, at the start of the month. IRR and NPV use exact dates with an Actual/365 day count, like XIRR and XNPV, and are discounted to financial close.
- Euros, real and nominal. Market prices are in real 2025 euros and most costs in 2026 prices; both become nominal with idxDE, the German harmonised index of consumer prices (section 8). The toll fee, the loan, the reserves and the investor are in nominal euros.
- No raw prices on the site. The revenue comes from a library computed in advance from published day-ahead prices. The site publishes only results derived from them.
- Checks, not hidden fixes. A failed check is shown, never smoothed over; inputs outside the model get a status instead of a number (section 15).
- Its own parameter set. The German model shares the optimiser, the price transformation, the wear model, the debt sculpting, the IRR and the break-even solver with the Ukrainian one, and nothing else. A parameter the German set does not define is an error — not a zero and not a Ukrainian value.
2. Calendar
| Event | Date | Model month |
|---|---|---|
| Financial close | 1 Feb 2027 | 1 |
| Commercial operation | 1 Feb 2028 | 13 |
| Tolling, 84 months | Feb 2028 – Jan 2035 | 13–96 |
| Last toll invoice paid | end of Feb 2035 | 97 |
| Debt service, 20 half-yearly payments | 1 Aug 2028 – 1 Feb 2038 | — |
| Augmentation | Feb 2038 | 133 |
| Overhaul of the power conversion system | Feb 2040 | 157 |
| Last month of operation | Jan 2043 | 192 |
| Settlement | Feb 2043 – Apr 2043 | 193–195 |
| Liquidation payout, outside the monthly book | 30 Apr 2044 | — |
- Construction takes 12 months and follows the contract dates. The loan draws, fees and reserves are tied to the contract start of operation, 1 Feb 2028.
- A delay of commercial operation (an input of 0 to 24 months) moves operation, wear, tax depreciation, the toll, augmentation, the overhaul, the end of life, settlement and the liquidation payout by the same number of months. Construction, the loan draws and the debt payment dates stay where they are. The toll runs from the actual start of operation — an assumption; termination of the contract and a long-stop date are outside the model, and so are the extra costs of a delay.
- A delay is a stress after financial close: the loan stays the one sized on the contract dates, and the late battery has to service it. Sized afresh on its own lender’s case, a late battery would get a smaller loan, or none — the first payment date stays 1 Aug 2028, and a half-year without operating cash cannot carry interest. The calculator therefore sizes the loan without the delay and runs the delay on it, for the break-even toll price and the alternative cases too.
- A start after 4 Aug 2029 ends the grid-fee exemption scenario (section 7).
3. Prices and the revenue library
The battery trades on the day-ahead prices of the German–Luxembourg bidding zone, published by the Bundesnetzagentur on SMARD.de and served by Energy-Charts (Fraunhofer ISE) under CC BY 4.0. There are two price years: 1 Jan 2025 to 31 Dec 2025, the anchor, and the 12 months from 1 Oct 2025 to 30 Sep 2026, a sensitivity. Their average prices are €89.32 and €104.05 per MWh.
Hourly comparable prices. Since 1 October 2025 the day-ahead market trades quarter-hours. The model averages the four quarter-hours of each hour (by UTC) to one hourly price, so both price years compare. Days run in German local time and so have 23, 24 or 25 hours. The cost of this choice is disclosed: in January–September 2026 quarter-hour prices gave a 4.8% larger daily spread than their hourly averages.
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, the same as in the Ukrainian model:
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, own consumption inside RTE
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 · PAvailability is applied later, in the engine. Ties are broken towards less discharge, so the battery does not wear itself out for nothing. The library holds monthly sums of sales, purchases, energy bought and energy sold, plus the peak purchases of a day — 49 numbers each — for 3,828 combinations: two price years, durations of 2 and 4 hours, usable energy on a grid of 0.1 hour as the battery fades (1.2–2.1 hours for 2 hours, 2.4–4.2 hours for 4 hours), efficiency nodes of 85, 88 and 90%, cycle limits of 1.0 and 1.5 a day, and an effective fee per MWh bought from −€15 to €35 in steps of €5 (section 4).
The calculator interpolates linearly between usable-energy nodes. Between fee nodes it takes, month by month, the better of the two neighbouring schedules: the one with more sales − purchases − fee × energy bought at the actual fee. The lender’s case reads the usable-energy node at or below the battery’s state instead of interpolating. Nothing is extrapolated: an input outside the grid is reported, not clamped.
Before release, every midpoint between nodes is solved exactly and compared with the interpolation — the midpoints of the usable-energy axis at fees of −€15, €10 and €35, and the midpoints of the fee axis at full energy, for every duration, cycle limit, efficiency node and price year (1,212 checks). The largest error is 0.09% of a year’s value along the usable-energy axis and 0.08% along the fee axis (0.17% and 0.88% for a single month), within the release limits of 0.5% for a year and 1.5% for a month. A month’s error is measured against the largest of its exact value, 5% of the average month and €1.
The build also reproduces the optimiser’s reference values for German 2025 prices — €42,911, €79,766 and €134,416 per MW a year for 1, 2 and 4 hours, at 90% efficiency and at most one cycle a day — which independent implementations had computed before.
4. Revenue of the market share
While the toll runs the owner trades 20% of the battery’s power and energy; afterwards all of it. Future prices are the historical ones with their spreads scaled around a level that is held:
p_future(y) = L(y) + M(y) · (p_hist − L̄) real 2025 euros L(y) = L̄ the price year’s average, held M(y) = k · m(y) · n_snap
- L̄ is the average hourly price of the price year. The model takes no view on future price levels — an assumption. The 12 months to September 2026 are not deflated, so with them the model trades synthetic 2025 prices.
- n_snap brings the later price year to the 2025 spread: 1 for 2025; for the 12 months to September 2026 the ratio of the two years’ TB2 — the yearly sum, per MW, of each day’s spread between its two dearest and two cheapest hours: €84,737.51 / €97,716.57 = 0.8671765.
- k scales the spreads of every year on top of the path: 1 in the base case; the tornado moves it by −20% / +20%, and the break-even search without a toll solves for it (section 12).
- m(y) follows one of three spread paths:
| Path | 2028 | 2029 | 2030 | 2031 on |
|---|---|---|---|---|
| Reference | 1.000 | 1.000 | 1.000 | 1.000 |
| Low | 0.850 | 0.750 | 0.650 | 0.600 |
| High | 1.185 | 1.123 | 1.062 | 1.000 |
The paths are declared assumptions, not forecasts: no public annual path of day-ahead spreads exists. The reference path holds the 2025 spreads. The low path — the lender’s view — compresses them to 60% by 2031 as more batteries enter the market. The high path starts 2028 at the level of January–September 2026 against the same months of 2025 and returns to the 2025 level by 2031. No probabilities are attached. Nominal values multiply by idxDE(y): 1.077 in 2028, 1.449 in 2043.
The effective fee
a(y) = L(y) − M(y) · L̄ level shift, real 2025 euros importFee = (1 − RTE) · a(y) / M(y) + (1 + RTE) · fExchange / (idxDE(y) · M(y)) S = M · S_hist + a · O P = M · P_hist + a · I O, I: energy sold and bought
Scaling the spreads around a held level shifts every price by a. In a day that starts and ends empty the battery sells RTE times the energy it buys, so the shift costs (1 − RTE) · a per MWh bought: to the optimiser it is a fee, and divided by M it is in the units of the historical prices the library was solved on. The library is read at that fee — when it is positive the battery cycles less. The fee only chooses the schedule; the money is the transformed sales S and purchases P. The exchange fee fExchange is 0: it is inside the optimiser’s share (an assumption). So importFee = (1 − RTE) · L̄ · (1 − M) / M: €8.93 per MWh on the low path from 2031 (M = 0.60), zero on the reference path, and −€2.09 on the high path in 2028. There is no floor; a fee outside the library’s axis gives the case a status, not a number.
From the optimum to cash
margin = (S − P) · idxDE(y) · (1 − s) · availability nominal euros captured = 0.75 · max(margin, 0) + min(margin, 0) fee = 10% · max(captured, 0) revenue = captured − fee
- The realism factor of 0.75 stands for what perfect foresight overstates: bids go in before prices are known, and forecasts miss. It is a share of the perfect-foresight value before fees; availability is counted separately. No study calibrates it for German day-ahead trading alone; on the continuous intraday market a forecast-driven strategy earned 11% less than perfect foresight. The factor and its tornado range of 0.65–0.85 are assumptions. A loss is never scaled down.
- The optimiser keeps 10% of the positive captured margin of the market share and nothing on the toll share.
- Availability is 95% in the first 12 months of operation and 97% after. A future month takes the sums of the same calendar month of the price year as they are, without correcting for the number of days — an assumption.
- Exchange trades settle in the same month (an assumption). Trades between energy resellers fall under the reverse charge (§13b UStG), so they carry no VAT in cash.
In 2029, the first full year, per MW of grid connection in nominal euros:
| 2029 | € per MW |
|---|---|
| Sales of the market share (20% of the battery) | €30,239 |
| Purchases (charging) | −€12,564 |
| Perfect-foresight margin | €17,675 |
| Realism factor | −€4,419 |
| Optimiser’s fee | −€1,326 |
| Market revenue | €11,931 |
| Toll fee earned | €96,000 |
| Revenue | €107,931 |
5. Tolling contract
A toll buyer rents a share s of the battery’s power and energy for a fixed fee and trades it at its own risk. Both shares are alike: each has the battery’s ratio of energy to power. The base contract: 80% for 84 months from the actual start of operation, at €120,000 per tolled MW a year for a 2-hour battery and €150,000 for 4 hours — nominal, fixed, without indexation and without VAT. Toll prices on this page, T* included, are per tolled MW a year. Tolling deals cover 70–100% of a battery. The terms are assumptions: the 2-hour price lies inside the €110,000–€150,000 quoted in the market, no public 4-hour deal exists, and no public deal discloses an indexation.
toll fee = s · P · tollPrice / 12 · availability factor · capacity factor accrued monthly availability factor = min(1; availability / 0.95) capacity factor = min(1; usable energy / contract curve)
- Availability at or above the guaranteed 95% leaves the fee whole, so availability is not counted twice.
- The contract curve is the usable energy the whole battery would keep if it were cycled 1.5 times a day of its current usable energy from the actual start of operation, at the base availability, without faster wear and with augmentation on schedule. It is computed once, before the case. Below the curve the fee falls; the model checks this every month instead of assuming it. In the base case the battery stays at or above the curve and the fee is paid in full in every month.
- The toll buyer’s energy wears the battery. It cycles 1.5 times a day of the current usable energy of its share — a contractual limit that does not change with the market’s cycle limit. The lender’s case wears the toll share the same way.
energy delivered = s · usable energy · 1.5 · days · availability toll buyer
+ (1 − s) · O · availability market share (O from the library)- Money. A month’s invoice is paid at the end of the next month; the last one, for Jan 2035, arrives in Feb 2035, when the toll no longer runs. The invoice carries 19% VAT, which the buyer pays with it and the owner passes on in the same month: no cash effect.
- Who pays what. The buyer pays the charging energy, the exchange fees and the losses of its share. The owner pays the AgNes grid fee on the whole connection, maintenance, insurance, the land lease, metering, management, the decommissioning guarantee and the charges on own consumption.
- Not modelled: the buyer’s credit risk, efficiency penalties, termination, a floor price and indexation.
6. Battery
The usable AC energy of 100 MWh at the start needs 1.1844484 times as much DC nameplate capacity — a state-of-charge window of 90% and the discharge losses, computed exactly — 118.4 MWh DC for 2 hours. Round-trip efficiency, from AC to AC with own consumption inside, takes one of the library’s nodes — 85, 88 or 90%; the base case takes 85%. The market share may discharge at most 1.5 times the usable energy at the start of life a day (the warranty), or 1.0 as an option. Availability is 95% in the first year and 97% after.
The battery fades with age and use, after NREL’s BLAST-Lite model for lithium iron phosphate, as in Ukraine:
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 per module group faster wear = both terms × 1.3 a sensitivity
- Each month’s delivered energy — the market’s and the toll buyer’s — is shared among the module groups in proportion to their usable energy. A group below 60% state of health is taken out of service.
- Modules are added once, in the 121st month of operation (Feb 2038): 15% of the original DC nameplate capacity at €86 per kWh DC in 2026 prices, indexed. They age on their own curve; the old modules are not restored.
- The power conversion system is overhauled in the 145th month (Feb 2040) for €30,000 per MW in 2026 prices, indexed.
- Decommissioning costs a net €10 per kWh of usable energy at the start of life in 2026 prices, indexed; under the EU Batteries Regulation the producer takes the batteries back. It is paid in the last settlement month, without a provision. The battery has no value after its 15 years.
7. Grid and fees
- Grid fees. None in 2028 under the current law. From 1 January 2029 the model charges the capacity fee of AgNes, the Bundesnetzagentur’s draft determination: €5,000 per MW a year on the full 50 MW connection, in 2029 money and indexed with idxDE from 2030, in equal monthly parts and not before operation starts — €250,000 in 2029. It does not change the dispatch. AgNes is a draft without a final decision; the tornado tests 0 and €7,000.
- Grid-fee exemption (a switch, off in the base case). Under §118(6) EnWG a storage plant keeps its exemption from grid fees for 20 years from commissioning if it starts by 4 Aug 2029. Under the draft it keeps it only if the final investment decision was taken before AgNes is announced (planned for 1 January 2027) and binding orders for at least half of the investment are proven by 31 March 2027. The model’s financial close does not count as that decision. With the switch on, grid fees are zero for the whole life; a start after 4 Aug 2029 loses it, and a check says so. The dynamic grid tariffs planned for 2030–2033 are not modelled.
- Grid connection contribution (Baukostenzuschuss, BKZ): €135 per kW of withdrawal capacity — €6.75m for 50 MW — part of the investment, paid 50% in month 1, 30% in month 3 and 20% in month 12 of construction. It is an assumption within the network operators’ published 2026 prices of €91–163 per kW, until an operator makes an offer; the standardisation of contributions from 2027 is not considered.
- Electricity tax and levies on storage. No electricity tax on charging (§5(4) StromStG, when the law’s conditions are met). No KWKG, offshore or §19 StromNEV levy on energy stored and fed back (§21 EnFG).
- Charges on own consumption: €2,000 per MW a year in 2026 prices, indexed — the electricity tax, the KWKG, offshore and §19 levies and the grid tariff on the auxiliary power, an estimate. The auxiliary energy itself is inside the efficiency.
- War risk, the hryvnia and the Ukrainian network tariffs and market fees do not apply in Germany.
8. Costs
The investment is built from lines in 2026 prices, without VAT and without escalation to the purchase date — an assumption. Per kW of grid connection:
| Line | 2 h | 4 h | Tax depreciation |
|---|---|---|---|
| Battery blocks: €75 per kWh DC × 1.1844484 × hours | 177.67 | 355.33 | Battery, 15 years |
| Power conversion, energy management and medium voltage | 70.00 | 70.00 | Power conversion, 20 years |
| Balance of plant and EPC | 100.00 | 150.00 | Allocated |
| 110 kV substation and line | 100.00 | 100.00 | Substation, 20 years |
| Grid connection contribution (BKZ) | 135.00 | 135.00 | BKZ, 20 years |
| Development | 160.00 | 180.00 | Allocated |
| Contingency: 5% of battery blocks, power conversion, balance of plant and substation | 22.38 | 33.77 | Allocated |
| Total, € per kW | 765.05 | 1,024.10 | |
| Total | €38.25m | €51.21m |
- Modo Energy’s benchmark for batteries commissioned in 2026 is about €700 per kW for 2 hours and €935 for 4 hours. The model is not tuned to it; the tornado tests the investment at −10% and +11%, and the development line, an unverified estimate, at −50% and +50%.
- Payments: battery blocks, power conversion, balance of plant, substation and contingency 20% in month 1, 50% in equal parts over months 4–9 and 30% in month 12 of construction; development in month 1; the BKZ as in section 7.
- VAT of 19% is paid on every investment line, the augmentation and the overhaul, and refunded 2 months later — an assumption, since the law sets no date. VAT on operating costs and decommissioning is deducted in the same month: no cash effect.
Operating costs, from the actual start of operation, in 2026 prices indexed with idxDE, in equal monthly parts:
- Full-service maintenance €10,000 per MW a year for 2 hours, €16,000 for 4 hours.
- Property insurance 0.5% a year of the insured value — battery blocks, power conversion, balance of plant, substation and contingency in 2026 prices (€23.5m for 2 hours), indexed. Augmentation and the overhaul do not change it.
- Land lease €25,000 per hectare a year: 1 ha for 2 hours, 1.5 ha for 4 hours. Metering €3,500 a year for one metering point. Company management, accounting and audit €150,000 a year.
- A bank guarantee for decommissioning (Aval) at 1.25% a year of its amount, which equals the decommissioning estimate — €1.0m in 2026 prices for 2 hours.
- The charges on own consumption and, from 2029, the AgNes fee (section 7); the optimiser’s fee (section 4).
- Land lease and company costs during construction are part of the development line — an assumption. In 2029 the operating costs other than the optimiser’s fee come to €24,396 per MW.
idxDE is German HICP inflation: 2.9% in 2026, 2.7% in 2027 and 1.9% in 2028, as the Bundesbank projected in June 2026, then 2.0% a year — an extrapolation, not a forecast.
9. Taxes of the GmbH
One set of books: the accounts are the tax base — an assumption. The tax year is the calendar year from 2027. All sites and the seat are in one municipality, so the trade tax is not split between municipalities.
EBT = EBITDA − tax depreciation − interest − decommissioning accruals add-back = 25% · max(0; interest + 50% · land lease − €200,000) §8 Nr. 1 GewStG trade income = EBT + add-back − trade-tax losses used trade tax = trade income · 3.5% · Hebesatz Hebesatz 400% corporate = (EBT − corporate-tax losses used) · rate(y) solidarity = 5.5% · corporate
- The corporate income tax rate falls under §23 KStG: 15% until 2027, 14% in 2028, 13% in 2029, 12% in 2030, 11% in 2031 and 10% from 2032. The Hebesatz of 400% is an assumption for the fictional municipality; the legal minimum is 280% from 2027. There are no movable leases to add back.
- Losses sit in separate pools. Corporate income tax: up to €1m of a year’s profit is offset in full, above that 70% until 2027 and 60% from 2028 (§10d(2) EStG). Trade tax: €1m in full, above that 60% (§10a GewStG). Losses are not carried back — an assumption; a loss in the final year is lost.
- Interest barrier: the exemption of §4h(2) a) EStG holds only while the year’s net interest is below €3m. At €3m or more a check marks the tax as incomplete. The base case’s largest year has €0.9m.
- No rounding: §11(1) GewStG rounds the trade income down to whole €100, the model does not. Rounding would move the tax by less than €14 a year at a Hebesatz of 400%, but it makes tax a step function of the loan and the toll price: the debt sizing could not converge to a cent, and a break-even price with an NPV within €1 of zero might not exist.
Tax depreciation (AfA)
| Class | Life | What it holds |
|---|---|---|
| Battery | 15 years | Battery blocks and augmentation, after the energy-industry depreciation table; the general table gives 10 years, a contested alternative and a switch. |
| Power conversion | 20 years | Power conversion, energy management, medium voltage and the overhaul; the energy-industry table for converters (19 in the general table). |
| Substation and line | 20 years | The 110 kV substation and line — an assumption. |
| BKZ | 20 years | The grid connection contribution, a right of use whose classification is not settled — an assumption. |
- Balance of plant, contingency, development, interest during construction and the bank’s fees are allocated to the battery, power conversion and substation classes in proportion to their direct cost; the BKZ gets no share — an assumption.
- Straight line, month by month from the month operation starts — 11 twelfths of a year in 2028; augmentation and the overhaul from their own month over their class’s life. What remains in every class is written off in the last month of operation, Jan 2043.
- No declining-balance depreciation: §7(2) EStG allows it for assets acquired or completed between 1 Jul 2025 and 31 Dec 2027; for a battery that starts operating in 2028, acquisition or completion inside that window is not shown.
When tax is paid
- The year’s tax is an expense in December and a liability until paid. Prepayments are a quarter of the year’s tax each, with perfect foresight and no true-up — an assumption: corporate tax and solidarity surcharge in March, June, September and December (due on the 10th), trade tax in February, May, August and November (due on the 15th). The cash leaves at the end of those months, like all operating cash. A year without tax has no prepayments and no refunds.
- The final tax year — the year of the last settlement month, 2043 in the base case — is recognised and paid in full in that month, without prepayments.
- For the project IRR the tax is computed again without interest, fees and capitalised interest, not taken from the case with a loan.
- The shareholder’s taxes are outside the model: it is a German corporation (§8b KStG).
10. Financing
Sources and uses
uses = investment + its VAT + interest during construction + arrangement fee + commitment fee
+ initial debt service reserve + liquidity reserve + working capital at the start of operation
sources = equity + loan draws + VAT refunds up to the contract start of operation- Equity is drawn first, then the loan. The owner pays in €25,000 of share capital (Stammkapital) in the first month and the rest as capital reserve.
- Working capital is one month’s toll fee, s · P · tollPrice / 12 = €400,000, kept as free cash: the first invoice is paid a month late while costs and tax prepayments already run — an assumption.
- The uses of funds without VAT come to €40.5m in the base case.
The loan
- A commercial bank’s senior loan in euros, without recourse: 5.60% fixed all-in — a 10-year swap rate of about 3.6% plus a margin of 2.00%, an assumption — on a 30/360 basis. 20 half-yearly payments from 1 Aug 2028 to 1 Feb 2038; a variant has 30, to 1 Feb 2043.
- Interest during construction accrues at the loan rate on the drawn balance at the start of each month and is capitalised. Interest from the contract start of operation to 1 Aug 2028 is paid in cash on that date.
- An arrangement fee of 1.5% of the loan at financial close and a commitment fee of 0.5% a year on the undrawn amount until the contract start of operation.
Sizing on two buckets
The bank sizes the loan on its own case: the low spread path, the lower node of the library’s usable-energy axis, the toll as signed with the buyer cycling 1.5 times a day, and the base values for everything else. It splits the cash available for debt service (CFADS) of each half-year j into a contracted and a market bucket:
C_j = Σ months of j [ toll receipts − s · shared costs − w_C(y) · taxes paid ] contracted M_j = CFADS_j − C_j market B_j = max(0; max(C_j, 0) / 1.15 + max(M_j, 0) / 2.0 − max(−C_j, 0) − max(−M_j, 0)) budget shared costs = maintenance + insurance + lease + metering + management + guarantee + own-consumption charges + AgNes w_C(y) = max(EBITDA_C; 0) / (max(EBITDA_C; 0) + max(EBITDA_M; 0)) EBITDA_C = toll fee accrued − s · shared costs; EBITDA_M = EBITDA − EBITDA_C
- CFADS is the company’s operating cash after tax and after the planned lifecycle costs, before debt service; interest is not deducted. Lifecycle costs and the market’s purchases sit in bucket M. The toll is covered 1.15 times, the market 2.0 times, and a negative bucket is subtracted in full. A check confirms C + M = CFADS in every month and period.
- Taxes are split by the year’s weight w_C; when both EBITDA parts are zero or less, w_C is the share of toll months in the year times s — an assumption. After the toll ends, bucket C keeps the last invoice and the toll’s share of that year’s taxes; from the next year it is zero.
- Repayments are sculpted to the budgets. Going back from maturity, the balance a period carries is capped so that the period’s budget covers its interest — the balance never rises — and the loan is the largest opening balance the budgets repay. It is at most 80% of the uses without VAT; if that cap binds, the profile is scaled down.
- The loan changes interest, fees, reserves and tax, so the sizing iterates — damped by 50%, up to 100 steps — until the loan and its first payment move by less than €0.01. The undamped solution is then locked.
In the base case the loan is €17.8m, 44% of the uses without VAT. The lowest cover is 1.20x on the base case and 1.15x on the lender’s case; the LLCR is 1.42x. After the toll the lender’s case has half-years with no budget at all, and a balance cannot run into a half-year that cannot pay its interest. The loan is therefore repaid by 1 Aug 2035, and the last 5 payment dates carry nothing.
Reserves
- The debt service reserve account is funded at the contract start of operation with the amount of the first payment, €1.35m in the base case. After each payment it holds the next contractual payment: a surplus is released, a shortfall topped up from free cash. It is released with the last payment. Euros, no interest.
- The exchange’s collateral and the daily liquidity of trading are covered by a liquidity reserve of 3 days of the dearest purchases — an assumption, with the formula of the Ukrainian model without its currency and guarantee terms:
liquidity reserve = 3 · [M · peak day purchases + max(0; a) · I_max] · idxDE · (1 − s) I_max = cycle limit · duration · P / RTE the largest daily purchase of energy
Peak day purchases are the largest daily purchases of the whole battery in the library at full energy and zero fee, in real 2025 euros: €26,023 for 50 MW; I_max is 176.5 MWh. The reserve is funded at the contract start of operation with the values of 2028 and s = 80% — €16,814 in the base case, as only 20% of the battery trades. In the first month after the toll it is topped up to the same formula with that month’s values and s = 0 — €96,571 — from free cash, and nothing is paid out until it is full. It is released in the last settlement month.
Debt service and covenants
- Debt service falls on 1 February and 1 August and is paid from cash first, then from the reserve account. An unpaid amount is capitalised, carries interest at the loan rate and is paid first; nothing is paid out while it is owed, and there is no acceleration.
- Cover (DSCR) is the cash available for debt service over the six months to a payment divided by the contractual payment — interest on the scheduled balance plus the scheduled principal. Interest on the actual balance is booked separately.
- Payouts need two full periods, a first payout not before 1 Feb 2029, a cover of at least 1.10x in the last two periods, a full reserve account and no arrears. Below 1.00x the loan is in default: a red check, without acceleration.
The loan as signed
Stresses and the tornado keep the loan sized for the case at financial close. Fixed: the amount, the scheduled principal on each date and with it the scheduled balance, the initial debt service reserve actually funded, and the liquidity reserve at the start of operation. Computed again in every run: the contractual interest and payments at the case’s own rate — the rate stress of −1.5 pp / +1.5 pp changes them —, the reserve targets after each payment, the monthly draws (equity first: when the investment rises, the draws move but the loan stays), interest during construction, the commitment fee, the arrangement fee (1.5% of the same loan), working capital from the case’s toll price, and the uses of funds. If the funded initial reserve is below the case’s first contractual payment, the difference is topped up from free cash in the month operation starts; if it is above, the excess returns to cash on the first payment date.
11. Payouts to the owner
Payouts fall on 1 February and 1 August, after debt service and the reserve account, under the conditions of section 10 while the loan runs. Without a loan, and once it is repaid, they need none of them; without a loan they start on 1 Aug 2028. Each payout is the smaller of two limits:
payout_t = min( max(0; free cash at the start of the month − H_t);
max(0; book net assets_t − share capital) )
book net assets = share capital + capital reserve paid in + Σ net income − Σ payouts closed months
H_t = max(0; max over τ from t to the last settlement month of −Σ_{j=t..τ} f_j)
f_j = CFADS_j − planned reserve top-up_j − [j > t] · DSRA target_j- Capital maintenance. A payout never takes the company’s net assets below its share capital (§30 GmbHG). It reduces the capital reserve first, then retained earnings — an assumption. Book net assets count closed months; the year’s tax enters in December.
- The liquidity forecast H_t keeps the cash the company’s plan still needs. It is the smallest balance that keeps the planned cash at or above zero in every month to the last settlement month if nothing more is paid out. It counts the monthly CFADS — operations after tax, with augmentation, the overhaul, their VAT and its refund, and decommissioning —, the planned top-up of the liquidity reserve after the toll, and at each later payment date the reserve target after it — with a full reserve account, that is what the payment and the top-up of the reserve take from cash. Releases of reserves at the end are not counted.
- Why. §15b(5) InsO prohibits payments to shareholders that must lead to insolvency, where the managing directors could have recognised this with due care. The law prescribes neither this formula nor a horizon: the forecast to the end of the case is an assumption of the model, and a monthly forecast is a convention, not a legal assessment of solvency. The lifecycle costs are planned from the first day, so the company keeps cash for them; the 24-month horizon of §18(2) InsO concerns imminent insolvency. Without the forecast, payouts on 1 February took the cash that augmentation, the overhaul and decommissioning needed months later; horizons of 6, 12 and 24 months still left cases short of cash.
- Liquidation. After settlement, all remaining cash — after taxes and decommissioning — is paid out on 30 Apr 2044, a year after the liquidation starts (Sperrjahr, §73 GmbHG): a dated cash flow of the investor outside the monthly book. With a delay it moves to the last day of the month twelve months after the last settlement month.
- If obligations remain. In the last month, released reserves and cash first repay the loan and interest. Whatever remains — debt, interest or negative cash — stays in the book as it is: no money is created and no debt written off. A case is settled only if at the end there is no debt, no interest and no cash below −€0.01; otherwise the liquidation payout is zero. The investor IRR is then not shown, and neither when cash falls below −€0.01 in any month; the NPV stays, marked.
In the base case the first payout is on 1 Feb 2029. On 8 of the 29 payout dates from then on, the forecast holds cash back, ahead of the augmentation in 2038, the overhaul in 2040 and decommissioning in 2043. The owner pays in €24.3m and receives €18.3m in payouts plus €96,571 at liquidation.
12. Results and break-even
- Investor IRR and NPV: capital paid in against the payouts and the liquidation payout. The NPV at the hurdle — 12% with a toll, 15% without one — discounted to financial close is the main measure: it exists even where an IRR does not. An IRR is valid, ambiguous (several roots), not defined, or not shown because cash runs short. Base case: −3.0% and −€16.4m; the same battery without a loan −1.0%.
- Project IRR and NPV: before financing, before and after tax, with the tax computed again without interest, with construction VAT and its refunds and the project’s own liquidity reserve; the NPV at 8% with a toll and 10% without. The project’s cash flow ends with decommissioning, an outflow, so it changes sign twice and can have two IRRs. The second lies at a deeply negative rate and means nothing economically, but the model reports both roots rather than choose one, and the NPV is the measure. Base case: −66.7% and 0.5% before tax, −66.7% and −1.0% after; NPV −€14.8m.
- Cover ratios: minimum and average DSCR on the case and on the lender’s case, over periods with a payment; the LLCR is the monthly CFADS from the start of operation to the last payment date, discounted at the loan rate, over the loan.
- Debt share: the loan over the uses of funds without VAT.
- LCOS of the whole battery as if it traded alone on the chosen path, the toll left out: the present value of the investment without VAT, augmentation, the overhaul, operating costs, AgNes, the charges on own consumption, the optimiser’s fee, charging energy and decommissioning, over the present value of the AC energy delivered, at the project rate from financial close. The realism factor is not a cost. Base case: €210 per MWh.
- Revenue 2029 per MW: the company’s revenue in the first full year — the toll fee earned plus the market revenue after the realism factor and the optimiser’s fee — per MW of grid connection, nominal: €107,931.
- Payback: years from financial close until the investor’s cumulative cash flow first turns positive; the base case never gets there.
The break-even toll price T*
T* is the toll price at which the investor NPV at the hurdle is zero. Each price is a full case: the lender’s case, the loan sized again, taxes and payouts. A price is supported when the run completes and the NPV is defined; it is funded when cash never runs short — a supported price with a shortfall keeps its NPV, marked. A price at which the loan cannot be sized is not supported.
- A grid of 21 prices: €0, €25,000 … €500,000 per MW a year.
- Brackets only between neighbouring supported prices: an unsupported price is never stepped over. A supported price with an NPV within €1 of zero is a root.
- Between neighbours with opposite signs, neither a root, bisection up to 60 times: the midpoint replaces the end with the same sign, an NPV of exactly zero counting as positive. It converges when the midpoint’s NPV is within €1 of zero and the bracket is at most €1 wide; it stops as stagnated, at an unsupported midpoint, or at the cap.
- Every root is checked by a fresh full run, and rejected if it fails. Every bracket with a change of sign is searched, not only the first. Coverage is complete when all 21 prices are supported.
| Outcome | When — the first that applies |
|---|---|
| Unsupported | The inputs lie outside the model, or no price is supported |
| Below the range | €0 is supported, funded and has an NPV of zero or more |
| Found | At least one verified root: the smallest is shown, with its funded flag |
| Refinement failed | No root, and a bracket stagnated, hit the cap, met an unsupported midpoint or failed verification |
| Unresolved | No root, and some prices are not supported |
| Above the range | No root, all prices supported, every NPV below zero: above €500,000 |
| Below the range | No root, all prices supported, every NPV zero or more |
For the base case T* = €229,486 per tolled MW a year, with complete coverage: all 21 prices are supported. The root lies between €225,000 and €250,000 and took 17 bisections. Against the €120,000 in the contract, the investor would need a toll 91% higher.
Without a toll: the break-even spread multiplier k
The day-ahead-only case has no loan and a hurdle of 15%. Its break-even is the multiplier k on the spread path at which the investor NPV is zero: points k = 0.5, 0.6 … 3.0, a point outside the library skipped; the first pair of neighbouring supported points whose NPVs have opposite signs or touch zero is bisected — at most 40 steps, until the bracket is narrower than 10⁻⁵; a midpoint outside the library stops it, and the value is the bracket’s midpoint. Statuses: found; not reached, when the sign never changes; below the library, when the first supported point lies above 0.5 and its NPV is already positive; unsupported. Unlike T*, unsupported points are stepped over, as in the Ukrainian calculator. For the base battery without a toll, k = 2.86: spreads would have to be 2.86 times the reference path.
Why the break-even price is above the market
Four reasons, named rather than measured:
- No reserves (FCR, aFRR) and no intraday trading, which gave German batteries most of their revenue in 2026: the market share and the years after the toll trade day-ahead only.
- A loan that amortises fully over 10 years and is sized on the low spread path, instead of the usual 7-year mini-perm with 70–80% debt: the base loan is 44% of the uses.
- Investment of €765 per kW for 2 hours, against about €700 in Modo Energy’s benchmark.
- A life of 15 years, with no value after it.
13. Sensitivity and variants
The tornado moves one driver at a time with the loan as signed (section 10). The measure is the investor NPV at the hurdle, which exists in every supported case; the base case’s is −€16.4m. Drivers in order of their swing:
| Driver | Low setting | High setting | NPV, low | NPV, high |
|---|---|---|---|---|
| Grid contribution | 0 | €165/kW | −€10.2m | −€17.8m |
| Development cost | −50% | +50% | −€12.7m | −€20.2m |
| Investment cost | −10% | +11% | −€13.5m | −€19.6m |
| Spreads | −20% | +20% | −€18.6m | −€14.5m |
| AgNes fee | 0 | €7,000 | −€15.1m | −€16.9m |
| Toll price | × 110/120 | — | −€17.6m | — |
| Realism factor | 0.65 | 0.85 | −€17.6m | −€15.3m |
| Faster wear | — | × 1.3 | — | −€17.1m |
| Availability | — | 93% | — | −€17.1m |
| Interest rate | −1.5 pp | +1.5 pp | −€15.8m | −€17.0m |
| Battery tax life | — | 10 years | — | −€15.9m |
| Efficiency node | 88% | 90% | −€16.2m | −€16.0m |
- Spreads move the multiplier k; the investment moves every line but the BKZ; development moves its line alone.
- The toll price falls to 110/120 of the base — €110,000 for 2 hours, the bottom of the market quotes, and €137,500 for 4 hours.
- Faster wear lowers the toll fee through the capacity factor, and an availability of 93% in every year, the first included, through the availability factor.
- A setting the model cannot calculate is shown as its status, not as a number.
The variants change the battery or the market before investing, and the loan is sized again. A 4-hour battery brings its own maintenance, construction, development, land and toll price (€150,000).
| Case | Investor IRR | NPV at hurdle | Hurdle | Loan |
|---|---|---|---|---|
| Base case | −3.0% | −€16.4m | 12% | €17.8m |
| 4-hour battery | −0.8% | −€20.7m | 12% | €23.3m |
| 1-hour battery | inputs outside the model | — | 12% | — |
| Low spread path | −24.2% | −€20.9m | 12% | €17.8m |
| High spread path | −2.9% | −€16.3m | 12% | €17.8m |
| Prices of the last 12 months | −4.1% | −€17.0m | 12% | €17.7m |
| No loan | −1.0% | −€18.9m | 12% | no loan |
| Day-ahead only, no loan | −6.0% | −€27.7m | 15% | no loan |
| Grid-fee exemption kept | −1.3% | −€14.8m | 12% | €19.0m |
| 15-year loan | −3.0% | −€16.4m | 12% | €17.8m |
The 15-year loan gives the base case’s result: the lender’s case has no budget after the toll, so the loan is repaid by 1 Aug 2035 with either term (section 10).
14. Germany against Ukraine
Fixed rows, without a switch. The battery is the same in all — duration, efficiency, cycle limit, augmentation — and so are the physical rules; operation and wear follow each market. Each market keeps its own prices, costs, taxes and financing. NPVs are shown at a common 12% — an assumption, so that the rows compare — and at each market’s own hurdle. The Ukrainian rows are described on the Ukrainian methodology page.
| Case | Investor IRR | NPV at 12% | NPV at own hurdle | LCOS | Revenue 2029 per MW | Debt share |
|---|---|---|---|---|---|---|
| Ukraine, baseDay-ahead market; development-bank loan | −6.9% | −€16.5m | −€16.8m at 15% | €209/MWh | €85,938 | 17% |
| Ukraine, no loanDay-ahead market; equity | −5.4% | −€18.5m | −€18.9m at 15% | €209/MWh | €85,938 | — |
| Germany, toll with loanToll 80% + day-ahead; commercial-bank loan | −3.0% | −€16.4m | −€16.4m at 12% | €210/MWh | €107,931 | 44% |
| Germany, toll without loanToll 80% + day-ahead; equity | −1.0% | −€18.9m | −€18.9m at 12% | €210/MWh | €107,931 | — |
| Germany, day-ahead onlyDay-ahead market; equity | −6.0% | −€26.5m | −€27.7m at 15% | €220/MWh | €59,712 | — |
What differs between the two markets
- Revenue
- Ukraine: day-ahead trading on spreads that were among Europe’s widest in 2025. Germany: a tolling contract for 80% of the battery and day-ahead trading for the rest.
- Investment and costs
- Similar battery prices; Germany adds a grid connection contribution (BKZ) and from 2029 the AgNes capacity fee, Ukraine network tariffs and war risk.
- Taxes
- Ukraine: 18% profit tax and 5% withholding tax on dividends to the German parent. Germany: corporate income tax, solidarity surcharge and trade tax of the GmbH.
- Financing
- Ukraine: a euro loan of a development bank. Germany: a commercial bank’s loan sized on the toll and the market separately.
- Payouts
- Ukraine: dividends out of closed tax profit, within the National Bank’s monthly limit. Germany: §30 GmbHG and the company’s own liquidity plan.
- Risks
- Ukraine: war damage and the hryvnia. Germany: neither; the market risk of the years after the toll stays.
For the base case the comparison is computed in advance. For other inputs the calculator loads the Ukrainian revenue library from this site when the comparison tab is opened.
15. Checks and acceptance
Every run checks itself. The checks fall into three groups, and the case’s status follows the first group that fails: inputs outside the model, then a failed calculation, otherwise a result.
Inputs
A failure means the case lies outside the model: no result, a status instead.
- Supported duration (2 or 4 hours)
- A loan needs the tolling contract
- Inputs within the model’s range
- Within the revenue library
Calculation
Identities that must hold. A failure means the calculation failed its own checks, and no result is shown.
- Sources equal uses during construction
- Loan drawn in full
- Balance sheet balances every month
- Toll and market cash add up
- Taxes paid equal taxes due
- Toll and market shares add up
- Toll fee within the contract
- Loan sizing converged
- Loan within the maximum debt share
Scope and covenants
Shown with the result, which stays: they mark shortfalls, covenant breaches and the edges of the model.
- Cash never below zero
- Loan repaid by maturity
- Reserve account full after each payment
- Interest below the interest-barrier threshold
- Grid-fee exemption kept
- Payouts not cut by §30 GmbHG
- No payout blocked by the lock-up
- Cover never below 1.00
No check fails or warns in the base case; one does not apply: “Grid-fee exemption kept”. The revenue library’s release test is described in section 3.
Acceptance
- The specification, the register of values and 33 test cases are frozen together, with a SHA-256 hash of every file. The cases are the base case, fourteen variants and eighteen edge cases — among them three built to fail: a temporary cash shortfall, a loan left at the end, and a cash deficit at the end. Analytical checks computed by hand cover the effective fee, the calendar and the index, the investment and its schedule, a month’s operating costs, the toll fee and the contract curve, small tax cases, depreciation, bucket budgets and sculpting, the liquidity reserve, the payout rules and the liquidity forecast, and synthetic functions for both break-even solvers.
- The engine’s outputs for all cases are sealed before any comparison, with only their hash on record. A schema check and a semantic checker derive from each output every field that can be derived — the loan schedule, the reserve movements, the state at each payout date, monthly depreciation, every root of the break-even search — and a set of deliberately corrupted outputs must each be rejected, while a change within tolerance must pass.
- Release follows the procedure of the Ukrainian calculator: a second implementation is written separately from the frozen documents alone — with its own revenue library and without the calculator’s code — and frozen before the two are compared. A comparator with full coverage then checks every field of every case by its own rule: statuses first, then the loan within 0.1%, IRRs within 0.05 points, cover ratios within 0.01, NPVs within €10,000, LCOS within 0.5%, the debt share within 0.001, revenue per MW within 0.1%, payback within a month, k within 0.005, T* within €250 per MW a year, monthly ledger lines and a year’s taxes within €0.01. It must find nothing when an output is compared with itself, and it must catch deliberate changes.
- Result. The first comparison found five faults in the calculator:
- the peak purchases of a 4-hour battery;
- the contract curve under a lower availability;
- the LCOS of the lender’s case run in full;
- the project’s reserve after the toll;
- the liquidity reserve inside the lender’s case.
- The two revenue libraries agree on the value of every node within €0.004 per MW and month. Their gross purchases and sales differ only where a day’s optimum is not unique. Run on the second implementation’s library, the calculator reproduced every field of all 33 cases within the frozen tolerances, about 650,000 values, with the monthly ledger to the cent. Each on its own library, the two agree as follows:
- investor NPVs within €0.05;
- loans within €0.02;
- every ledger line within €0.12;
- the break-even toll price and spread multiplier to the last digit.
- The German modules sit beside the Ukrainian ones and leave its results unchanged: the Ukrainian calculator still reproduces its regression to the cent and its contract cases byte for byte.
16. Limitations
- Day-ahead trading and one tolling contract only: no reserves (FCR, aFRR), no intraday market, no capacity market and no inertia services.
- Perfect foresight scaled by one realism factor; hourly comparable prices; the spread paths are assumptions, not forecasts.
- A simplified toll: a fixed nominal fee with an availability guarantee and a capacity curve — no efficiency penalties, no termination, no credit risk of the buyer, no floor and no indexation.
- A fully amortising loan: no mini-perm, refinancing, KfW programme or subordinated debt, and no loan for the day-ahead-only case.
- AgNes is a draft; the dynamic grid tariffs of 2030–2033 are not estimated; the BKZ is an assumption until a network operator’s offer, and its standardisation from 2027 is not considered.
- Taxes: one municipality, prepayments equal to the year’s tax, no loss carry-back, contested depreciation classes, the interest barrier as a check only; no taxes of the shareholder, no tax group (Organschaft) and no GmbH & Co. KG.
- The exchange’s collateral and daily liquidity are covered by the liquidity reserve — an assumption.
- The extra costs of a late start are not estimated.
- One site and one company; a 1-hour battery is outside this version and shows a status.
- The battery is fictional and the results are illustrative.