Top performers by product
Revenue by product ($/MW-yr)
Breakdown table
Daily net revenue ($/MW)
Cumulative net revenue ($/MW)
Average revenue by hour ending ($/MW)
Average net output by hour ending (MWh)
Daily rank in the filtered fleet
Curve table
Selected hour
All hours
Renewables · load · ESR fleet
Prices
$/MW-yr PnL
Win rate
Hours traded
Cumulative PnL
PnL and win rate by hour ending
DA net load + outages
Median DA and RT LMPs in matched hours
DA net load + outages vs DART
Matched hours
Today
Tomorrow
All LZ_WEST resource nodes (and the default list's points)
What this viewer measures
Estimated wholesale revenue for every Energy Storage Resource (ESR) in ERCOT, rebuilt from ERCOT's public 60-day disclosure reports and market prices. The numbers are a model of settlement, not settlement itself: they use what ERCOT publishes about each battery (its telemetry, awards and prices) and the settlement formulas below, so they let every battery be compared on the same basis. They will differ from a QSE's own settlement statements; the main reasons are listed under Known differences.
Data sources
| Data | ERCOT report | Used for |
|---|---|---|
| 60-day SCED disclosure, ESR data | NP3-965-ER | Telemetered net output, base point, HSL / LSL, SOC and maxSOC, real-time AS awards and RT energy offer curves, for every SCED run (about every 5 minutes) |
| 60-day DAM disclosure, ESR data and AS offers | NP3-966-ER | DA energy awards (three-part supply offers), DA AS awards, DAM HSL, settlement point, QSE, DA energy and AS offer curves |
| 60-day DAM energy-only offers / bids and their awards | NP3-966-ER | Virtual (energy-only) positions at each battery's settlement point |
| RT LMPs by resource node, load zone and hub | NP6-788-CD | RT energy price at each SCED run |
| RT price adders (RTRDPA and AS adders) | NP6-323-CD | Added to RT energy and AS prices |
| DAM settlement point prices | NP4-190-CD | DA energy price |
| DAM AS clearing prices | NP4-188-CD | DA AS prices (MCPC) |
| RT AS clearing prices by SCED run | NP6-332-CD | RT AS prices (MCPC) |
| Settlement points list and electrical bus mapping | NP4-160-SG | Each battery's load zone |
| Load, wind and solar forecasts and actuals, system lambdas, outages | NP3-565, NP4-742/743/745, NP4-523, NP6-322, NP3-233 and others | Fundamentals tab only |
| ERCOT MORA resource details, EIA-860M, Census county centroids | – | Map locations |
The disclosures publish about 60 days after each operating day, so revenue runs roughly two months behind; fundamentals have no lag and run up to nine days ahead (forecasts).
Battery size: the MW and MWh each battery is graded against
- Rated MW = the highest HSL (High Sustained Limit) the battery telemetered to SCED in that calendar month.
- Rated MWh = the highest maxSOC (maximum state of charge) the battery telemetered to SCED in that calendar month.
- Every day is graded against its own month's rating, so a battery that is expanded, derated or repowered part-way through a long window is measured against the size it actually had on each day.
- Using the month's maximum means a short outage or derate (which lowers telemetered HSL) does not shrink the rating: the battery is graded against its full capability, and lost availability shows up as lower revenue per MW.
- If a battery telemetered no HSL (or maxSOC) above zero all month, for example while it was out of service, the rating falls back to the settlement run's own: the maximum DAM HSL and SCED maxSOC over the days processed together.
- Hours (duration) = Rated MWh ÷ Rated MW. The leaderboard's MW and MWh columns show the largest monthly rating in the window.
maxSOC is the battery's own telemetered energy capacity; depending on the site it can be measured at the DC side or at the point of interconnection, so durations near a boundary (for example 1.0 vs 1.05 hours) may reflect telemetry rather than design.
From SCED runs to 15-minute settlement intervals
- ERCOT settles energy and AS on 15-minute intervals. SCED runs about every 5 minutes, with occasional off-cycle runs.
- Each SCED run's telemetered net output (MW, positive when discharging, negative when charging) is held from the run's timestamp until that battery's next run, capped at 330 seconds (the day's last run is held for 300 seconds). A run that straddles a 15-minute boundary is split, so each interval gets exactly the seconds that fall inside it.
- Net MWh for an interval = Σ (MW × hours held) over the runs in it.
- Each run takes the price record at or before its own timestamp (looking back up to 5 minutes), so off-cycle runs use their own prices.
- Gaps in ERCOT's SCED data longer than the cap leave the rest of that interval uncovered, so it contributes no energy.
Energy revenue
RT settlement point price (RT SPP) for an interval = the seconds-weighted average over its SCED runs of (RT LMP at the battery's resource node + RTRDPA, the RT reliability deployment price adder). In our checks this matches ERCOT's published 15-minute settlement point prices (NP6-905-CD) to the cent.
All energy is priced this way: discharging earns RT SPP × MWh, charging pays it.
DA position for each hour = the three-part supply offer award (positive to discharge, negative to charge) + energy-only offer awards (positive) + energy-only bid awards (negative). Energy-only offers and bids are submitted by the QSE at a settlement point, not by a resource, so each hour's awards are split equally among that QSE's batteries at that settlement point. Each 15-minute interval carries a quarter of the hour's DA MWh.
Together the two lines equal ERCOT's day-ahead sale plus real-time imbalance: DA MWh × DA SPP + (net MWh − DA MWh) × RT SPP. Splitting it this way shows the battery's physical RT value separately from what its day-ahead position added or lost against real time.
Ancillary services revenue
Products: Regulation Up, Regulation Down, Responsive Reserve (Primary Frequency, Fast Frequency and Under-Frequency Relay), ERCOT Contingency Reserve (ECRS) and Non-Spin. The three RRS products are priced at the RRS clearing price.
Real-time AS is settled as the imbalance against the day-ahead award, at real-time prices: carrying more AS in real time than was awarded day-ahead earns revenue, carrying less pays it back. Both are calculated for every SCED run segment and summed into the 15-minute intervals.
Metrics
| Metric | Definition |
|---|---|
| Net revenue | RT energy + DA energy + DA AS + RT AS, summed over the window |
| $/MW-yr | Each day's net revenue ÷ that day's Rated MW, summed over the window, ÷ days × 365 |
| $/kW-month | The same per-MW sum ÷ 1,000 ÷ days × (365 ÷ 12) |
| $/MWh-day | Each day's net revenue ÷ that day's Rated MWh, averaged over the window's days |
| RT / DA TB2 | Top-2 minus bottom-2 hourly prices of the day at the battery's settlement point: RT uses hourly averages of the RT LMP, DA uses the hourly DA price (days with at least 4 priced hours) |
| TB2 capture | Net revenue ÷ (Rated MWh × TB2): the share of a perfect one-cycle, lossless top-2 / bottom-2 trade the battery earned. Over a window, total revenue ÷ total potential, on days with a positive TB2 |
| Cycles | Discharge MWh (positive 15-minute net output only) ÷ that day's Rated MWh, summed; Cycles/day divides by days |
| Energy / AS share | Energy and net AS (DA AS + RT AS) as shares of |energy| + |net AS|; they add to 100% when both are positive |
| Daily rank | Rank among the day's eligible batteries by the chosen metric (tied batteries share the better rank) |
Who is ranked
- A battery is eligible when its Rated MW is at least the minimum MW, it is not on the exclusion list
(in
config.json), and it passes the chosen duration bucket, QSE and map-area filters. - A day on which SCED shows the battery with no capacity (HSL or maximum SoC 0 all day, as during an outage) is never ranked, even with exclusions off: its DA revenue would be divided by a placeholder rating. A battery with no such capacity on any day of the window is treated as excluded.
- Turning exclusions off also removes the minimum MW, so every battery is ranked.
- The additional resources in
config.jsonare always listed, whether or not they make the top 20 or 50. - Load zone comes from the battery's settlement point in ERCOT's settlement points list (NP4-160-SG).
Known differences from settlement statements
- Telemetry, not meters. Energy comes from SCED telemetered net output, a snapshot at each SCED run held until the next one. ERCOT settles on revenue-quality meter data, which also reflects auxiliary load, losses between the telemetry point and the meter, and output changes within each 5-minute run.
- Charges not modelled: ERCOT administrative fees, base point deviation charges, RUC and make-whole payments, uplift, congestion revenue rights, and resettlements.
- QSE-level items such as QSE-to-QSE energy trades, hedges and tolls are not in the public data. Energy-only awards are QSE-level too and are split evenly across that QSE's batteries at the settlement point.
- Missing data. Days ERCOT did not publish, SCED gaps and intervals without a published price are left out, not estimated.
- Hybrid sites. A battery sharing a settlement point with solar or wind is measured on the battery's own telemetry; the co-located plant is not included.
Fundamentals tab
- DA load, COP wind and solar forecasts are shown only when their report was posted from 8:00 to 10:00 a.m. CT, inclusive, on the day before delivery. DA system lambda is a market result, not a forecast; RT columns are actuals (system load, wind and solar actuals, SCED system lambda, outages).
- Today's detail uses EMIL five-minute actuals for wind (14788) and solar (21810), and the EMIL system-demand report (12340), which is published every 15 minutes. Latest load, wind and solar forecasts use reports 12311, 14787 and 21809 and are shown for both today and tomorrow as available. Today's actuals and each day's latest forecasts stay visible; the optional DA bid-close forecast is white.
- Today's capacity series combines EMIL capacity report 12315 with the latest forecasts. RT/DA constraints and HRUC/WRUC tables are from EMIL reports; Today's WRUC table is for tomorrow's delivery and only appears when today's report is available. The default LMP sites match lmp_dashboard, with additional price nodes available from the site selector.
- Days up to nine days ahead are stored with whatever forecasts ERCOT has posted, and refreshed on every update until their actuals are in.
- Battery LMPs on this tab are the RT LMP at each SCED run (hourly averages in the tables) and the hourly DA price. Prices are stored daily for every battery's settlement point as soon as each day is complete, well before the 60-day disclosures arrive; the revenue calculation later reuses those same stored prices.
- The ESR fleet panel sums every battery's SCED telemetry (discharge, charge and net) once the 60-day disclosure covers the day. Before that, it shows ERCOT's hourly battery net output from EIA (EIA-930 hourly generation by fuel type), labelled "EIA hourly net", usually available within a day.