GridSim documentation
How GridSim works
GridSim screens ERCOT nodes for battery storage. For each node it estimates what a standard battery would have earned since ERCOT's December 2025 market change, how sure that number is, and which way it moves as more storage is built. These docs explain how to use it and how to read every number it shows.
GridSim in plain English
What it is. GridSim estimates what a battery would earn at any site on the Texas power grid. It takes the public prices published by ERCOT, which runs the grid, and works out what a typical 100 MW battery would have made at each site since December 2025: by charging when power is cheap, selling when it's dear, and being paid to stand by in case the grid needs it.
How to read a site. Click a dot on the map. The big number is a year's earnings for a typical 100 MW battery there. Under it, what a well-run and a poorly run battery would make at the same spot: who runs a battery matters as much as where it is. Then how the site compares with other Texas battery sites, where the money comes from, how steady it is, and which way it may go as more batteries are built. Every detailed number is one click further, under Full details and in the PDF.
How we test it. We ran the same method on 315 real Texas batteries, predicting each one with settings worked out without it, and compared the prediction with what the battery actually earned, rebuilt from ERCOT's public records. On average the estimates are right: as often too high as too low. For a battery of 20 MW or more, the typical miss is about 23% either way, mostly because batteries are run so differently. The look ahead to 2027 failed its own test, so it's shown as a rough estimate only. The full results are on the methodology page.
What it can't tell you. It isn't an underwriting-grade forecast: it can't say what a particular project will earn over its life, and the 2027 view is a direction, not a number to bank on. It doesn't know your own operating plan, contracts or hedges, or whether a 100 MW battery can actually connect at a given spot.
Who it's for. Developers, investors and analysts screening many Texas sites at once, to decide which deserve a closer look. For a site worth pursuing, the full report carries every number, and a custom report can model a specific project.
What GridSim is
A screening tool. It answers one question for many sites at once: at this node, what would a battery earn? Every number describes the same hypothetical battery, so nodes can be compared like for like.
- Battery
- 100 MW / 200 MWh (2 hours)
- Round trip
- 85%
- Cycling
- At most one full cycle a day
- Period
- 5 Dec 2025 – 25 Aug 2026
- Coverage
- 266 battery nodes and 7 trading hubs (273); 145 shown by default
It is never the revenue of a real battery at that node. Where a node is a real battery's settlement point, the report says so and leaves that battery's own revenue out.
Quick start
- Open the ranking. /gridsim opens on a map of ERCOT; Show ranking opens the panel beside it, which lists every node by revenue now, highest first. Hide panel closes it.
- Pick a node. Select a row in the table or a dot on the map. Its plain summary opens in the panel (selecting a dot opens the panel if it's hidden); Full details under it shows the one-page report.
- Read the headline, then the caveats. The big number is revenue now. The badge beside each section tells you how far to trust it.
- Take it with you. Download full report (PDF) on any site prints its full report it on one US Letter page.
The ranking
The panel's opening view. It starts with plain columns (a year's dollars for a typical 100 MW battery, how many battery sites it beats, how steady the money is); Detailed columns brings back the table below. Every column header sorts the table; select it again to flip the order. Select a row to open that node's report.
| Column | What it shows | Trust |
|---|---|---|
| Now | Revenue now, in $/kW-month, energy plus ancillary. | Backtested |
| Energy | The part earned from day-ahead and real-time energy. | Backtested |
| Ancillary | The part earned from day-ahead ancillary services. | Backtested |
| Range | Weaker to stronger operators: revenue now across the middle 80% (P10–P90) of capture rates seen on real batteries (0.18–0.48). | Backtested |
| +6.3 GW (’27 base) | Revenue once the base 2027 build-out of storage is added. Dashed amber underline. | Indicative |
| Top 3 days | The share of revenue now earned on the node's three best days. A narrow table hides it first. |
- Search and filter. Search by settlement point or county, and filter by load zone. The heading counts the nodes the filters show.
- Small interconnections are hidden by default. The ranking and the map show nodes whose largest existing resource is at least 20 MW (and the hubs): 145 of 273. Tick Include small sites (under 20 MW), above the ranking or in the map's layers panel, to add the other 128.
- Generation-only nodes are hidden by default. Tick Include generation-only sites (no battery yet) above the ranking to add the other 765 resource nodes in ERCOT's list that have a report: 741 with no battery today, and 24 battery nodes whose batteries weren't operating on the node set's status day. Twelve more were energised after 25 Aug 2026, when the reports' data ends, so they have no report yet. Each is priced the same way, for the same hypothetical 100 MW / 200 MWh battery, with the same flags. On the map they're the All sites, power plants too layer; select a dot for its report.
- Tags. Short history: prices start after 31 Dec 2025, so the node misses the January 2026 cold snap; these nodes sit in their own groups below the ranking, by when their data starts, and each report ranks the node against the others over the same days. Event-driven: the top 3 days earned over 40% of revenue. Small: the largest existing resource at the node is under 20 MW, so a 100 MW battery may not fit there. Generation and battery not operating: the two kinds of node the generation-only box adds.
Every node's range comes from the same capture rate, so ranges move together. The order of nodes holds up better than their dollar levels.
The map
Each dot is a battery node, shaded from light to dark blue by revenue now. Hover a dot for its name and value; select it to open its report.
- Exact where EIA has the plant. A node matched to a plant in EIA's generator inventory sits at that plant's published coordinates; hovering notes a medium-confidence match. Other nodes sit at their county's centre, drawn faded, and are approximate.
- Hubs aren't drawn. A hub averages many buses, so it has no single place. Open hubs from the ranking.
- Nearby nodes group into a numbered circle until you zoom in; select it to zoom.
- Not drawn: nodes with neither an EIA match nor a known county (they're in the ranking with full reports), and small interconnections unless they're included.
- All sites, power plants too (a layer, under More layers) adds ERCOT's other resource nodes, about 560 with a location, coloured by technology (gas, wind, solar, battery, other); hollow ones are at a county centre. Select one for its report; hover shows its revenue now.
- Layers add counties, ERCOT weather zones and load zones. Load zones are a county-level approximation and are drawn dashed.
- Grey is outside the ERCOT region.
Reading a node report
A report is one page, read top to bottom:
- Header. The settlement point, county and zones, the battery, and when the data runs to. A small map shows roughly where the node is. Any caution sits here as one line: short history, event-driven or small interconnection.
- Revenue now. The headline in $/kW-month, its range, the split between energy and ancillary, and the share earned on the top 3 days. Backtested
- The test. Every ERCOT battery since December 2025, each predicted by a model that never saw it: the median error, the share within ±20% and a histogram of the errors. See The test.
- Revenue as storage is added. A chart of revenue against gigawatts of new 2-hour storage, with the build-out scenarios marked. Indicative
- What drives the value. The top 10 hours and top 5 congestion events, each with its share of the period's revenue. These show whether a node earns steadily or on a few spikes.
- Assumptions and limitations. The same short list on every report, repeated below.
- Footer. The model version and the commit that built the report, so any printed number can be traced to its source.
Reading the chart
- Headline line (long dashes): assumes Reg-Up and Reg-Down revenue shrinks as storage is added. An assumption, not validated.
- Upper bound (dots): leaves that shrinkage out.
- Hatched band: the capture-rate range around the headline line.
- Grey hatched area: past about 20 GW added, the model gives no number.
Printing and PDFs
Download full report (PDF) prints the open report on one US Letter page, with nothing smaller than 8 pt, the GridSim by Miletus header and a faint Miletus watermark. The map and the ranking aren't printed.
In Chrome's print dialog, untick Headers and footers so the browser doesn't add its own URL and date around the page.
Nodes and hubs
ERCOT sets a separate price at every settlement point: the place where a plant, a battery or a load settles its energy. GridSim calls each one a node.
- Resource nodes are where a specific battery or plant connects. Their price includes local congestion.
- Trading hubs (such as HB_WEST) average many buses. They're smoother and are where much of the market trades.
GridSim covers every settlement point with an operating battery in ERCOT's latest 60-day disclosure (266) and the 7 trading hubs: 273 nodes.
Units: $/kW-month
Revenue is in dollars per kilowatt of rated power per month, the unit battery revenue is usually quoted in. Multiply by 12 for $/kW-year, and by 100,000 for a 100 MW battery's monthly dollars.
Example: $1.76/kW-month × 12 = $21.12/kW-year, or about $176,000 a month for 100 MW.
What revenue is counted
Included
- Day-ahead energy
- Real-time energy
- Day-ahead ancillary services (regulation up and down, responsive reserve, ECRS, non-spinning reserve)
Not included
- Real-time ancillary services
- Fees and charges
- Hedges, tolls and bilateral contracts
- Outages beyond those real batteries already show
The hindsight ceiling
For each node, GridSim first works out the most the battery could have earned if it had known every price in advance: when to charge, when to discharge and when to hold reserves. That's the ceiling. No real battery reaches it, because no operator knows tomorrow's prices.
The ceiling isn't the answer. It's the common yardstick that the next step scales.
Capture rate
Capture rate = a real battery's revenue ÷ the hindsight ceiling at its node, over the same days and the same revenue streams. Across 315 ERCOT batteries after the December 2025 change, the middle 80% captured between 0.18 and 0.48 of their ceilings.
Revenue now is the ceiling scaled by one fleet-wide capture rate from those batteries, net of outages. The 0.18–0.48 spread is the range shown on every report.
This isn't the same as Modo Energy's capture rate, which divides net revenue by an energy-only price spread (TBX). The two percentages aren't comparable.
Why the data starts in December 2025
On 5 Dec 2025 ERCOT went live with real-time co-optimization plus batteries (RTC+B), which schedules a battery's energy and reserves together, as one device. Revenue from before then describes a different market, so GridSim uses only the months since.
Congestion
When power lines fill up, prices on either side split. GridSim measures a node's congestion as its price minus the system price. Reports list events when the node sits at least $10/MWh from the system price, and give the share of revenue they added.
Congestion can be positive or negative. A node that earns much of its revenue in a few congestion events is more exposed to grid upgrades than one that earns steadily.
Build-out scenarios
The forward chart marks three amounts of new 2-hour storage, from ERCOT's September 2026 interconnection report:
| Scenario | Added | What it counts |
|---|---|---|
| Base 2027 | +6.3 GW | Projects with signed interconnection agreements, due by June 2027 |
| High 2027 | +9.3 GW | Base 2027 plus half the projects without signed agreements |
| Base 2028 | +22.2 GW | Signed projects due by June 2028. Outside model range, no number |
Two trust levels
Every number carries one of three badges, and the reports keep them apart:
- Backtested on 315 batteries
- Revenue now, its energy and ancillary split, and its range. Checked against real batteries.
- Indicative · failed held-out replay check
- Everything about adding storage. Read it for direction, not value. Amber means this and nothing else.
- Outside model range, no number
- Past about 20 GW added, including base 2028. The model would need new generation it doesn't include.
The test
Revenue now was tested on every battery in ERCOT after the December 2025 change: 315 ERCOT batteries, 6 December 2025 to 25 August 2026, with their actual revenue reconstructed from ERCOT's public 60-day disclosures. The rules were committed before any battery was run. The batteries were split into five groups, and each was predicted from a capture rate fitted on the other four, so no battery was scored by a model that had seen it.
On batteries of 20 MW or more (173), the test gave a median miss of 23% and 43% within ±20%, with no lean either way (median −4%). The bar set before the test was a 10% median error and 70% within ±20%, so it missed. Right on average, wide for any one site: one capture rate can't reflect how differently batteries are run, and the misses concentrate in batteries that barely trade as merchant storage. A separate rate per size class was tested too and didn't help, so every report uses one fleet-wide rate. No battery is named, and no battery's revenue is shown.
Ranking, and the operator
Most of what separates one battery's revenue from another's is how it's run, not where it sits. On the 173 batteries of 20 MW or more, the operator (each battery's capture rate) explains about 72% of the spread in revenue, and the site's own potential about 13%; the rest is the two moving together. "Operator" here covers strategy and bidding but also outages and anything the public data can't see.
GridSim screens the site, and it ranks sites moderately well: across those 173 batteries its predicted order and the real order have a rank correlation of 0.56; of the batteries it put in the top quarter, about half really were (chance would give a quarter); and when it put one battery more than 30% above another in a different zone, the higher one earned more 80% of the time. A capture rate for each operating style (ancillary-heavy, co-located with solar or wind, merchant) was tested and didn't help: batteries of each style differ as much as the whole fleet. So the range on every report reads as weaker to stronger operators at that site.
History: the first test, on 4 batteries
Before the full test, four real ERCOT batteries were kept out of calibration and used to test it. The bar was every one within ±20% of its actual revenue.
| Battery | Zone | Size, duration, in service | Predicted | Actual | Error |
|---|---|---|---|---|---|
| Battery A | South | 150–250 MW, 1 h, before 2024 | $1.67 | $1.67 | +0.2% |
| Battery B | North | 150–250 MW, 2 h, before 2024 | $2.30 | $2.32 | −0.6% |
| Battery C | West | 50–150 MW, 2 h, before 2024 | $2.62 | $2.35 | +11.6% |
| Battery D | Houston | 150–250 MW, 2 h, 2025 | $2.13 | $2.74 | −22.1% |
| Median absolute error | 6.1% | ||||
Three of four were within ±20%. Battery D missed by 2 points; it sells far more non-spinning reserve than the batteries the method was calibrated on. The full test showed these four capture more of their ceiling than the fleet does, so this result didn't carry to every battery; the reports now use the full test's rate.
The July check
The forward method had its own test, committed before the held-out month was loaded: over July 2026, predict how the system price moves an hour ahead at least 10% better than assuming no change.
Result: fail. Its error was 1.81× that of assuming no change ($9.58 against $5.28). It got the price level about right in a calm month, but not how prices move hour to hour, which the forward curve depends on. July was run once and the method wasn't changed afterwards.
What to use it for
Good for
- Ranking and screening many sites at once
- Seeing which hours and events drive a node's value
- The direction revenue moves as storage is built
Not for
- Underwriting or financing a specific project
- A specific site's own capture rate
- Forward dollar values
GridSim is a screening estimate, not investment advice.
Sources and freshness
- Prices: ERCOT's public day-ahead and real-time settlement point prices, and day-ahead ancillary prices.
- Real batteries: ERCOT's public 60-day disclosure reports, for the test and the capture rate.
- Build-out: ERCOT's interconnection (GIS) report, September 2026.
No vendor data and no forecasts go in. The 60-day disclosures set the lag: the data currently runs to 25 Aug 2026, and every report says so in its header.
Report data (JSON)
Everything a report shows is published as JSON, one file per node, plus an index:
GET /reports/index.json all nodes, for the ranking
GET /reports/<node_id>.json one node's full report
The main fields in a report:
| Field | Contents |
|---|---|
node | Settlement point, label, load and weather zone |
battery | Power, energy, round trip, cycles per day |
today | Revenue now: energy, ancillary, total, range, capture-rate range |
validation | The test on every ERCOT battery: N, median error, share within ±20%, bias and the error histogram (cv) |
curve | Revenue against storage added, and the scenario markers |
value_drivers | Top hours and congestion events, with their shares |
assumptions, limitations | The lists printed on the report |
meta | Data through, model version and commit |
"today": {
"span": "5 Dec 2025 – 25 Aug 2026 (post-RTC+B)",
"energy": 1.00, "ancillary": 0.75, "total": 1.76,
"band": { "low": 0.94, "high": 2.53 },
"capture_band": { "low": 0.178, "high": 0.482 }
}
Values are $/kW-month. The format is versioned (schema_version, now 0.11).
Assumptions and limitations
Assumptions
- 100 MW / 200 MWh, 85% round trip, at most one full cycle a day.
- Revenue is the hindsight ceiling, scaled to what real batteries actually captured, net of outages.
- Earns day-ahead and real-time energy and day-ahead ancillary.
- Added storage is 2-hour, competing for the same hours.
- Each node's congestion is kept as it was.
- Headline: Reg-Up and Reg-Down revenue shrinks with storage (unvalidated).
- Load and other generation are today's.
Limitations
- Forward numbers are indicative: the price model failed its July 2026 check.
- One capture rate from 315 batteries; real ones range 0.18–0.48, so a site can differ widely.
- Existing generators' and batteries' offers are held fixed.
- Congestion doesn't respond to new batteries; there's no network model.
- Excludes real-time ancillary, fees, extra outages, hedges and tolls.
- No revenue past about 20 GW added: that needs new generation.
- Uses only the months after ERCOT's December 2025 market change.
Glossary
- Ancillary services
- Reserves ERCOT buys to keep the grid balanced: regulation, responsive reserve, ECRS and non-spinning reserve. Batteries are paid to stand ready.
- Capture rate
- A real battery's revenue divided by its node's hindsight ceiling.
- Congestion
- A node's price minus the system price, caused by full power lines.
- Cross-validation
- Testing on batteries the fit never saw: split them into groups, fit on all but one, predict that one, and repeat for each group.
- ECRS
- ERCOT Contingency Reserve Service, a fast reserve product.
- ERCOT
- The grid operator and market for most of Texas.
- Event-driven
- A node whose top 3 days earned over 40% of its revenue now.
- Hindsight ceiling
- The most a battery could have earned knowing every price in advance.
- Hub
- A settlement point that averages many buses, used for trading.
- Node
- A settlement point with its own price.
- RTC+B
- Real-time co-optimization plus batteries, live in ERCOT since 5 Dec 2025.
- Short history
- A node whose prices start after 31 Dec 2025, so it misses the January 2026 cold snap and isn't ranked with the rest.
- Small interconnection
- A node whose largest existing resource is under 20 MW; a 100 MW battery may not fit there.
- System price
- ERCOT's system-wide energy price (system lambda), before congestion.
- $/kW-month
- Revenue per kilowatt of rated power per month.
FAQ
Is this a real battery's revenue?
No. Every number is for the same hypothetical 100 MW / 200 MWh battery, so nodes compare like for like.
Why is the range so wide?
It runs from weaker to stronger operators: the middle 80% of 315 batteries captured 0.18 to 0.48 of the ceiling, and how a battery is run explains most of the difference between batteries (about 72% on large ones, against about 13% for the site). Where a project lands is decided by its operator, strategy and outages.
Why don't the forward values have a validation badge?
The forward method failed its July test, so its numbers are marked indicative. Use them for direction.
Why is there no number for base 2028?
Past about 20 GW of added storage, the market would need new generation the model doesn't include, so it gives no number rather than a misleading one.
How does this compare with Modo Energy's figures?
At the West hub, revenue now is $1.76/kW-month, about $21.12/kW-year. Modo Energy's ERCOT index put the average battery at $24/kW-year in 2026 through 16 August, and the 315 real batteries in our test earned $1.81/kW-month (MW-weighted). They measure different things, so it's a sanity check on the level, not a validation.
Can I see the full method?
The full methodology, including the optimiser, the forward method and the complete validation record, is available to customers under NDA.
Request a node
Need a node that isn't listed? Send its settlement point or county and what the report is for, and you'll get the same one-page report, stamped with the commit that built it.