1Purpose and scope
The BESS Backtest measures how much of a battery's full potential its optimizer converts into realised results. It compares the realised results of the battery, as settled by the optimizer and checked against meter data, with the full potential of the same battery on the same site: the highest result that was achievable within the limits of the site and the rules of each market. The outcome is expressed as a capture rate, in percent, and as a delta with expected results, in euros. This methodology sets out how these figures are calculated and presented.
The BESS Backtest covers battery energy storage systems (BESS) in the Netherlands that operate under a merchant contract, either stand-alone or behind a grid connection shared with solar panels (PV) and on-site consumption. A project is one site with one connection agreement and one or more battery assets, each with its own meter. The markets in scope are the day-ahead and intraday markets, the imbalance market, and the balancing markets for frequency containment reserve (FCR) and automatic and manual frequency restoration reserve (aFRR, mFRR). In this version, intraday and mFRR are not yet modelled; realised intraday revenue is compared with imbalance and aFRR energy together (sections 4 and 7). Section 16 lists the features planned for later versions (backlog); section 18 defines all terms and abbreviations.
Results are published per project in a dashboard and a report. Both contain the same sections: key figures, the BESS Backtest chart of realised results against expected results and full potential, the delta with expected results per period, revenue by driver, project details and downtime; each chart has its figures in a table underneath.
This methodology is prepared by the Independent Capacity Market B.V. (the ICM) and forms part of the Terms & Conditions; in case of conflict, the Terms & Conditions prevail. Capitalised terms have the meaning given in the Terms & Conditions. Until the BESS Backtest has its own Terms & Conditions, those of the BESS Benchmark apply.
The projects shown (Kasteelweg, Sterrenburg and Zeedijk) are fictional. Their market prices are simulated: day-ahead, intraday and imbalance prices and FCR and a/mFRR capacity prices follow realistic daily and seasonal patterns, but are not historical EPEX Spot, ENTSO-E, TenneT or regelleistung.net data. The example results were generated with an earlier, simplified version of the model, which includes an intraday stage, combines aFRR and mFRR and fixes the stored energy at midnight; they illustrate the presentation, not the rules of this version. Grid tariffs in the examples are simplified to a single kW-max tariff of EUR 3.80 per kW per month for all grid operators; for reference, Liander charges EUR 3.57 per kW of monthly peak plus EUR 2.29 per contracted kW per month for medium-voltage connections of 136 to 2,000 kW in 2026.
2Principles
- Site-specific. The full potential is modelled with the battery, PV, consumption, grid limits and dispatch constraints of the site itself, not with a standard battery.
- Independence. The ICM owns no battery assets and is not an optimizer. The same rules apply to every client, regardless of its optimizer.
- Perfect foresight within market rules. The full potential uses realised prices in hindsight: the results of the day-ahead and capacity auctions. Balancing prices, which are known only after delivery, are used only within backtest limits that restrict how much the model can gain from knowing them (section 7). Expected results, set at 80% of the full potential, account for what an optimizer cannot know in advance.
- Triangulation. Every figure is checked against at least two independent sources before a month is marked final (section 5).
- Additive figures. Drivers add up to the total, and periods add up to the period total. Percentages for longer periods are calculated from summed euros, never averaged.
- Like for like. Realised results and full potential are valued with the same formulas (section 6). Revenue from a market that the full potential does not model at all is reported, but left out of the capture rate.
- Hardware separate from trading. Downtime is reported as a separate driver, so that a fault is not attributed to trading performance, and the reverse.
- Reproducible. The full potential is solved with an open-source solver, and inputs, code version and solver version are stored with every run, so that any result can be recalculated (section 7).
3Comparison with other approaches
Battery performance is measured in four established ways. Each answers a different question; the BESS Backtest answers how much of the potential of one specific site was captured.
| Approach | Limitation | BESS Backtest |
|---|---|---|
| Market indices and virtual assets | Model a standard battery, typically 2 hours, 1.5 cycles per day and full availability, without the grid limits, PV, consumption and dispatch constraints of a specific site (Modo Energy, KYOS battery index, Montel). Warranty limits alone change revenue by 10–20% (Energy-Storage.news). | Models each site with its own limits and actual downtime. |
| Perfect-foresight backtests | Assume all prices are known in advance and therefore overstate achievable revenue; industry reviews grade such methods below those that include downtime, grid constraints and degradation (Energy-Storage.news). Benchmark providers combine both: KYOS, for example, uses perfect foresight for day-ahead and intraday and a forecast for imbalance (KYOS). | Uses perfect foresight on auction prices as an explicit upper bound, limits the use of balancing prices by backtest limits, looks one day ahead, includes downtime, grid limits and degradation costs, and sets expected results at 80% of that upper bound. |
| Optimizer reports | Cover one optimizer's own portfolio and are self-reported; external assurance is the exception, for example KPMG for enspired (enspired). | Taken from the optimizer report and checked against meter data and public prices. |
| Peer results | Show what other batteries earn, not what a given site could have earned (mijnbatterij.nl). | Compares the site with its own full potential. |
How benchmark providers model a battery
Benchmark providers fall into three groups: simulations of a virtual battery (Modo Energy, KYOS, RWTH, Enervis, Clean Horizon and Aurora), realised revenue of real portfolios (enspired, and Modo Energy in Great Britain), and optimizers that simulate a client's asset on request (E6). Simulations use perfect foresight for markets that clear in auctions, limit foresight on continuous intraday and imbalance, and cap cycles; several then scale modelled revenue by a factor of 0.75 to 0.90. None applies perfect foresight to imbalance prices without limits: Modo Energy leaves imbalance out and KYOS uses a forecast. Of the simulations reviewed, only KYOS covers the Netherlands today. The full potential of the BESS Backtest uses perfect foresight on auction prices and limits the use of balancing prices by backtest limits (section 7).
| Provider | Day-ahead and capacity | Intraday | Imbalance | Horizon and state of charge | Cycles and degradation | Factor |
|---|---|---|---|---|---|---|
| Modo Energy, Germany index | Perfect foresight on day-ahead, FCR and aFRR capacity prices, solved first; later steps cannot change it | ID3 and aFRR energy prices replaced by a centred 2-hour rolling mean | Not modelled: positions are closed intraday | One day; 50% at midnight; 15 minutes from 1 October 2025 | 1.5 cycles per day; degradation off; round-trip efficiency 88%; aFRR capacity price capped at EUR 50 per MW per hour, its 95th percentile | 0.80 on all revenue |
| Modo Energy, GB | Perfect foresight on day-ahead | 2-hour rolling horizon, imperfect foresight | Balancing Mechanism by the historical probability of being in merit | One day; three days for batteries above 6 hours (core model) | — | 0.80 central, 0.75–0.85 range (calibration) |
| KYOS battery index | Perfect foresight, dynamic programming | Perfect foresight on the EPEX Spot ID1 index | Regression forecast; passive imbalance capped at 30% of capacity (KYOS); intraday decided one hour before | — | 730 cycles per year; round-trip efficiency 90% | — |
| RWTH battery-charts | Day-ahead first, the remainder on ID1; aFRR backed by 1 hour of energy | ID1 | — | — | — | 0.90 of calculated revenue |
| Enervis battery storage index | Simulated 1 MW / 2 MWh battery; FCR and aFRR capacity with imperfect foresight | Imperfect foresight | aFRR energy left out | — | 1.5 cycles per day; round-trip efficiency 87%; 97% availability | — |
| Clean Horizon storage index | Day-ahead, FCR, aFRR and mFRR; foresight not published | Modelled; method not published | — | — | Not published | Not published |
| enspired portfolio performance | Realised revenue of its own German portfolio, under KPMG limited assurance; no model | — | — | — | 1.2–1.3 cycles per day | — |
Research on the continuous intraday market shows why an index alone is not enough to value intraday trading. A forecast-driven trading strategy on German 2023 data earned 11% less than perfect foresight on individual trades but 4% more than perfect foresight on ID1, the volume-weighted average price of trades in the last hour before delivery (Hornek et al.). Indices do not reflect bid–offer spreads, and the shorter the window before delivery, the more volatile the index and the higher the modelled revenue (Oeltz). Traders run a rolling intrinsic policy on the order book, re-optimising as prices move; its value depends on how often it re-optimises (Schaurecker et al.). The BESS Backtest therefore adds intraday once continuous intraday prices per quarter-hour, with their volatility, are collected (section 4).
An industry grading puts perfect foresight over a whole month or year at grade C, a look-ahead of 24 to 48 hours at grade B, and grade B plus asset limits (downtime, state-of-charge bounds, degradation) and network limits (outages, curtailment, grid constraints) at grade A (Energy-Storage.news). The full potential of the BESS Backtest is designed to meet grade A with a two-day rolling horizon, in which each day is planned together with the next; outages of the grid are not modelled, and congestion limits apply when the client declares them.
Backtests run well ahead of what an asset earns over time: a German whitepaper puts historical backtests at EUR 200,000–280,000 per MW per year against a structural level of EUR 120,000–180,000 (Re-Twin Energy and FfE). The BESS Backtest compares like with like instead: the same period, the same site limits and the same valuation for the model and the realised results.
4Collected data
The BESS Backtest needs three kinds of input. The client delivers one intake workbook per project, with the site and its grid connection, each battery's rated power and storage capacity, and the markets in the optimizer's mandate. The full potential is calculated from quarter-hour meter data, the project info and public market prices. Realised results come from the optimizer report in its most granular form, together with the meter data for grid costs and degradation costs. Data from the energy management system (EMS) establish downtime and serve as a check on the meters. Every other item is a cross-check.
The checklist below states, per delivering party, which items are required and which serve as a cross-check. Meter data are delivered by the metering service provider (MSP), the certified company responsible for the meters of the connection. The checklist assumes a site with multiple suppliers on one connection (MLOEA), on which the battery, PV and consumption each have their own allocation point. Meter and EMS data are needed per quarter-hour for at least six months before the first report, and then each month.
| Item | Used for | Status | Format |
|---|---|---|---|
| From the client | |||
| Connection and transport agreement (aansluit- en transportovereenkomst) with the grid operator: the contracted transport capacity (GTV) for import and for export, the connection category and the EAN code of the connection | Grid limits in the full potential; grid costs | Required | |
| Capacity limitation or steering contract (CBC, CSC) or alternative transport right (TBTR, TDTR), if any: the hours or the activations in which the limit applies | Grid limits in the full potential | Required if present | PDF or list |
| EAN code of each allocation point, only under MLOEA: as confirmed by the grid operator when the allocation point was created | Matching meter data to the battery, PV and consumption | Required under MLOEA | PDF or email |
| Battery data per battery: rated power (MW) and nominal storage capacity (MWh), and the warranty clauses on usage limits, such as maximum cycles per day or per year, maximum energy throughput or a state-of-charge window | Power, usable capacity and limits in the full potential | Required | Intake workbook; warranty as PDF, relevant pages |
| Optimizer contract: the clauses on (1) start and end date, (2) markets in the mandate, (3) agreed dispatch restrictions, such as a minimum state of charge, a reserve or a cycle limit, and (4) the BRP and BSP of the battery | Period covered by the optimizer; limits in the full potential; party that settles the battery | Required | PDF, relevant pages |
| Site arrangements: whether the optimizer trades PV and consumption, whether its reported revenue includes their imbalance, and whether the battery is pooled with batteries behind other connections, with the allocation key | Scope of realised results; pooling (section 7) | Required | Intake workbook |
| Declaration for supply to an energy storage facility (verklaring levering aan energieopslagfaciliteit), if any | Energy tax exemption | Required if present | |
| Energy invoice of the supplier | Cross-check of the energy tax bracket | Cross-check | |
| Signed Terms & Conditions and authorisations for the MSP, the EMS provider and the optimizer to share data | Permission to collect and use the data | Required | |
| Transport invoices of the grid operator, each month | Cross-check of grid costs | Cross-check | |
| From the metering service provider, per quarter-hour | |||
| Connection meter: grid import and export | Grid limits and import peak in the full potential; grid costs; annual offtake for the energy tax bracket | Required | CSV or API |
| Battery meter (allocation point): charge and discharge | Degradation costs, round-trip efficiency; check on the optimizer report | Required | CSV or API |
| PV meter (allocation point): production | PV available to the battery in the full potential | Required if PV is installed | CSV or API |
| Consumption meter (allocation point): consumption | Check that the allocation points add up to the connection | Cross-check | CSV or API |
| From the EMS provider | |||
| Status events: each change in a battery's status, such as active, fault, maintenance or offline, with start and end time and the battery it concerns; alarm log with type and description | Downtime | Required | CSV or API |
| Stored energy at the start of the period | Starting point of the full potential | Required | CSV or API |
| Battery power, state of charge and available power per quarter-hour | Check on the battery meter; availability | Cross-check | CSV or API |
| From the optimizer | |||
| Report per asset in its most granular form: preferably traded volumes and prices per market per quarter-hour and reserved FCR and aFRR capacity, per direction, with prices per 4-hour block; at least monthly revenue per market, with aFRR and mFRR stated separately | Realised results per driver | Required | CSV, API or PDF |
| Prequalification per market (FCR, aFRR upward and downward, mFRR) and asset, in MW; without a stated figure, prequalified MW equals rated power | Capacity markets in the full potential | Required if active in FCR, aFRR or mFRR | PDF or email |
| Dispatch constraints: minimum state of charge including any reserve, maximum state of charge, power limits | Limits in the full potential | Required | Intake form |
| Credit invoices per month | Cross-check of realised results | Cross-check | |
| Collected by the ICM from public sources | |||
| Day-ahead prices, per hour until 30 September 2025 and per quarter-hour from 1 October 2025 (Energy-Charts, SMARD data under CC BY 4.0; ENTSO-E Transparency Platform) | Day-ahead driver | Required | — |
| Continuous intraday prices per quarter-hour, with their volatility, from licensed market data (EPEX Spot market data (EEX Group webshop)) | Intraday stage, once added | Not yet collected | Data licence |
| Imbalance prices and regulation state per quarter-hour, balancing energy prices and aFRR activations (TenneT – settlement prices, TenneT – volumes settled aFRR and incident reserves) | Imbalance and aFRR drivers | Required | — |
| aFRR capacity prices and contracted volumes per block, product (4-hour and daily) and direction: average price of accepted bids (ENTSO-E Transparency Platform – volumes and prices of contracted balancing reserves, articles 17.1.B and C) | aFRR driver | Required | — |
| FCR auction results per 4-hour block (regelleistung.net) | FCR driver | Required | — |
| Transport tariffs of the grid operator, for example Liander | Grid costs | Required | — |
| Energy tax rates per bracket and year (Vattenfall – energy tax rates 2026) | Grid costs | Required | — |
Market data. Day-ahead, imbalance, balancing energy and FCR prices and aFRR capacity prices are published free of charge by the ENTSO-E Transparency Platform, TenneT and regelleistung.net; bulk downloads from the ENTSO-E Transparency Platform require a free account. Continuous intraday prices are not free: no free quarter-hour price series exists for the Dutch continuous intraday market. EPEX Spot sells quarter-hour price indices and trade data for the Netherlands, for the continuous market and for the intraday auctions that started on 13 June 2024, as data packages; its general conditions govern their use (EPEX Spot market data (EEX Group webshop), EPEX Spot general conditions for market data (July 2024), EPEX Spot – go-live of intraday auctions (13 June 2024), ENTSO-E – intraday auctions on SIDC). An index alone, such as ID1, fills every trade at one price without bid–offer spread or liquidity limit (section 3). This version therefore leaves the intraday stage out of the full potential until continuous intraday prices per quarter-hour, with their volatility, are collected from these licensed data: the real-time stage deviates from the day-ahead position, and its result stands for intraday, imbalance and aFRR energy together. Realised intraday revenue stays in the capture rate and is compared with imbalance and aFRR energy as one. Realised mFRR revenue, for which the full potential has no counterpart, is reported but left out of the capture rate and the delta with expected results while mFRR is not modelled (section 7).
Public market data are collected in one workbook per period, with every download kept unchanged next to the series the model reads; a check on every row tests that the value used equals the value downloaded, and the source files are kept with SHA-256 checksums. Each period passes automatic checks before use, among them no missing quarter-hours or prices and a unit check of the aFRR capacity prices against the FCR auction. Activated mFRR volumes are collected but not yet used.
A review of the public websites of 29 optimizers active in the Dutch market (section 17) found that none commits publicly to revenue per market per quarter-hour. Edmij provides metered data, traded volumes and prices per quarter-hour so that customers can verify their invoice, and E6 Group states that settlement data are available per asset; most others describe a dashboard or a monthly report. The ICM therefore asks for the most granular report available. Where only a monthly report exists, realised results have monthly granularity (section 12).
On a site with a single supplier, the connection has only its primary allocation point: charge and discharge are taken from the battery submeter, read by the MSP where possible and otherwise through the EMS, in which case they are marked as EMS data. Supply contracts are not needed: the allocation points are identified by their EAN codes, which the client provides and the MSP confirms with the meter data.
Multiple suppliers on one connection (MLOEA). Under MLOEA, the battery has its own allocation point, with its own EAN, meter, supplier and balance responsible party; the rules are set out in articles 2.3 and 2.5 to 2.10 of the Systeemcode elektriciteit 2026, which since 1 January 2026 replace the code decision of 2017 without change of policy (ACM). For the BESS Backtest, MLOEA matters for the data, not for the model. The battery meter is a certified meter read by the MSP, and imbalance is settled per allocation point, so the optimizer report covers the battery alone and can be checked directly against its meter. The full potential does not change: the GTV and the transport tariffs remain per connection, so the battery shares the grid limits with PV and consumption as on any other site (Westland Infra, Liander). Whether energy tax then applies per allocation point is an open question (section 15).
Neither the battery datasheet nor the full optimizer contract is required; only the clauses listed above. A subsidy decision for the PV (SDE++) is not required either (section 7). All amounts are in euros, excluding VAT. Storage and use of client data are governed by the Terms & Conditions.
5Data validation
Every figure is checked against at least two independent sources. At intake, the project info is confirmed with the client against the documents in section 4. Each month, the figures below are triangulated before the month is marked final (section 13):
| Figure | Source | Checked against |
|---|---|---|
| Energy volumes: charge, discharge, PV, consumption | Meters (MSP) | EMS data; sum of the allocation points against the connection meter; volumes in the optimizer report |
| Realised results per driver | Optimizer report | Recalculation with meter data and public prices (section 6); credit invoices |
| Grid costs | Import peak and import of the connection from meter data × tariff | Transport invoices |
| Energy tax | Extra grid import caused by the battery × rate of the bracket | Energy invoice of the supplier |
| Downtime | EMS status events and alarm log | Metered output |
| Project info | Client documents | EMS configuration; prequalification and dispatch constraints from the optimizer |
Any difference above 2% of the monthly total is explained before the month is marked final. Where meter and EMS data differ, meter data prevails: the meters are certified and are the basis for allocation, imbalance settlement and the energy invoices, whereas the EMS measures at the inverter and is not calibrated. Energy invoices contain monthly totals only and therefore serve as a check, not as a source. All figures are calculated by software and reviewed by an analyst before a month is marked final. Client reports are prepared for real assets only. The model itself will be validated by an independent party; the choice of that party is an open question (section 15).
How each figure is obtained
Every figure in the dashboard and report is one of five types. Measured figures come directly from certified meters or the EMS; reported figures come from the optimizer; calculated figures follow from measured or reported data by a fixed formula; modelled figures result from the optimisation in section 7; estimated figures rest on an assumption. Two inputs are estimated: the degradation cost per MWh and the 80% factor for expected results.
| Figure | Type | Basis |
|---|---|---|
| Grid import and export, battery charge and discharge, PV production | Measured | Meters of the MSP, per quarter-hour |
| Consumption | Measured or calculated | Consumption meter where available; otherwise import − export + PV production − battery charge + battery discharge |
| Status events, state of charge and available power | Measured | EMS, per event or per quarter-hour |
| Downtime | Measured | EMS status events, converted into quarter-hours (section 10) |
| Market revenue per driver | Reported | Optimizer report; recalculated with meter data and public prices where reported per quarter-hour |
| Grid costs | Calculated | Increase of the connection's monthly import peak caused by the battery × kW-max tariff, plus the extra grid import caused by the battery × kWh tariff, both for the grid operator, connection category and year |
| Energy tax | Calculated | Extra grid import caused by the battery × rate of the bracket in which the connection's annual offtake falls, from the connection meter, annualised where less than a year of data is available |
| Usable capacity | Calculated | Nominal capacity × (maximum state of charge − minimum state of charge) |
| Round-trip efficiency | Calculated | Energy discharged ÷ energy charged, corrected for the change in stored energy over the period, from the battery meter; losses between battery and meter are included. Used in the model where at least 7 complete days are available and the result lies between 60% and 100% (section 7) |
| Cycles | Calculated | Energy discharged ÷ usable capacity |
| Degradation costs | Estimated | EUR 10 per MWh discharged, from a market pack price and a typical warranted cycle life (section 6) |
| Full potential | Modelled | Optimisation within the project info and the market rules of section 7 |
| Stored energy carried | Calculated | Change in stored energy over the day × average day-ahead price of the day × √RTE (section 7) |
| Expected results | Estimated | 80% of the full potential, based on expert interviews (section 8) |
| Expected results in downtime | Modelled | 80% of the full potential lost in the hours of downtime (section 10) |
| Capture rate and delta with expected results | Calculated | From realised results, full potential and expected results (section 9) |
Checks on the model
Every run passes a fixed set of automatic checks before its results move on, each with a stated tolerance: the revenue of every driver is recomputed independently from the model's volumes and the public prices; stored energy is never negative; import and export stay within the GTV and delivered aFRR energy within TenneT's activations; discharge stays within the daily cycle limit; drivers add up to the total; and the run with actual downtime never exceeds the run at full availability.
Next to the full potential, the model solves variants of every day that form a value ladder. Each rung adds one market or one freedom to the rung below, so its value can only be equal or higher; a day on which a rung falls below the one beneath points to an error in the model.
| Rung | Content |
|---|---|
| L0 | Day-ahead only. |
| L1 | L0 plus FCR and aFRR capacity, with the activation of contracted aFRR. |
| L2 | L1 plus passive imbalance and aFRR energy within the backtest limits: the full potential. |
| L3 | All markets optimised at once, with full hindsight and without backtest limits: the theoretical ceiling. |
A stochastic benchmark shows what was achievable without knowing balancing prices. It takes auction decisions with known auction prices, decides aFRR bids, schedule and passive positions on 14 scenarios drawn from the days before D-1, and settles that plan on the actual day. Its capture rate is calculated as an internal check on how much of the full potential was achievable without hindsight, and is not shown in the dashboard. Before a month is released, an analyst confirms that all checks pass, that every capture rate above 100% and every difference above 2% between the recalculation and the optimizer report is explained, that downtime matches the EMS log, and that site limits match the intake documents (section 13).
6Realised results
Realised results are the earnings of the battery in euros, per revenue driver. Market revenues are taken from the optimizer report, because it reflects actual settlement, including capacity payments that meters do not record. Grid costs, energy tax and degradation costs are calculated by the ICM from meter data. Where the optimizer reports per quarter-hour, every driver is recalculated with public prices and the traded volumes are compared with the battery meter, using the formulas below. The same formulas value the positions of the full potential (section 7).
| Symbol | Meaning | Unit | Source |
|---|---|---|---|
| t | Quarter-hour (imbalance settlement period) | — | — |
| gt | Net output of the battery: discharge minus charge, as average power over the quarter-hour | MW | Battery meter |
| qt | Day-ahead position of the battery: volume sold (positive) or bought (negative) on the day-ahead market | MW | Optimizer report |
| nt | Position after intraday trading: day-ahead position plus net intraday trades | MW | Optimizer report |
| aup,t, adown,t | Activated aFRR or mFRR energy upward (more output) and downward (less output), as average power over the quarter-hour; at = aup,t − adown,t | MW | Optimizer report |
| mt | Import of the connection from the grid, as metered | MW | Connection meter |
| m0t | Import of the same site without the battery: consumption minus PV production, where positive | MW | PV and consumption meters |
| PDA,t, PID,t | Day-ahead price, and average price of the battery's intraday trades, in quarter-hour t | EUR per MWh | Energy-Charts, ENTSO-E; optimizer report |
| Pimb,t | Imbalance price for the direction of the deviation: the shortage price where the battery delivers less than its position, the surplus price where it delivers more; the two differ only in regulation state 2 | EUR per MWh | TenneT |
| Pup,t, Pdown,t | Balancing energy price for upward and downward activation | EUR per MWh | TenneT |
| 0.25 h | Length of a quarter-hour, converting MW into MWh | h | — |
| Reserved MW | Capacity reserved for FCR, aFRR or mFRR in a block, per direction for aFRR | MW | Optimizer report |
| Capacity price | Price per MW for the block: for FCR the Dutch settlement price; for aFRR and mFRR the contracted price in the optimizer report, as these are paid as bid | EUR per MW per block | regelleistung.net, optimizer report, ENTSO-E |
| kW-max tariff | Transport tariff on the highest monthly import | EUR per kW per month | Grid operator |
| kWh tariff, energy tax rate | Transport tariff per unit of import, and energy tax at the rate of the bracket in which the annual offtake of the connection falls | EUR per MWh | Grid operator, tax rates per year |
| Driver | Calculation | In words |
|---|---|---|
| Day-ahead | Σ gt × PDA,t × 0.25 h | Net output of the battery, valued at the day-ahead price. |
| Intraday | Σ (nt − qt) × (PID,t − PDA,t) × 0.25 h | Volume traded intraday, valued at the difference between the intraday and the day-ahead price. |
| Imbalance | Σ (gt − nt − at) × (Pimb,t − PDA,t) × 0.25 h | Deviation of the metered output from the traded position, excluding activations, valued at the difference between the imbalance price for its direction and the day-ahead price. |
| FCR | Σ reserved MW × capacity price | Capacity payment per 4-hour block. |
| aFRR | Σ reserved MW × capacity price + Σ (aup,t × (Pup,t − PDA,t) − adown,t × (Pdown,t − PDA,t)) × 0.25 h | Capacity payment per block plus activated energy, valued at the difference between the balancing energy price for its direction and the day-ahead price. |
| mFRR | As aFRR, for mFRR capacity and activations | Not modelled in the full potential in this version (section 7). |
| Grid costs | − kW-max tariff × 1,000 × (max mt − max m0t) − (kWh tariff + energy tax rate) × Σ (mt − m0t) × 0.25 h − GTV overrun costs | Change in the connection's highest import of the month caused by the battery at the kW-max tariff (the maxima taken over the quarter-hours of the month; 1,000 converts MW into kW), plus the extra grid import caused by the battery at the kWh tariff and the energy tax rate, plus any costs of exceeding the GTV on the transport invoice. A battery that lowers the peak or the import makes this driver positive. Export carries no transport tariff. |
| Degradation costs | − EUR 10 per MWh × MWh discharged | Wear of the battery, charged per MWh discharged. |
Sums run over the quarter-hours, or the blocks, of the period. Because the day-ahead driver values all energy at the day-ahead price, the intraday, imbalance, aFRR and mFRR drivers capture only the additional value over the day-ahead price; together, the drivers add up to the settled revenue. Where the optimizer reports only monthly revenue per market, its split is cash per market rather than this decomposition; the total is then compared with the full potential, and the comparison per driver is indicative. Realised results are reported gross, before the optimizer's fee and fixed fees of the balance responsible party, because the full potential contains no fees either; fees are a contractual matter, not a measure of trading performance.
Grid costs are charged on the connection, so the battery's share is the difference it makes: the extra monthly import peak and the extra grid import, against the same site without battery. Extra grid import equals energy charged from the grid minus energy discharged to on-site consumption. Energy tax is reported with grid costs, because both arise from the same extra grid import. The fixed charge and the contracted-capacity charge of the transport tariff do not depend on how the battery is dispatched; they are costs of the connection and outside the backtest. On a site with several battery assets, grid costs and energy tax are allocated to the assets in proportion to their extra grid import.
The degradation cost of EUR 10 per MWh discharged follows from a replacement cost of EUR 70,000 per MWh of capacity and a warranted life of 7,000 full cycles. A full cycle discharges the full capacity once and uses 1/7,000 of the battery's life, so each MWh discharged costs EUR 70,000 ÷ 7,000 = EUR 10. For reference, BloombergNEF reports an average 2025 pack price of USD 70 per kWh (USD 70,000 per MWh) for stationary storage.
A difference of more than 2% between the recalculation and the optimizer report is explained with the optimizer before the month is marked final.
7Full potential
The full potential is the highest result that the battery assets on a site could have achieved with realised market prices, within the limits of the site and the rules of each market. Auction results are used with perfect foresight; balancing prices, which are known only after delivery, are used only within the backtest limits set out below. This follows the practice of benchmark providers (section 3) and keeps the upper bound unambiguous and reproducible. The gap between this bound and what is achievable in practice is reflected in expected results (section 8).
Time structure. The model works per quarter-hour, the imbalance settlement period: 96 quarter-hours per local calendar day, or 92 and 100 on the days the clocks change. Day-ahead prices are hourly until 30 September 2025 and apply to the four quarter-hours of each hour; the day-ahead market has been cleared per quarter-hour since delivery day 1 October 2025 (NEMO Committee). All battery assets behind one connection are optimised together as one site, each within its own limits, because they share the GTV and the monthly import peak.
Rolling horizon. Traders and balance responsible parties plan with forecasts days ahead and choose the stored energy at midnight that sets up the next day. The full potential therefore optimises each day together with the next, on a two-day rolling horizon:
- Start. Day D starts with the stored energy in which day D−1 ended. The first day of the period starts at the stored energy recorded in the EMS log, or at the midpoint of the usable capacity where the log has none.
- Look ahead. Days D and D+1 are optimised together, in the stages described below; D+1 ends at the midpoint. The stored energy that this solve holds at midnight at the end of day D becomes the target for day D.
- Settle the day. Day D is optimised again on its own, from its start to that target, and its result is kept. The second day of the two-day solve is discarded and solved afresh when its turn comes.
- Value the change. The change in stored energy over the day is reported as a driver of its own, stored energy carried, so that a day that charges for the next is not shown with the cost of charging but without the value it passes on.
The last day with market data ends at the midpoint. Where the two-day solve has no feasible solution, the day ends at the midpoint instead; in a test run on four sites over July–September 2026, this applied to 4 of 368 site-days. A fixed stored energy at midnight gives away value, mainly for batteries of two hours or more: Modo Energy fixes 50% at midnight for its German index and optimises three days for batteries above 6 hours (Modo Energy – Germany index, Modo Energy – core dispatch model).
In words: energy passed on to the next day is valued at the average day-ahead price of the day, net of the losses of discharging it later. The next day books the revenue from that energy and a negative carry. Over a month the amounts largely cancel: in the test run of July–September 2026 they netted to −0.9% of the full potential, because energy is valued at the price of the day on which it is carried, not the day on which it is sold.
A 2.5 MW / 5 MWh battery with a round-trip efficiency of 88% starts a day with 4.404 MWh stored and ends it with 3.079 MWh, having sold during the day energy carried in from the day before. The average day-ahead price of the day is EUR 147.58 per MWh. Stored energy carried = (3.079 − 4.404) MWh × EUR 147.58 per MWh × √0.88 = EUR −183.4.
Order of the markets. Each day is solved in three stages that follow the gate closures of the markets. A later stage cannot change what an earlier stage committed.
- Day ahead (D-1). FCR capacity, aFRR capacity and the day-ahead position are optimised together with the auction results of the day, and every capacity bid in the plan is accepted at the published price. FCR closes at 08:00, aFRR capacity at 09:00 and the day-ahead market at 12:00 on the day before delivery (ENTSO-E – FCR, TenneT aFRR manual v2.8, EPEX Spot). Optimising them together is an upper bound: in practice, capacity is offered before day-ahead prices are known, bids can be rejected, and pay-as-bid auctions reward bid strategy.
- Intraday. Not modelled in this version. Intraday is added once continuous intraday prices per quarter-hour, with their volatility, are collected from licensed EPEX Spot data (section 4). An index such as ID1 fills every trade at one price, without bid–offer spread or liquidity limit, and is therefore not used on its own. Once added, this stage re-plans the remaining power and energy against the intraday price, with the positions of stage 1 fixed, and the intraday price replaces the day-ahead price as the reference for the backtest limits.
- Real time. Per quarter-hour, the battery settles against TenneT's balancing prices: passive imbalance, aFRR energy offered without a capacity contract, and the activation of contracted aFRR, within the backtest limits below. The deviations of the day are optimised together, so that the state-of-charge window, the energy held for FCR and aFRR and the target at midnight still hold.
Backtest limits. A backtest knows every price after the fact, including the imbalance price that TenneT sets only after each quarter-hour. The backtest limits restrict how far the model may use that knowledge, so that the full potential reflects what a skilled trader could have earned, not what perfect knowledge of the imbalance price would yield. They apply to the two revenue streams whose price is known only after delivery: passive imbalance, in which the battery deliberately deviates from its traded position and TenneT settles the difference at the imbalance price, and aFRR energy offered without a capacity contract. TenneT allows passive balancing: a balance responsible party may take an imbalance opposite to the system imbalance and receives the imbalance price for it (TenneT – balancing markets). The limits are the same for every project; an optimizer contract can make them stricter, never looser.
| Limit | Rule | Reason |
|---|---|---|
| Minimum price gap | A position only where the imbalance price differs from the day-ahead price by at least EUR 50 per MWh: discharge more where it lies EUR 50 or more above the day-ahead price, charge more where it lies EUR 50 or more below. The same gap applies to the balancing energy price of aFRR energy offered without a capacity contract. | Small gaps cannot be spotted before delivery. EUR 50 also covers efficiency losses, degradation and the value of the stored energy. The gap rests on judgement and market practice and is calibrated once realised imbalance results of clients are available. |
| Maximum volume | Up to 100% of rated power per quarter-hour, within the room that the connection leaves after the other assets behind it (PV, consumption, other batteries), the daily cycle limit and the costs of the site. | The site limits already hold the battery to what the connection allows. KYOS caps passive imbalance at 30% of capacity in its index because of limited liquidity and cannibalisation (KYOS): an index stands for a fleet of batteries chasing the same imbalance. The backtest values one site against prices that already contain the fleet's response, and charges the site's own effect on the price through the price impact below. |
| No position in regulation state 2 | No passive imbalance in quarter-hours in which TenneT regulated the grid both up and down. | In regulation state 2, long and short positions are settled at different prices (TenneT – Imbalance Pricing System v6.3), and a balance responsible party often learns only afterwards that state 2 applied (Solar Magazine). State 2 occurred in 43% of quarter-hours in April–September 2026, in line with the 40% reported by Solar Magazine. |
| Within the mandate | No passive imbalance where the optimizer contract excludes it. | The backtest measures the optimizer within its mandate. |
| Exception: restoring charge | After TenneT activates the battery's contracted aFRR, the battery may restore its charge through the imbalance outside these limits, up to the energy activated so far that day. | The battery must restore its charge to keep its capacity commitment; without this exception, days with heavy activation have no feasible plan. |
Within the quarter-hour, TenneT's balance delta and regulation state are updated every 12 seconds and published with a delay of 2 minutes (TenneT – balance delta, TenneT – 12-second balance delta); traders act on this signal, but the final imbalance price is settled afterwards. The model does not use the real-time signal; the limits stand in for it. No benchmark provider reviewed uses perfect foresight on imbalance: Modo Energy leaves imbalance out, and KYOS uses a forecast (section 3).
A 2 MW battery has no day-ahead position in a quarter-hour, and the connection has room for its full power. The day-ahead price is EUR 80 per MWh; after delivery, TenneT sets the imbalance price at EUR 200 per MWh. The gap of EUR 120 exceeds EUR 50, so the model may discharge up to 2 MW and earns (200 − 80) × 2 MW × 0.25 h = EUR 60 more than at the day-ahead price, before price impact. At an imbalance price of EUR 120, the gap of EUR 40 falls short of EUR 50, and the model takes no position.
Balancing prices. Long positions earn the surplus price and short positions pay the shortage price, as published by TenneT. In regulation state 0 both prices are equal; in state +1 both equal the upward balancing energy price; in state −1 both equal the downward balancing energy price; in state 2 the shortage price is at least the upward and the surplus price at most the downward balancing energy price (TenneT – Imbalance Pricing System v6.3). On April–September 2026 data these rules hold in 99.7% of quarter-hours. Dutch imbalance and balancing energy prices are set by the Dutch merit order, not by the cross-border marginal price of the European platform PICASSO (TenneT – market update). aFRR energy offered without a capacity contract is paid the Dutch balancing energy price for its direction, and the battery never delivers more than TenneT activated in that quarter-hour and direction.
Price impact. The battery is a price taker in the auctions. On aFRR energy and imbalance, its own volume would have replaced the most expensive bid in TenneT's merit order and moved the price against it. Over April–September 2026, each extra MW activated moved the balancing energy price by EUR 1.06 per MWh upward and EUR 0.50 per MWh downward, estimated as the slope of the balancing energy price on the activated volume; the fit is weak (R² 0.18 and 0.10), and the full potential moves by 0.3% or less between zero and twice these values.
In words: the price moves by α per MW on the whole volume, so the cost rises with the square of the volume. A battery that delivers 2 MW of upward aFRR energy at a published price of EUR 200 per MWh would have moved the price to EUR 197.88 and earns EUR 98.94 instead of EUR 100.00: a cost of 1.06 × 2² × 0.25 = EUR 1.06.
Capacity markets. Capacity is included only for markets that are in the optimizer's mandate and for which the asset is prequalified, up to the prequalified MW. Capacity is balancing capacity, in MW, held in reserve for a block; what the battery delivers when it is activated is balancing energy, in MWh.
- FCR is a symmetric product, auctioned daily per 4-hour block at one clearing price (ENTSO-E – FCR). For batteries, TenneT requires full delivery for at least 15 minutes and a ratio of rated power to prequalified power of at least 1.25:1 (TenneT FCR manual v3.3). The model therefore reserves at most rated power ÷ 1.25, keeps the stored energy at least 15 minutes of full FCR delivery away from both limits while FCR is held, and uses only the remaining power for energy trading. FCR revenue is the reserved MW times the Dutch settlement price of the block. The minimum activation period for batteries is under review by ACER, with a decision expected by early 2027 (ACER).
- aFRR capacity is contracted by TenneT on D-1, upward and downward separately and paid as bid, in two products: 4-hour blocks and a daily product with the same MW all day (TenneT aFRR manual v2.8, TenneT – 4-hour contracts). The model may use both. Because the auction is pay-as-bid and has no single clearing price, each block is valued at the average price of accepted bids per block, product and direction, as published on the ENTSO-E Transparency Platform in EUR per MW per quarter-hour (× 16 gives the price of a 4-hour block). These prices are capped at the 95th percentile of the month, per product and direction, which limits the windfall from perfect foresight on rare spikes: 4-hour blocks reached EUR 4,902 per MW per hour in May 2026, and the monthly cap on upward 4-hour aFRR ranged from EUR 23 (April) to EUR 770 (May) per MW per hour in April–September 2026. A monthly cap is final when the month closes and gives every month the same haircut on foresight; Modo Energy caps at a fixed EUR 50 per MW per hour, its 95th percentile (Modo Energy – Germany index).
- aFRR energy reservoir. TenneT requires "an energy reservoir for the contracted period for the contracted volume" (TenneT aFRR manual v2.8), so the battery holds enough stored energy to deliver the reserved MW for the whole block: for upward aFRR, energy above the minimum; for downward aFRR, room below the maximum. For a battery with two hours of storage and 4-hour blocks, this limits aFRR to about half its rated power in one direction, or about a quarter in each direction when both are held. A MW is not counted in FCR and aFRR at the same time, and the energy held for each adds up. Whether energy already delivered in the block may count is an open question (section 15).
- Activation of contracted aFRR. Contracted aFRR is activated pro rata: in each quarter-hour, the share of TenneT's contracted volume that TenneT activated, valued at the Dutch balancing energy price for its direction. Activation the battery cannot deliver, for example at its cycle limit, is settled upward at the higher of the shortage and the upward balancing energy price, and downward at the lower of the surplus and the downward balancing energy price.
- Reserves within the GTV. Reserved FCR and aFRR must be deliverable at the connection: full downward activation within the import GTV, full upward activation within the export GTV.
- mFRR is not modelled in this version. Since 1 September 2026, TenneT procures it as Incident Reserve, replacing the directly activated mFRR product (TenneT – Q3 2026 update); participation of batteries is not yet confirmed (section 15).
A 2 MW / 4 MWh battery with a window of 5% to 95% stores between 0.2 and 3.8 MWh, 3.6 MWh usable. It may sell at most 2 ÷ 1.25 = 1.6 MW of FCR; while it holds that, it keeps 1.6 MW × 0.25 h = 0.4 MWh away from both limits, so 2.8 MWh remains for trading. If it instead sells 0.5 MW of upward and 0.4 MW of downward aFRR for one 4-hour block, it needs 0.5 × 4 = 2.0 MWh above the minimum and 0.4 × 4 = 1.6 MWh below the maximum: together the whole 3.6 MWh, so upward and downward aFRR together can never exceed 3.6 ÷ 4 = 0.9 MW.
The full potential is subject to the same limits and costs as the battery on site. These limits are confirmed at intake and shown in the dashboard under Project details, together with a diagram of the site. Where the intake gives no value, the default below applies.
| Project info | Treatment in the model | Default without intake value |
|---|---|---|
| Rated power | Maximum charge and discharge power per battery, in MW, less the power reserved for FCR and aFRR in that direction. | None: required |
| Storage capacity and state of charge | Usable capacity = nominal storage capacity × (maximum state of charge − minimum state of charge). The minimum includes any back-up reserve, so depth of discharge is not a separate input. A battery of 10 MWh nominal with a window of 5% to 95% has 9 MWh of usable capacity. | Nominal storage capacity: none, required. Window: 5% to 95% |
| Stored energy at the start | Stored energy at the start of the first day of the period, from the EMS log. | Midpoint of the usable capacity |
| Round-trip efficiency | Measured from the battery meter where at least 7 complete days are available and the result lies between 60% and 100%: energy discharged ÷ energy charged, corrected for the change in stored energy over the period, and split equally over charging and discharging (√RTE each). The model then has the same losses as the real battery, including auxiliary consumption behind the meter. | Intake value, then 88% |
| Prequalification and mandate | Capacity markets are included only up to the prequalified MW, per market and direction, and only where the optimizer contract mandates them; the intake asks yes or no per market. The backtest measures the optimizer within its mandate. | Prequalified MW equal to rated power |
| Warranty | Energy discharged per day is at most the warranted cycles per day × usable capacity; an annual or lifetime limit is converted to a daily average. | 1.5 cycles per day |
| Degradation costs | EUR 10 per MWh discharged, also in the optimisation, so that the model does not cycle for spreads that only cover losses. Traders use both a cycle limit and a cost per MWh throughput (KYOS, Modo Energy). | EUR 10 per MWh |
| Grid limits | Maximum import and export at the connection per quarter-hour (GTV). A CBC, CSC or time-bound transport right declared at intake lowers the limit in the hours it applies; otherwise the GTV is firm. | None: required |
| PV and consumption | Taken as metered and not steered: they set the room the connection leaves for the battery in each quarter-hour, and their own revenue and imbalance stay outside the backtest. The full potential is the battery's alone. The model may curtail PV only where the connection cannot export it and at negative day-ahead prices. This matches the SDE++ rules for installations of 200 kW or more from the 2023 round onwards, which receive no subsidy when the price is negative, per quarter-hour since 1 October 2025 and per hour before (RVO). | Zero without meter data: only the GTV applies |
| Grid costs and energy tax | As in section 6. The month starts with the import peak of the site without battery; the model pays the kW-max tariff only on an increase of the connection's peak above the highest peak so far that month, carried from day to day, and does not lower the peak below that of the site without battery (section 15). The kWh tariff and energy tax apply to the extra grid import caused by the battery. | Switched off without connection-meter data (section 12) |
Energy tax is levied per kWh supplied through the connection, at a rate that falls with the annual offtake. In 2026, the rate is EUR 37.35 per MWh for an annual offtake of 50,000 to 10 million kWh and EUR 3.10 per MWh above 10 million kWh for business use (Vattenfall), the same order of magnitude as the day-ahead spreads on which a battery trades. The model uses one rate per connection: the marginal rate of the bracket in which the connection's annual offtake falls, from the connection meter and annualised where less than a year of data is available; the energy invoice serves as a check. Brackets below 50,000 kWh are not modelled, as battery sites rarely fall below. Energy exported later earns no refund. Energy tax is zero where the supplier applies the exemption for supply to an energy storage facility, which requires storage on its own, separately metered connection (Ministry of Finance, Vattenfall – declarations).
A site that takes 3 million kWh a year pays EUR 37.35 on every extra MWh the battery imports. At 88% round-trip efficiency and a buy price of EUR 40 per MWh, the break-even sell price, including degradation, rises from 40 ÷ 0.88 + 10 ≈ EUR 55 to (40 + 37.35) ÷ 0.88 + 10 ≈ EUR 98 per MWh.
Pooling and site-wide optimisation. Where the optimizer trades the site as a whole, its revenue includes the imbalance of PV and consumption; that part is split off from realised results, or the site is flagged, because PV forecast errors move with the Dutch system state and would otherwise count against the battery. A battery pooled with batteries behind other connections is benchmarked as part of the pool: the revenue of the pool is compared with the sum of the full potentials of its sites. This keeps the allocation key out of the capture rate and keeps each connection's GTV, which one virtual battery would ignore; it is not yet built (section 16). The intake asks whether the optimizer trades PV and consumption, whether its reported revenue includes their imbalance, and whether the battery is pooled, with the allocation key.
Two runs per day. Each day is solved twice. Run 1, at full availability, is the full potential and the denominator of the capture rate. Run 2 fixes the output at zero in the quarter-hours of downtime (section 10) and sells no capacity in a block that contains downtime, because a contracted block must be available for its whole duration; it sets the expected results of the trading drivers. The difference between the two runs is the downtime driver. The positions of both runs are valued with the formulas of section 6, so that realised results and full potential are measured alike, and a gap reflects dispatch decisions, not differences in accounting. Revenue drivers are calculated per asset from its own positions; grid costs and energy tax are allocated to the assets in proportion to their extra grid import. Doing nothing is feasible apart from reaching the stored-energy target at midnight, whose cost the stored energy carried offsets; a day with a negative full potential is reviewed before release.
Solver and reproducibility. Every optimisation is a mixed-integer linear programme per site, day and stage, solved with HiGHS, an open-source solver under the MIT licence (HiGHS), with a time limit of 60 seconds and a relative optimality gap of 0.001% per solve. A binary variable per quarter-hour prevents charging and discharging at the same time, which a battery cannot do. The price impact is applied as 8 linear segments, exact at the segment edges and slightly conservative between them; results are valued with the exact formula. Inputs, code version and solver version are stored with every run, so that any full potential can be recalculated without a licence fee. Client inputs are confidential: an optimizer can rerun the full potential of its own asset only with the client's consent, and an independent validator works on example data or under a confidentiality agreement.
8Expected results
No optimizer reaches the full potential: prices are uncertain at the moment of bidding, bids are subject to gate closures, and capacity markets are competitive. The 80% is based on interviews with market experts and is in line with the calibration used by Modo Energy, which applies a central calibration factor of 80% to its modelled revenues (75% low, 85% high) to account for unavailability, imperfect price foresight and competition in ancillary markets. Modo Energy calibrates on models that leave imbalance out; the full potential of the BESS Backtest includes imbalance within the backtest limits of section 7, so the factor is reviewed together with those limits once realised imbalance results of clients are available. Modo Energy's factor also covers unavailability, which the BESS Backtest reports separately as downtime; this is part of the same review (section 15).
The 80% norm applies to the total only. Drivers compete for the same power and energy, so a separate norm per driver would not be meaningful: one driver can be above its share while another is below. To show where the delta arises, the expected results are allocated to the drivers in proportion to each driver's share of the full potential.
In words: each driver receives the part of the expected results that matches its part of the full potential. The allocated amounts add up to the expected results, and the waterfall of expected results in the dashboard follows from this allocation.
9Capture rate and delta with expected results
The capture rate expresses realised results as a share of the full potential. The delta with expected results expresses the same gap in euros, against the 80% that an optimizer can be expected to achieve.
| Band | Capture rate |
|---|---|
| Above expected | 80% or more |
| Below expected | 60% to under 80% |
| Well below expected | Under 60% |
The capture rate is rounded to whole percentages and classified on the rounded value, so that it does not suggest more precision than the model provides. For periods of several months, euros are summed before dividing; monthly percentages are not averaged. Realised mFRR revenue is left out of both figures while mFRR is not modelled (section 4). With the full potential at full availability in the denominator, downtime lowers the capture rate, while the delta with expected results shows it as a separate driver (section 15). A month with a capture rate above 100% is reviewed by an analyst before it is marked final: the rules of section 7 limit the model where a trader may not be limited, so such a month points to a rule to revisit.
10Downtime
Downtime is the time in which the battery cannot charge or discharge because of a fault or maintenance. It is derived from the EMS log, which records each change in a battery's status, such as active, fault, maintenance or offline, as an event with a start and end time. Every quarter-hour that a fault or maintenance event touches counts as down for that battery, also where the event covers only part of it, because a battery that is unavailable for part of a quarter-hour cannot deliver a full position in it. Other statuses, such as offline or standby, do not count: offline can mean only a lost data connection while the battery runs its last schedule, and the client marks it as a fault where the battery stopped. An event that names no battery applies to every battery of the project. Each event is described by the start, end, type and description in the alarm log. Reduced power and grid restrictions are not counted as downtime.
In words: the expected results of the hours in which the battery was unavailable. The full potential is calculated twice for this purpose (section 7): at full availability, and with zero output in the quarter-hours of downtime and no capacity in the 4-hour blocks that contain downtime. Downtime is shown as a separate driver, so that a fault is not counted against the optimizer. In Revenue by driver, the realised results of this driver are zero, because the battery earned nothing while it was down; the expected results are the amount above; the delta is the amount lost to downtime. The expected results of the other drivers are based on the full potential with actual downtime, so that the drivers together add up to the expected results at full availability. The Downtime table lists each event with start, end, asset, type, duration, and the expected results and full potential lost. The BESS Backtest chart shows each event on a timeline below the axis.
11Periods, annualisation and zoom
- Periods. Months, quarters and years; a year in progress is shown as YTD. Only complete quarters are shown.
- Annualisation. EUR per MW per year = EUR ÷ (MW × days) × 365
- Zoom. Below month level, the charts and their tables show EUR per week, day, hour or quarter-hour, excluding grid costs, which are charged per month. Each quarter-hour of the full potential shows its value added: its cash flow plus the change in stored energy, valued at the average day-ahead price of the day × √RTE, with capacity revenue spread over the quarter-hours of its block; the quarter-hours add up to the total of the day. Cash flow alone would show charging as a loss in the quarter-hour it happens and the revenue hours later. Realised results below month level require an optimizer report per quarter-hour. Key figures, Revenue by driver, Project details and Downtime then cover the months that contain the zoom period.
- Several assets. The view All assets sums the euros and MW of all assets active in the period.
12Missing data
Quarter-hour data are rarely complete: meters fail, data transfers drop out and reports arrive late. The rules below set out how each gap is treated, so that results remain comparable between months and projects and no gap is filled with an assumption that is not visible to the client. Every gap and its treatment is logged.
| Situation | Treatment |
|---|---|
| Up to 4 missing quarter-hours of meter data on a day | Filled from EMS data; if the EMS has no value either, the quarter-hours are excluded. |
| More than 4 missing quarter-hours of meter data on a day | The day is excluded from both realised results and full potential, so that the capture rate compares like with like. |
| Meter and EMS data differ | Meter data prevails; the difference is logged. |
| No EMS status available | Zero battery output while the optimizer report shows a position is counted as downtime and marked as unconfirmed. |
| Optimizer report missing | The full potential is shown; realised results follow once the report is available. |
| Only a monthly optimizer report | Realised results have monthly granularity: no realised results below month level, and the recalculation per quarter-hour is replaced by a check of monthly volumes against meter data. Days excluded for missing meter data cannot be removed from realised results, so such a month is marked as not fully comparable. |
| Less than a year of meter data | The annual offtake that sets the energy tax bracket is annualised from the months available and checked against the energy invoice. |
| No connection-meter data | Grid costs and energy tax are switched off in the full potential, and both sides of the capture rate are market revenue: degradation and grid costs are shown as '—' for realised and expected results alike. |
| Fewer than 7 complete days of battery-meter data | The round-trip efficiency is taken from the intake, and otherwise set at 88%. |
| No stored energy at the start of the period in the EMS log | The first day starts at the midpoint of the usable capacity. |
| No meter data for PV or consumption | Both are taken as zero, and only the GTV limits the battery. |
13Preliminary and final results
The BESS Backtest is filled as data becomes available: the full potential once meter data and project info are in, realised results once the optimizer report is in. No result reaches a client before an analyst has reviewed it (section 5). A month's results are preliminary for three months after the month ends, while meter data, optimizer reports and invoices are still corrected, and every figure is triangulated with at least two sources in that time; the month is then final. Final results are not changed; a later correction is logged and shown with the month concerned.
14Limitations
- Perfect foresight on auctions. The full potential knows the day-ahead and capacity prices of the day in advance, and every capacity bid in its plan is accepted; no optimizer can do this. Expected results at 80% of the full potential account for this. The cap on aFRR capacity prices limits the windfall from rare price spikes. The appropriate factor may differ between markets, for example between FCR and imbalance.
- A model, not a competitor. The full potential represents what was achievable within the rules of the markets, not the result that another optimizer would have achieved.
- Two-day horizon. Each day is optimised together with the next; value from holding energy over longer periods is not included. Stored energy carried between days is valued at the average day-ahead price of the day, which misvalues single days somewhat but largely cancels over a month.
- Sequential markets. The stages follow gate closure and are not optimised together; co-optimising all markets at once can earn more. In a test run, a plan made without hindsight on balancing prices exceeded the full potential on a part of the site-days for this reason (section 15).
- Price impact. The battery's own aFRR energy and imbalance volume moves the price against it by a slope estimated on six months of data with a weak fit; the aFRR bid ladder is not yet used. In the auctions, the battery is a price taker.
- Backtest limits. The full potential uses the settled imbalance price, but only within the backtest limits of section 7. They remove small and uncertain opportunities; a trader with a good forecast may earn more on imbalance than the limits allow, and a month with a capture rate above 100% is reviewed for this reason (section 9).
- Capacity prices. aFRR capacity is valued at the average price of accepted bids, because the highest accepted price is not published; TenneT pays aFRR capacity as bid, so the price the asset would have received can differ. Activated aFRR energy and imbalance are priced on the Dutch merit order, not on the cross-border price of PICASSO (TenneT – Imbalance Pricing System v6.3, TenneT – market update).
- Markets not yet modelled. Intraday and mFRR are left out of the full potential. Realised intraday revenue stays in the capture rate and is compared with imbalance and aFRR energy together; realised mFRR revenue is left out of the capture rate (section 4).
- Degradation costs. A fixed EUR 10 per MWh discharged is used for every project, based on a market pack price and a typical warranted cycle life, not on the warranty terms or degradation curve of the specific battery.
- Outcomes, not causes. The backtest shows where differences arise, not why they arise.
Effect on the capture rate
Some choices in section 7 make the full potential higher than any optimizer can reach; others make it lower. The 80% factor for expected results absorbs the net effect; which side dominates is to be calibrated on the first client months.
| Choice | Full potential | Reason |
|---|---|---|
| Perfect foresight on day-ahead and capacity prices | Higher | Capacity is offered before day-ahead prices are known; the model knows both. |
| Capacity bids always accepted | Higher | Rejected bids and the strategy of pay-as-bid auctions are not modelled. |
| Both aFRR capacity products | Higher | The model chooses between 4-hour blocks and the daily product with known prices. |
| aFRR capacity at the average accepted price | Lower | The highest accepted price is not published; a bidder who knew the auction could have earned more. |
| aFRR capacity price capped at the monthly 95th percentile | Lower | Blocks above the cap are valued at the cap. |
| Intraday left out | Lower | The real-time stage captures only deviations of at least EUR 50 per MWh from the day-ahead price; smaller intraday spreads are not in the full potential. |
| Settled imbalance price within the backtest limits | Higher or lower | The model knows the settled price (higher), but takes only gaps of at least EUR 50 per MWh and none in regulation state 2 (lower). |
| Maximum volume of 100% of rated power | Higher | No fixed share of power is held back from passive imbalance. |
| aFRR energy without a capacity contract | Higher | With hindsight, the model offers exactly what TenneT activates, within the backtest limits. |
| Restoring charge after aFRR activation outside the limits | Higher | Needed to keep the capacity commitment feasible. |
| Price impact | Lower | The model's own volume moves balancing prices against it. |
| Two-day rolling horizon | Higher | The stored energy at midnight is chosen with knowledge of the next day's prices. |
| Markets in sequence by gate closure | Lower | Co-optimising all markets at once can earn more. |
| Cycle limit applied as a daily average | Lower | An annual limit could allow more cycles on the most valuable days. |
| Reserves deliverable within the GTV | Lower | As for the real battery; capacity is limited by the connection. |
| Monthly peak no lower than that of the site without battery | Lower | Peak shaving below the site's own peak is not in the full potential. |
| Known monthly peak of the site without battery | Higher | The model knows from the first day how high the site's own peak will be that month. |
| Grid costs and energy tax switched off without connection-meter data | Higher | Costs that would apply are not charged; realised results are then compared on the same market basis (section 12). |
| No mFRR | Lower | Revenue from this product is outside the model; realised mFRR revenue is left out of the capture rate. |
| aFRR energy reservoir for the whole block | Lower, if practice is looser | German models back aFRR with 1 hour of energy; the Dutch manual requires the contracted period. |
| Solver simplifications | Slightly lower | The price impact is applied as linear segments, slightly conservative between their edges. |
15Open questions
The following questions require a decision and will be addressed in future versions of this methodology:
- aFRR energy reservoir. The TenneT aFRR manual v2.8 requires energy for the whole contracted period, which limits a 2-hour battery to about half its rated power in aFRR; German models use 1 hour. The alternative under review counts energy already delivered in the block, which frees part of the reservoir as the block runs. The reading is to be confirmed with TenneT and with an optimizer.
- Full potential below a plan without hindsight. In a test run over July–September 2026, a plan made without knowledge of balancing prices and settled on the actual day exceeded the full potential on 118 of 368 site-days, because the full potential commits capacity and the day-ahead position in stage 1 before balancing is considered. The option under review sets the full potential of a day to the higher of the full potential and the settled result of that plan.
- Model choices to confirm. Several choices of section 7 are proposed and await confirmation: the FCR rules, both aFRR products, reserves within the GTV, aFRR energy without a capacity contract, pro-rata activation and the settlement of shortfall, the exception for restoring charge, the downtime rule, the treatment of pooled batteries and of PV and consumption traded by the optimizer, grid costs, and the solver settings.
- Verification, objections and independent validation. Whether and how the optimizer can recalculate realised results and the full potential, how an objection to a result is handled, and which independent party validates the model, and how often.
- Reporting per asset in pooled portfolios. Optimizers that pool assets may record traded volumes at portfolio level only. Benchmarking the pool as a whole is proposed (section 7); how the pool and its sites are defined, and who confirms the allocation key, needs to be agreed per optimizer.
- Other assets behind the connection. Sites may also contain a combined heat and power unit (CHP), an electric boiler, a heat pump, a heat buffer, wind turbines or EV chargers. These assets share the GTV and the monthly import peak with the battery. Optimizers usually control the whole site, not only the battery: a grower with a CHP, for example, typically has the optimizer dispatch the CHP and the battery together. The question is whether the full potential treats the other assets as given, using their metered output per quarter-hour as is now done for PV and consumption, or optimises them as well (section 16). Treating them as given requires only an electricity meter per asset, but judges the optimizer on the battery alone.
- Capture rate and downtime. The capture rate divides by the full potential at full availability, so downtime lowers it although the delta with expected results shows downtime as a separate driver. The alternative is to divide by the full potential with actual downtime, so that the capture rate measures trading only.
- Stored energy carried in realised results. The full potential reports the change in stored energy over each day as a separate driver. Whether realised results report the same driver, using the stored energy in the EMS log, so that single days compare like with like, is to be decided.
- Peak shaving. The full potential does not lower the connection's monthly peak below that of the site without battery, whereas realised grid costs credit a battery that does. Whether the full potential should include peak shaving, which requires an optimisation over the whole month, is to be decided.
- Reduced available power. Reduced power is not counted as downtime. Whether the run with actual downtime should also use the available power reported by the EMS is to be decided.
- mFRR. Whether batteries can participate in Incident Reserve, and on which terms, before mFRR is added to the full potential.
- Intraday data. When continuous intraday prices per quarter-hour, with their volatility, are collected from licensed EPEX Spot data; until then, intraday is left out of the full potential (section 4).
- Energy tax. Whether, under MLOEA, energy tax applies per allocation point, so that the battery's own annual offtake sets the bracket (Minister of Finance); and whether the exemption for supply to an energy storage facility can apply to a battery on its own allocation point.
- PV under earlier SDE++ rounds. PV installations from rounds before 2023, and smaller installations, keep their subsidy at negative prices. For them, curtailing at negative prices understates the value of storing PV; whether to collect the subsidy decision for such sites is to be decided.
- Small full potential. The full potential can be small, for example in a month with much downtime. How the capture rate is presented when the full potential of a period is small.
- Calibration of the backtest limits and the 80% factor. The minimum price gap of EUR 50 per MWh, the maximum volume and the exclusion of regulation state 2 are reviewed together with the 80% factor once realised imbalance results of clients are available. The review also covers the unavailability included in Modo Energy's factor, and the proposal to limit the ramp rate of passive balancing (ACM).
- FCR activation period. The minimum period for which batteries must deliver FCR is under review by ACER (decision expected by early 2027); the model follows the current 15 minutes until then.
16Backlog
The current version covers the markets and site limits that determine most of the revenue of Dutch batteries, with data that clients and their optimizers can provide today. The features below are planned for later versions. Each would make the backtest more complete, but requires data or model work that client demand does not yet justify.
- Intraday stage. Re-planning against continuous intraday prices per quarter-hour, once these are collected from licensed EPEX Spot data (EPEX Spot market data (EEX Group webshop)).
- mFRR (Incident Reserve). Adding mFRR to the full potential once battery participation is confirmed; activated volumes are already in the TenneT data.
- aFRR bid ladder. Estimating the price impact from TenneT's merit order list of aFRR bids per quarter-hour (TenneT – merit order list aFRR), instead of the slope on activated volume.
- Highest accepted aFRR capacity price. Valuing aFRR capacity at the highest accepted price per block, once a source publishes it.
- Annual cycle budget. Allowing more cycles on the most valuable days within an annual or lifetime limit, instead of a daily average.
- Co-optimised stages. Optimising capacity, day-ahead and real time together, as an upper bound next to the sequential full potential.
- Longer look-ahead. A look-ahead of three days for batteries above 6 hours, as Modo Energy uses, and a look-ahead on every day where the two-day solve is infeasible.
- Peak shaving. Lowering the connection's monthly peak below that of the site without battery, with an optimisation over the whole month.
- Earlier periods. Months before April 2026, with hourly day-ahead prices before 1 October 2025 and 24-hour aFRR blocks before 11 November 2025, and the energy tax rates of 2025 and the brackets below 50,000 kWh.
- Pools across connections. Benchmarking a pool of batteries behind several connections as a whole (section 7).
- Partial availability. Using the available power of a derated battery in the run with actual downtime.
- Backtest limits per project and per balancing product. Limits set per project or per product once realised imbalance results allow calibration.
- Plan without hindsight. Refining the internal stochastic benchmark (section 5): real-time information, PV forecast scenarios, capacity bids without known prices, whole-MW bids and a risk-averse plan.
- Congestion revenue. Compensation under a capacity limitation or steering contract (CBC, CSC) and revenue from redispatch via GOPACS come on top of wholesale and balancing revenue. The limits of such contracts already apply in the full potential when declared (section 7); including the revenue requires the bids, activations and compensation per site and the terms of each contract.
- Supplier-specific degradation. Degradation costs are now a fixed EUR 10 per MWh discharged. A battery-specific cost would use the warranty terms, degradation curve and replacement cost of each battery, which few clients can provide in a comparable form.
- Net results after fees. A view of realised results after the fee of the optimizer and other service costs, next to the gross view. It shows what the owner keeps, and requires the fee terms of each optimizer contract and the monthly invoices.
- Market-specific expected results. Expected results use one factor of 80% on the total. A factor per market, and a band around the capture rate, would require evidence per market that is not yet available.
- Additional revenue from prequalification. A forecast of what the asset could additionally earn if it were prequalified for FCR, aFRR or mFRR, or for more power in those markets, or if the optimizer were mandated for markets now outside its mandate. This shows the value of a prequalification before the client invests in it.
- Verification of FCR and aFRR delivery. A check of FCR and aFRR delivery against the system frequency and the TenneT setpoints requires EMS data per second: about 31.5 million rows per asset per year, against 35,040 rows at quarter-hour resolution.
- Performance alerts. Checks that detect a drop in performance and prompt the ICM to contact the client: a rise in downtime, a market shock, or dispatch that departs from the optimizer's usual pattern. They require live or daily access to the EMS and the meters.
- Site potential. A full potential for the whole site rather than the battery alone, in which the battery, a CHP, an electric boiler and a heat buffer are optimised together. For a grower with a CHP, this captures the trade-off between running the CHP for heat and CO2 for the crops and leaving room for the battery on the grid connection. It requires, per quarter-hour, a heat meter on each heat source (CHP, electric boiler, heat pump) and the level of the heat buffer, a gas meter on the CHP, and the CO2 demand of the crops where the CHP supplies it; in addition gas prices, the price of CO2 emission allowances where these apply, the cost of alternative CO2 supply, and the technical limits of each asset, such as minimum run times and start costs.
- Additional dispatch constraints. Constraints beyond the state of charge, such as fixed trading windows or ramp rates, would make the full potential more site-specific but require the full EMS configuration of each site.
17Sources
All sources consulted for this methodology, including those cited in the text.
| Source | Used for |
|---|---|
| Market data and balancing | |
| EPEX Spot | Day-ahead and intraday auction results |
| EPEX Spot market data (EEX Group webshop) | Continuous intraday price indices and trade data for the Netherlands, as a paid data package |
| EPEX Spot indices, EPEX Spot index description | Definitions of the EPEX Spot intraday price indices, including ID1 |
| EPEX Spot – trading brochure, EPEX Spot – trading products | Day-ahead gate closure and intraday products |
| EPEX Spot general conditions for market data (July 2024) | Conditions for the use of EPEX Spot market data |
| EPEX Spot – go-live of intraday auctions (13 June 2024) | Start of the intraday auctions on 13 June 2024 |
| ENTSO-E – intraday auctions on SIDC, Nord Pool – SIDC intraday auctions | Design and schedule of the intraday auctions |
| NEMO Committee – 15-minute MTU in SDAC | Day-ahead per quarter-hour from delivery day 1 October 2025 |
| ENTSO-E Transparency Platform | Day-ahead prices |
| Energy-Charts | Day-ahead prices per quarter-hour (SMARD data, CC BY 4.0) |
| ENTSO-E Transparency Platform – volumes and prices of contracted balancing reserves | aFRR capacity prices and contracted volumes per block, product and direction (articles 17.1.B and C) |
| regelleistung.net – tender results | FCR auction results per 4-hour block |
| TenneT – transparency download page | Settlement prices, regulation state and settled aFRR volumes |
| TenneT – merit order list aFRR | aFRR bid ladder, for a later estimate of price impact |
| ENTSO-E Transparency Platform, article 17.1.C | aFRR and mFRR capacity prices |
| TenneT | Imbalance prices and a/mFRR activations (balance delta) |
| TenneT – 12-second balance delta | Real-time signal within the quarter-hour |
| TenneT – settlement prices, settlement prices graph | Imbalance and regulation prices per quarter-hour |
| TenneT – Imbalance Pricing System v6.3 | Regulation states and imbalance pricing |
| TenneT – market update | PICASSO cross-border price not used in Dutch prices |
| TenneT – volumes settled aFRR and incident reserves | Settled aFRR volumes |
| enspired – BESS in the Netherlands | Dutch balancing markets for batteries: aFRR in 4-hour blocks |
| TenneT – ancillary services | Procurement of FCR, aFRR and mFRR capacity |
| TenneT FCR manual for BSPs v3.3 | FCR requirements for batteries: 15 minutes and 1.25:1 |
| ENTSO-E – FCR | FCR auction: daily, 4-hour symmetric products, pay as cleared |
| ACER – public notice ELE-2026-007 | Review of the FCR activation period for batteries |
| TenneT aFRR manual for BSPs v2.8 | aFRR product, auction, energy reservoir and free bids |
| TenneT – 4-hour aFRR contracts, Q1 2026 update | Move to 4-hour aFRR blocks; dynamic dimensioning |
| TenneT – Q3 2026 update, TenneT – MARI | Incident Reserve replacing mFRRda; connection to MARI |
| TenneT – intraday gate closure | Intraday gate closure at the Dutch borders |
| TenneT – balancing markets | Definitions of FCR, aFRR, mFRR, ISP and BRP; passive balancing |
| TenneT – balance responsible parties | Definitions of BRP and imbalance |
| TenneT – balancing service providers | Definition of BSP |
| ACM – code change proposal on the ramp rate of passive balancing | Passive balancing by fast units |
| Solar Magazine – regulation state 2 (2024), Solar Magazine – PICASSO and regulation state 2 (2026) | Regulation state 2 known afterwards; frequency in 2026 |
| regelleistung.net | FCR auction results |
| Grid connections, tariffs, taxes and costs | |
| ACM – code decision on contracted transport capacity (2025) | Definition of GTV |
| ACM – code decision on alternative transport rights (2024) | Definitions of TDTR and TBTR |
| ACM – code change on multiple suppliers on one connection (2016) | Definitions of allocation point and MLOEA |
| Stedin – sample invoice with explanation | Definitions of kW-max, contracted capacity and EAN |
| Enexis – connections with extra metering points | Definition of secondary allocation points |
| Liander – transport tariffs 2026 | Reference for grid costs in the example data |
| Vattenfall – energy tax rates 2026 | Energy tax per bracket |
| Vattenfall – declarations for energy tax | Declaration for supply to an energy storage facility |
| Ministry of Finance – double energy tax on storage | Exemption for storage on its own connection (article 50(4) Wbm) |
| Repowered – energy tax exemption for generation and storage | Conditions of the storage exemption |
| RVO – SDE++ and negative electricity prices | No subsidy at negative prices, per round |
| BloombergNEF – battery pack prices 2025 | Degradation costs |
| Multiple suppliers on one connection (MLOEA) | |
| ACM code decision on multiple suppliers on one connection (Staatscourant 2017, 39821) | Origin of MLOEA (2017), metering variants |
| ACM – new codes under the Energiewet (2026) | MLOEA carried over without change of policy |
| Systeemcode elektriciteit 2026, articles 2.3 and 2.5–2.10 | Current rules for additional allocation points |
| Westland Infra – extra metering point | GTV per connection; peaks of allocation points count for the connection |
| Liander – extra metering point | GTV unchanged; separate data per allocation point |
| Stedin – extra metering point | Conditions for small connections |
| Minister of Finance – letter to Parliament (2024) | Energy tax per allocation point |
| Congestion management | |
| GOPACS – frequently asked questions | Definitions of GOPACS and congestion |
| GOPACS – glossary | Definition of transport capacity |
| GOPACS – capacity limitation contract | Definition of CBC |
| GOPACS – redispatch | Definition of redispatch |
| Enexis – capacity steering contract | Definition of CSC |
| Withthegrid – capacity limitation contract, RVO – flexible contracts | Activation and compensation of CBC |
| Other approaches and model practice | |
| Modo Energy – BESS benchmark | Comparison with other approaches |
| Modo Energy – Germany index methodology | Sequence of markets, foresight, state of charge at midnight |
| Modo Energy – GB dispatch model, GB model calibration, core dispatch model | Foresight per market, calibration, horizon |
| Modo Energy – ERCOT battery degradation | Degradation as a cost per MWh |
| Modo Energy – model assumptions | Calibration factor for expected results |
| Modo Energy – GB Benchmarking | Benchmarking of realised revenue in Great Britain |
| Enervis battery storage index (ESS News, July 2026) | Industry practice |
| Clean Horizon storage index (Nord Pool) | Industry practice |
| Aurora Energy Research – Flexplorer battery benchmarking | Industry practice |
| enspired – portfolio performance, methods of BESS revenue assessment | Realised portfolio revenue; methods of revenue assessment |
| E6 Group | Simulation of a client's asset on request |
| Energy-Storage.news – new German BESS revenue indexes (February 2025) | Industry practice |
| Re-Twin Energy and FfE – whitepaper on battery valuation (May 2026) | Backtests against structural revenue levels |
| HiGHS | Open-source solver used for the full potential |
| KYOS – BESS benchmarks | Comparison with other approaches |
| KYOS battery index | Foresight per market; ID1 |
| KYOS – energy storage report (February 2025) | Cycle limit, efficiency, cap on passive imbalance |
| KYOS – PowerBot FAQ | Cycle limit and cost per MWh throughput |
| RWTH battery-charts | Sequence of markets, aFRR energy, revenue factor |
| Hornek et al. – intraday trading strategies | Intraday strategies against perfect foresight on ID1 |
| Oeltz – intraday indices | Effect of the index window; terminal state of charge |
| Schaurecker et al. – rolling intrinsic | Rolling intrinsic policy; degradation cost |
| Zhang, Ridinger and Wozabal – FCR and storage | State-of-charge bounds for FCR |
| Kortmann et al. – sequential markets | Order of markets by gate closure |
| Phelas – FCR versus aFRR | State of charge held for FCR |
| Montel – BESS operational data | Comparison with other approaches |
| Energy-Storage.news – optimisers, tolls and performance warranties | Effect of warranty limits |
| Energy-Storage.news – normalised revenue and percent of perfect foresight | Grading of perfect-foresight methods |
| enspired – framework for portfolio performance | External assurance of optimizer reports |
| enspired – monthly BESS revenues, Q3 2026 | Presentation of revenue per market |
| mijnbatterij.nl – monthly results | Peer results |
| Optimizer reporting: public statements on own websites, checked 6 October 2026 | |
| Axpo | No public detail on reporting. |
| Balanz | Every forecast, action and trade is logged with a rationale and outcome; no report format described. |
| Danske Commodities | No public detail on reporting. |
| E6 Group | Settlement data per portfolio and disaggregated by asset, DSO metering, TSO imbalances and reconciliation; API. |
| Eddy Grid | Dashboard with earnings per day; revenue per asset on the invoice; fee on net profit after grid and supplier costs. |
| Edmij | Metered data, traded volumes and prices per quarter-hour, so that customers can verify their invoice. |
| EFS | No public detail on reporting. |
| Eneco | A report with full insight into control and revenues; format and frequency not stated. |
| Engie | No public detail on reporting. |
| Enova (Vitec Enova) | Monthly reports and performance-based settlement. |
| enspired | Customer portal with real-time tracking of trades, markets and asset data. |
| Essent | No public detail on reporting. |
| Flexcity | Dashboard with real-time activations and a monthly performance report. |
| Friday Energy | Customer portal, content not described; monthly payouts. |
| Greenchoice | No public detail on reporting. |
| InCommodities | Platform with cash flow per product for wind and solar assets; no detail for batteries. |
| Next Kraftwerke | Portal with live data: state of charge, technical parameters and real-time revenues. |
| NextEnergy | Home batteries: app with running total and an annual battery statement priced per hour. |
| Northpool | No public detail on reporting. |
| Ørsted | No public detail on reporting. |
| Pure Energie | No public detail on reporting. |
| Repowered | Real-time insight into installations and financial results on its own platform. |
| RWE | Reporting and account statements on the use of the asset; no detail for batteries. |
| Scholt Energy | Insight into the markets the battery is active in, activation moments and how revenues arise. |
| Statkraft | United Kingdom: monthly reports of gross margins and net payments; portal with availability, schedules, metering and indicative results. |
| The Optimizer Company | No public detail on reporting. |
| Vandebron | No public detail on reporting. |
| Vattenfall | Real-time insight into site data; no detail on trading revenue. |
| Yuso | Real-time reporting dashboards and periodic review meetings. |
18Definitions and abbreviations
Definitions follow TenneT, GOPACS, the ACM and the grid operators where these publish one; the source column shows where each definition comes from. Terms marked ICM are defined for this methodology.
| Term | Meaning | Source |
|---|---|---|
| ACER | European Union Agency for the Cooperation of Energy Regulators. | ACER |
| aFRR | Automatic frequency restoration reserve. TenneT procures aFRR through bid obligations: BSPs are contracted to provide balancing energy bids to TenneT at certain times. | TenneT |
| Allocation point | Virtual point at which the energy exchange between an installation and the grid is administratively assigned to a market party, as if it were measured at the transfer point of the connection. | ACM |
| Backtest limits | Rules that restrict how far the full potential may use balancing prices known only after delivery: a minimum price gap of EUR 50 per MWh, a maximum volume of 100% of rated power and no position in regulation state 2 (section 7). | ICM |
| Balancing capacity | Power, in MW, that a balancing service provider holds in reserve for TenneT for a period, such as a 4-hour block. | TenneT |
| Balancing energy price | Price of activated upward or downward balancing energy in a quarter-hour: the price of the highest activated aFRR bid upward, or the lowest downward, or the Incident Reserve bid where that is more extreme. | TenneT |
| Balancing energy | Energy, in MWh, delivered upward or downward when TenneT activates balancing capacity or a balancing energy bid. | TenneT |
| BESS | Battery energy storage system. | ICM |
| BRP | Balance responsible party: responsible for maintaining the balance between demand and supply in its own portfolio, and financially responsible for imbalances in its portfolio of allocation points. | TenneT |
| BSP | Balancing service provider: helps restore system frequency by offering balancing services to TenneT; one or more assets, or a pool of smaller assets, must be prequalified. | TenneT |
| Capture rate | Realised results ÷ full potential × 100%, rounded to whole percentages (section 9). | ICM |
| CBC | Capacity limitation contract: the connected party agrees with its grid operator to limit the requested transport capacity when the grid operator requests it. | GOPACS |
| CHP | Combined heat and power unit (in Dutch: WKK): typically a gas engine that produces electricity and heat; in greenhouses also CO2 for the crops. | ICM |
| Congestion | The situation in which the demand for transport of electricity exceeds the available transport capacity. | GOPACS |
| Connection and transport agreement | Agreement between the connected party and the grid operator for the connection and the transport of electricity; it sets the GTV and the connection category. | ICM |
| CSC | Capacity steering contract (capaciteitssturingscontract): the connected party adjusts its consumption or feed-in, down or up, at agreed times or when the grid operator requests it, against a fee; at Enexis it replaces the CBC. | Enexis |
| D-1 | The day before delivery. | ICM |
| DA | Day-ahead market (EPEX Spot), in which prices are set one day before delivery. | ICM |
| Delta with expected results | Realised results − expected results, in EUR. A negative value indicates results below expected results. | ICM |
| Depth of discharge | Share of the nominal capacity that may be discharged in one cycle: maximum state of charge − minimum state of charge. | ICM |
| Downtime | Time in which the battery cannot charge or discharge because of a fault or maintenance: every quarter-hour that a fault or maintenance event in the EMS log touches (section 10). | ICM |
| EAN | Unique 18-digit identification number of a connection, used among other things to exchange meter data between supplier and grid operator; each extra metering point receives its own EAN. | Stedin, Enexis |
| EMS | Energy management system that controls the battery on site. | ICM |
| Energy tax | Energiebelasting: tax per kWh of electricity supplied through a connection, at a rate that falls with the annual offtake, in brackets. | Vattenfall |
| ENTSO-E | European Network of Transmission System Operators for Electricity, which runs the Transparency Platform. | ENTSO-E |
| Expected results | 80% of the full potential, in EUR (section 8). | ICM |
| FCR | Frequency containment reserve: activated automatically on the basis of the system frequency rather than by the TSO; auctioned per 4-hour block. | TenneT, regelleistung.net |
| Full potential | Maximum earnings in EUR of the same battery on the same site, with perfect foresight of auction prices, balancing prices within the backtest limits, a two-day rolling horizon, and within the limits of the site (section 7); calculated at full availability and with actual downtime. | ICM |
| GOPACS | The tool by and for grid operators to reduce congestion on the electricity grid; a partnership of the Dutch grid operators for joint congestion management. | GOPACS |
| GTV | Gecontracteerd transportvermogen (contracted transport capacity): determines how much power a large consumer may transport over the grid; the power a business expects to take at most in a given period. Contracted separately for import and export. | ACM, Stedin |
| ID | Intraday market, in which quarter-hours are traded until shortly before delivery. | ICM |
| ID1 | EPEX Spot intraday price index: the volume-weighted average price of the trades in the last hour before delivery of a product. | EPEX Spot |
| ID3 | EPEX Spot intraday price index: the volume-weighted average price of the trades in the last three hours before delivery. | EPEX Spot |
| Imbalance | The difference between the metered and the traded volumes of a BRP portfolio, settled with the BRP at the imbalance price. | TenneT |
| Incident Reserve | TenneT's manually activated reserve (mFRR), procured with energy bids since 1 September 2026, replacing the directly activated mFRR product. | TenneT |
| ISP | Imbalance settlement period of 15 minutes; a BRP can correct its imbalance until the end of the ISP. | TenneT |
| kW-max | Separate register in the electricity meter that records the highest power taken from the grid per month; charged per kW per month. | Stedin |
| MARI | European platform for the exchange of mFRR balancing energy; TenneT connected on 2 December 2025. | TenneT |
| mFRR | Manual frequency restoration reserve, activated on instruction of the TSO. Since 1 September 2026, TenneT's mFRR is Incident Reserve (see there). | TenneT, TenneT |
| MLOEA | Meerdere leveranciers op één aansluiting (multiple suppliers on one connection): a connection with one or more additional allocation points, each with its own EAN, meter, supplier and BRP, while the connection agreement and GTV remain one. | Systeemcode elektriciteit 2026, Enexis |
| MSP | Metering service provider: certified company responsible for the meters of a connection and for providing their data. | ICM |
| Nominal capacity | Energy capacity of the battery as stated on the datasheet or in the warranty, in MWh. | ICM |
| Passive balancing | A BRP deliberately takes an imbalance in its portfolio opposite to the system imbalance and receives the imbalance price for it. | TenneT |
| Perfect foresight | Optimisation with prices known in advance; an upper bound for achievable results. | ICM |
| PICASSO | European platform for the exchange of aFRR balancing energy, which TenneT joined in October 2024; its cross-border price is not used in Dutch balancing energy and imbalance prices. | TenneT |
| Price impact | Movement of the balancing energy or imbalance price against the battery caused by its own volume, at α per MW (section 7). | ICM |
| Project | One site with one connection agreement and one or more battery assets. | ICM |
| Project info | Site limits used in the full potential: power, state of charge, round-trip efficiency, prequalification, warranty, GTV, and PV and consumption (section 7). | ICM |
| Rated power | Maximum charge and discharge power of a battery, in MW. | ICM |
| PV | Solar photovoltaic installation. | ICM |
| Realised results | Earnings of the battery in EUR per revenue driver, from the optimizer report, net of grid costs, energy tax and degradation costs calculated from meter data, before fees (section 6). | ICM |
| Redispatch | The grid operator reduces the demand for transport capacity using intraday or same-day bids from the market. | GOPACS |
| Regulation state | State of TenneT's balancing in a quarter-hour: 0 no regulation, +1 upward only, −1 downward only, 2 both directions; it determines which price settles the imbalance. | TenneT |
| Revenue driver | Component of realised results, full potential and expected results: day-ahead, intraday, imbalance, FCR, aFRR, mFRR, grid costs (including energy tax), degradation costs, stored energy carried and downtime. | ICM |
| RTE | Round-trip efficiency: energy discharged ÷ energy charged, corrected for the change in stored energy over the period. | ICM |
| SDAC | Single day-ahead coupling: the European coupling of day-ahead markets. | NEMO Committee |
| SDE++ | Stimulering Duurzame Energieproductie en Klimaattransitie: Dutch operating subsidy for renewable energy, paid per unit produced. | RVO |
| Secondary allocation point | An allocation point that the grid operator assigns to a connection in addition to the primary allocation point; since 2026 called an additional allocation point. | ACM, Systeemcode elektriciteit 2026 |
| SoC | State of charge of the battery, as a percentage of nominal capacity. | ICM |
| Stochastic benchmark | Internal check on the full potential: a plan made on scenarios without knowledge of the day's balancing prices, settled on the actual day (section 5). | ICM |
| Storage capacity | Nominal energy capacity of a battery, in MWh, as stated on the datasheet or in the warranty. | ICM |
| Stored energy carried | Change in stored energy over a day, valued at the average day-ahead price of the day × √RTE; a driver of its own in the full potential (section 7). | ICM |
| TBTR | Time-block bound transport right: the right to transport within time blocks agreed with the grid operator; available on regional grids. | ACM |
| TDTR | Time-duration bound transport right: the right to transport during at least 85% of the hours in a year; available on the TenneT high-voltage grid. | ACM |
| TSO | Transmission system operator; in the Netherlands, TenneT. | ICM |
| Usable capacity | Nominal capacity × (maximum state of charge − minimum state of charge), in MWh. | ICM |
| Value ladder | Variants of the full potential, each adding one market or freedom: L0 day-ahead only, L1 plus capacity markets, L2 the full potential, L3 the theoretical ceiling (section 5). | ICM |
| Wbm | Wet belastingen op milieugrondslag: the Dutch act on environmental taxes, which includes the energy tax. | Ministry of Finance |
| YTD | Year to date. | ICM |
19Changes to this methodology
Every change is published with a new version number and date, and clients are informed by email. After a change, past months are recalculated under the new rules where the data allows; months that cannot be recalculated are marked as not comparable. The three most recent versions are shown first.
| Version | Date | Change |
|---|---|---|
| 0.33 | 13 Oct 2026 | Full potential aligned with the current model: two-day rolling horizon with the stored energy at midnight chosen together with the next day, and stored energy carried as a driver of its own, replacing the fixed midpoint at midnight; backtest limits with a maximum volume of 100% of rated power instead of 30%, within the room the connection leaves; aFRR energy without a capacity contract and the exception for restoring charge after activation; imbalance prices by regulation state; price impact on aFRR energy and imbalance; aFRR capacity in both products at the average accepted price, capped at the monthly 95th percentile; pro-rata activation and settlement of shortfall; reserves within the GTV; intraday left out until continuous intraday prices are collected, and the ID1 index no longer used. Rated power, storage capacity and prequalified MW per product added, with defaults where the intake gives none; round-trip efficiency measured over at least 7 days and corrected for the change in stored energy; downtime from EMS status events; PV, consumption and pooling specified. Checks on the model, value ladder and stochastic benchmark added to section 5; results final three months after the month. Limitations, effect on the capture rate, open questions and backlog updated; industry practice, sources and definitions added. |
| 0.32 | 7 Oct 2026 | Full potential specified per decision: one day per run, per quarter-hour, in three stages by gate closure; perfect foresight on day-ahead and capacity auctions and on the ID1 intraday index; settled imbalance prices used only within a rule (EUR 50 threshold, 30% cap, no regulation state 2); FCR at most rated power ÷ 1.25 with 15 minutes of energy; aFRR per direction with energy for the whole block, and energy held for FCR and aFRR added up; mFRR left out; all assets on a connection optimised together; usable capacity from nominal capacity and state-of-charge window; measured round-trip efficiency; cycle limit plus degradation cost; grid costs on the connection peak with kWh tariff and energy tax, the bracket set from the connection meter; congestion limits applied when declared; two runs per day. Until licensed intraday data are in place, intraday and imbalance are compared together; realised mFRR revenue is left out of the capture rate. aFRR and mFRR shown as separate drivers; imbalance and balancing energy prices defined per direction; grid costs formula completed; capture rate defined on the full potential at full availability. Industry practice added to section 3 and effect on the capture rate to section 14. Correction: Dutch balancing energy and imbalance prices do not use the PICASSO cross-border price. Open questions added on capture rate and downtime, peak shaving, reduced available power, aFRR, mFRR, intraday licence, energy tax, PV subsidy and FCR; questions on the import peak and on negative full potential closed. Sources and definitions added. |
| 0.31 | 7 Oct 2026 | First versions without intraday in the full potential until licensed EPEX Spot data are in place. |
Show all 33 versions
| Version | Date | Change |
|---|---|---|
| 0.30 | 7 Oct 2026 | Intraday driver valued with licensed EPEX Spot market data, as no free continuous intraday prices exist; market data paragraph and limitation on published capacity prices added; sources on market data added. |
| 0.29 | 6 Oct 2026 | Difference with expected results renamed to delta with expected results; 80% norm applied to the total only, with expected results allocated to drivers pro rata to the full potential; deprioritised features renamed to backlog, with net results after fees added; dispatch keeps import within the GTV. |
| 0.28 | 6 Oct 2026 | Markets outside the optimizer mandate excluded from the full potential; open question closed. |
| 0.27 | 6 Oct 2026 | Downtime driver explained per column (realised zero, expected results in downtime, difference lost); quarter-hours above the GTV counted with a 1 kW tolerance for solver rounding. |
| 0.26 | 6 Oct 2026 | Client checklist made specific: connection and transport agreement, EAN codes under MLOEA, warranty clauses and the four required clauses of the optimizer contract; open question on markets outside the mandate; source column added to the definitions. |
| 0.25 | 6 Oct 2026 | Role of MLOEA in the backtest explained (data, not model); EAN codes added to the checklist; supply arrangement removed from the project info; MLOEA sources added; deprioritised feature renamed to additional revenue from prequalification. |
| 0.24 | 6 Oct 2026 | Type and basis of every figure stated: measured, reported, calculated, modelled or estimated. |
| 0.23 | 6 Oct 2026 | Other assets behind the connection added as an open question; site potential, with a grower with a CHP as example and its heat, gas and CO2 data, added as a deprioritised feature. |
| 0.22 | 6 Oct 2026 | Editorial review: abbreviations spelled out at first use; dashboard sections and the purpose of each calculation explained in the text; one term for the optimizer report. |
| 0.21 | 6 Oct 2026 | Structure simplified: definitions and glossary merged into one section; project info moved into the full potential; checklist marks required items and drops supply contracts; symbols in the calculation of realised results explained; missing data and deprioritised features written as stand-alone text; public reporting of 29 optimizers reviewed; definitions aligned with ACM, Stedin and Enexis. |
| 0.20 | 6 Oct 2026 | Glossary aligned with the definitions of TenneT and GOPACS. |
| 0.19 | 6 Oct 2026 | Optimizer report of traded volumes and prices as the source of realised results; monthly granularity where only a monthly report exists; aFRR capacity prices from the ENTSO-E Transparency Platform; sources section added. |
| 0.18 | 6 Oct 2026 | Results shown as soon as the data allows and marked preliminary until triangulated. |
| 0.17 | 6 Oct 2026 | Triangulation adopted as a principle. |
| 0.16 | 5 Oct 2026 | Checklist ordered by delivering party; consumption meter added as a cross-check; precedence of meter data over EMS data explained. |
| 0.15 | 5 Oct 2026 | Checklist of documents and data included, replacing the downloadable data template; downtime descriptions taken from the EMS alarm log; full potential limited to prequalified markets and volumes. |
| 0.14 | 5 Oct 2026 | Collected data specified per source and delivering party; EMS alarm log and prequalification added. |
| 0.13 | 5 Oct 2026 | Full revision of the text. Realised results reported gross, before fees. Downtime derived from the EMS status; minimum state of charge from intake as a dispatch constraint; open questions separated from deprioritised features. |
| 0.12 | 5 Oct 2026 | Full potential defined as perfect foresight; basis of the 80% stated; capture rate rounded to whole percentages. |
| 0.11 | 5 Oct 2026 | Downtime driver renamed to "lost to downtime". |
| 0.10 | 5 Oct 2026 | Simulated market prices and simplified grid tariffs in the example projects stated explicitly. |
| 0.9 | 5 Oct 2026 | Supply arrangement (single supplier or MLOEA) added; data template (Excel) published. |
| 0.8 | 5 Oct 2026 | Wear renamed to degradation costs and set at EUR 10 per MWh discharged. |
| 0.7 | 30 Sep 2026 | Aligned with ICM methodology standards: independence principle, relation to the Terms & Conditions, publication of changes. |
| 0.6 | 30 Sep 2026 | Text tightened; definitions and section names aligned with the dashboard; realised results calculated directly per driver. |
| 0.5 | 30 Sep 2026 | Precedents for 80%; open questions; downtime timeline. |
| 0.4 | 30 Sep 2026 | Intraday and a/mFRR added; zoom to quarter-hours; difference with expected results introduced. |
| 0.3 | 29 Sep 2026 | Downtime in hours and as a revenue driver; full potential at full availability. |
| 0.2 | 29 Sep 2026 | Expected results at 80%; full potential; downtime table. |
| 0.1 | 29 Sep 2026 | First version: day-ahead, imbalance and FCR; capture rate. |