The Revenue Stack Is Only as Good as Your SoC Estimate
BESS revenue stacking — combining energy arbitrage, frequency regulation, and capacity payments on the same physical asset — is the operating model that justifies utility-scale battery economics. In the NEM (National Electricity Market) in Australia, that typically means combining FCAS (Frequency Control Ancillary Services) enablement with wholesale spot arbitrage. In PJM and CAISO in the US, the equivalent is RegD/RegA frequency regulation layered on top of locational marginal price (LMP) arbitrage. In both market structures, the dispatch optimizer depends on a core input: how much energy does the battery actually have available right now, and with what confidence?
That's the SoC accuracy question, and it has direct financial consequences that most operators underestimate until they've experienced a non-compliance event.
How FCAS Works and Why SoC Uncertainty Matters
FCAS in the Australian NEM is structured across eight contingency and regulation services: Raise 6-second, Raise 60-second, Raise 5-minute, Lower 6-second, Lower 60-second, Lower 5-minute, Regulation Raise, and Regulation Lower. A BESS bidding FCAS Raise services is committing to absorb power (charge) if grid frequency drops below 50 Hz, and bidding FCAS Lower services commits to inject power (discharge) if frequency rises above 50 Hz. The market clears every 5 minutes, but regulation services must respond within seconds.
To bid a given MW quantity into FCAS Raise, the battery must have sufficient headroom in SoC — it needs to be able to absorb additional charge. To bid into FCAS Lower, it needs sufficient SoC — energy to dispatch. AEMO's rebid rules allow participants to update bids up to close to dispatch time, but the cleared bid quantity creates an obligation. If you bid 30 MW of Raise 6-second service and AEMO dispatches you at 30 MW raise while your battery is actually at 94% SoC — not the 86% SoC your BMS reported — you can't absorb the full raise instruction. The result is a causer-pays charge and potential market non-compliance.
The SoC error that creates this problem doesn't have to be large. A 5% SoC overestimate on a 100 MWh asset is 5 MWh of phantom headroom. If the battery is bidding at an aggressive enablement level assuming that headroom exists, every 5-minute interval where frequency drives a raise instruction exposes the operator to a headroom shortfall. In active frequency events — which in the NEM occur multiple times per week — the probability of exposure in any given half-hour window is non-trivial.
SoC Estimation Error: Where It Comes From
BMS SoC is estimated through one of three primary methods, each with characteristic error modes:
Coulomb counting: Integrate current over time to track charge added and removed from a known starting state. Errors accumulate via current sensor offset (even a 0.2% sensor offset at 1C compounds to several percent SoC error per day of operation) and from undetected self-discharge. Coulomb counting is the backbone of most BMS implementations but requires periodic re-anchoring against a voltage-based estimate to prevent drift.
Open circuit voltage (OCV) lookup: At rest (no load), cell terminal voltage relaxes toward OCV, which maps to SoC via the cell's characteristic OCV-SoC curve. Accurate but only valid when the cell has been at rest long enough for electrochemical relaxation to complete — typically 1–2 hours for NMC, shorter for LFP (which has a flat OCV plateau that makes the mapping ambiguous in the middle SoC range). A BESS in active FCAS dispatch rarely sits idle long enough for a clean OCV reading.
Model-based Kalman filtering: Combines coulomb counting with an electrochemical cell model, using voltage measurements as the correction signal. Extended Kalman Filter (EKF) or Unscented Kalman Filter (UKF) variants are standard in modern BMS firmware. Accuracy depends heavily on the fidelity of the underlying cell model parameters — parameters that are fitted at commissioning and may not track changes as the cell ages and its internal resistance grows and its OCV curve shifts.
The compounding problem: as a cell ages, its internal resistance (R0) increases and its usable capacity decreases. A BMS using cell model parameters from commissioning is running an increasingly incorrect model as the cell ages. The SoC estimate degrades not just from random noise but from systematic model mismatch. By year two on a high-utilization asset, BMS SoC error from model mismatch alone can reach 3–6%, and peak errors during high-current transients can exceed 8–10%.
LMP Arbitrage as the Revenue Floor
Before addressing the FCAS optimization problem, it's worth establishing the floor. LMP (Locational Marginal Price) arbitrage — charging when prices are low, discharging when prices are high — is the baseline revenue stream for any grid-connected BESS. In US markets like PJM, day-ahead LMP volatility for a typical storage-relevant node runs in the range of $15–60/MWh spread between off-peak and on-peak hours, depending on year and location. At 85% round-trip efficiency (RTE) and 30 MWh of daily usable capacity, this translates to roughly $1,500–5,000/day in gross arbitrage revenue before degradation cost.
Degradation cost is the critical modifier. Every MWh dispatched wears the cells. A standard capacity fade model for NMC at typical operating conditions estimates 0.003–0.006% capacity fade per equivalent full cycle (EFC). On a 30 MWh asset with a 10-year operational target and $400/kWh replacement cost, the degradation cost per MWh dispatched is approximately $2–5/MWh. This should be included in every dispatch decision as an internal cost — dispatching at a spot price of $8/MWh while carrying a $4/MWh degradation cost is not profitable at the system level, even if it looks positive on the revenue side of the income statement.
Stacking FCAS on Top of Arbitrage
The revenue-stacking decision is an optimization problem. A BESS committed to FCAS Raise services needs to maintain SoC headroom. A BESS committed to FCAS Lower needs to maintain stored energy. Simultaneously running arbitrage — moving SoC in response to price spreads — creates a tension with the FCAS headroom/energy requirements.
The standard approach is to define an SoC operating band: for example, maintain SoC between 20–80% to support both raise and lower FCAS availability, and allow arbitrage dispatch only within a narrower inner band. At 80% SoC, the battery can absorb the raise service. At 20%, it can deliver the lower service. Between these bounds, arbitrage can proceed provided it doesn't breach the headroom thresholds for committed FCAS quantities.
A 5% SoC uncertainty radius changes this calculus. If your SoC estimate has a ±5% error band, your effective safe operating range for FCAS needs to be contracted by the uncertainty buffer: instead of 20–80%, you need to operate conservatively between 25–75% to maintain the same safety margin. On a 100 MWh asset, that's 10 MWh of capacity you're leaving unused to hedge the SoC uncertainty. At typical arbitrage spreads, that's $200–600/day of forgone revenue — approximately $70K–220K/year.
Tightening the SoC uncertainty from ±5% to ±1.5% through a continuously updated physics-based state estimator allows the safe operating band to widen by roughly 7 percentage points. The annualized revenue recovery from that band expansion is directly calculable against the asset's specific market and dispatch intensity.
RegD vs RegA in PJM: A Practical Note
For US operators in PJM, the equivalent to FCAS is the Regulation market, split between two products. RegA (traditional regulation) is a slow-responding service — MW adjustments over minutes. RegD (dynamic regulation) requires sub-second to 2-second response, which is BESS's natural strength. RegD earns a performance multiplier (the "D" factor, also called the "mileage factor") that significantly increases per-MW compensation for fast-responding resources — typically 5–10× more revenue per MW than RegA under the performance-based compliance scoring formula.
RegD non-compliance — failing to respond to an AGC signal within the required response time — generates a compliance score deduction. The score matters because PJM's payment formula weighs performance score directly. A BESS responding to a raise signal that it doesn't have headroom to fulfill scores poorly and earns less per MW cleared. SoC accuracy is the operational precondition for maintaining a high RegD performance score.
What We're Not Saying
We're not saying that every BESS operator currently running FCAS or RegD is losing money due to SoC inaccuracy. Well-engineered BMS firmware with regularly recalibrated cell models performs adequately in many installations, particularly in the first year before significant capacity fade. We're not saying that improving SoC accuracy guarantees improved FCAS revenue — market structure, bid strategy, and grid frequency volatility all matter independently.
What we are saying is that SoC accuracy is a quantifiable driver of FCAS revenue optimization, and the cost of improving it — through continuously updated physics-based state estimation fed by real-time voltage/current/temperature telemetry — is small relative to the revenue at stake on assets above 10 MWh in active frequency regulation markets. Operators who calculate their FCAS revenue potential based on nameplate capacity and optimal SoC are computing a ceiling they're systematically failing to reach when BMS error consumes their headroom buffer.