Methodology
Waypoint surfaces signed congestion levels and trends across the 66-month window (2021-01 through 2026-06). Rather than scoring a site as viable, it answers a prior question: where is congestion trending, and what does the diurnal shape look like at any given node? The page below is layered from the general to the specific — first the shared data foundations and statistics, then the method behind each chart, then the per-ISO sourcing details. Everything here is meant to frame the siting conversation before a developer commissions a full power-flow study.
Data foundations
These rules apply to every ISO and every chart: what the raw number means, which nodes qualify, and how duplicate buses are reconciled.
Source & sign convention
The source is the real-time hourly LMP decomposition — specifically the congestion component ($/MWh) — for physical pricing nodes — LOAD (load buses), GEN (generator interconnection buses), and EHV(500/765 kV backbone buses) — pulled from each ISO's official feed. We preserve the LMP sign throughout: a positive congestion value means the node is import-constrained (load-side pressure, fewer flexible-load opportunities); a negative value means export-constrained (congestion relief, more headroom). Positive still means import-constrained pain regardless of node type — adding GEN nodes surfaces more of the negative, export-constrained side of the picture, since generator buses sit on the relief side of the grid more often than load buses do. Throughout the app, red encodes positive (pain) and teal encodes negative (relief).
Inclusion gates
Two gates decide which nodes appear in any table or chart. The voltage gate keeps only transmission-level nodes at 100 kV and above, screening out the sub-transmission and distribution buses that dominate the raw pnode list — interconnection decisions for flexible loads, grid-scale storage, and VPPs are made at the transmission level. The gate is type-aware: LOAD and EHV nodes must still clear 100 kV, but GENis exempt — a generator pnode's published voltage is its generator terminal voltage (typically 13–25 kV), not its interconnection voltage, so applying the transmission floor to GEN would drop the large majority of real generator buses rather than screen for transmission-level ones. The coverage gate requires a longest unbroken run of at least 36 observed months, dropping nodes whose history was never dense enough to trend while still admitting retired or truncated nodes whose earlier record was sufficient. Rows are also restricted to the current (non-superseded) revision of each hourly observation.
Co-located node consolidation
ISOs expose many pnodes that resolve to the same physical bus, so a single location can appear under several ids and names with byte-identical congestion histories. During aggregation, nodes within a zone whose full month × hour grid is identical are collapsed into one canonical node (the lowest pnode id). Merged-away ids are recorded so stale deep links redirect to the canonical node, and the consolidated names and ids are shown together on the scatter tooltip, the node header, and the breadcrumb. Consolidation runs before zone aggregation, so a physical bus is counted once — not two or three times — in zone node counts and quantile bands. The match is exact: nodes with any difference in their diurnal shape are never merged. The match key also includes node type, so a co-located generator bus and load bus at the same site are never folded into one node even if the rest of the key matched — type is a hard partition, not just another attribute to compare.
Node type
Every retained node carries one physical-bus type: LOAD (a load-serving bus), GEN (a generator interconnection bus), or EHV (a 500/765 kV backbone bus). A type is admitted only when its rows represent a physical bus a project could plausibly interconnect at — hub, interface, aggregate, zone, and residual pricing points are never physical buses and are excluded outright, regardless of voltage; a newly-appearing pnode type outside this set is dropped by default rather than silently included. Type is attached to the node, not the observation — it is stable across the whole window — and is a filterable dimension everywhere a node can be sliced: the landing scatter (shape-encoded, plus a chip filter), the zone node table (a type filter and a badge per row), and the zone-level rollups (choropleth and zone trend chart, via a LOAD/GEN/EHV/ALL selector).
Statistical methods
The math that turns millions of hourly observations into the handful of numbers each chart consumes. All of it is ISO-agnostic.
Monthly aggregation
Hourly congestion values are averaged into a month × hour-of-day grid per node, then into a single monthly mean (one scalar per month). Months with zero observed hours are stored as null and rendered as gaps. Zone monthly means are the unweightedmean of the contributing nodes' monthly means — each node casts one vote per month regardless of how many hourly observations it carries — while the pooled zone level used for ranking is observation-weighted across months.
Linear-fit slope (OLS)
Ordinary least squares is fit to each node's sequence of observed monthly means, producing a slope ($/MWh per month) and an r². The slope is the primary ranking signal: positive means import-constraint pressure is rising over time, negative means it is easing. A constant series returns r² = 0. Null months are skipped rather than zero-filled, so a sparse-but-real trend is not flattened by missing data.
Mann-Kendall trend test
The Mann-Kendall test is a non-parametric check on whether the month-to-month direction of change is consistent. The reported tau is Kendall's rank correlation between the time index and the monthly series; p is the two-sided significance under a normal approximation with continuity correction. Series shorter than four points return tau = 0, p = 1. A low p (e.g. < 0.05) means the monotonic trend is unlikely to be noise; a high r² alongside a low MK p is the strongest evidence of a real trend.
System stress & counter-cyclical β
Each hour gets a stress share computed separately per node type: the fraction of that type's own nodes whose absolute congestion exceeds 5 $/MWh. A GEN node is always benchmarked against the GEN-wide stress signal, never the LOAD or EHVone, and vice versa — the three populations can be stressed at different times. Hours are sorted into ten deciles by that share, and within each decile we measure how a node's congestion splits positive vs. negative. Regressing the decile means against the decile index gives a counter-cyclical β (with its own r²) that classifies a node from strongly counter-cyclical (relief deepens when the grid is most stressed) through idiosyncratic to strongly pro-cyclical (pain concentrates with system stress).
Charts
Each visualization answers a narrower version of the same question — is congestion at this place getting worse, getting better, or staying put — and is built from the statistics above.
Level & trend scatter
The ISO-wide scatter places every node by level (windowed mean signed congestion, x-axis) and trend (OLS slope within that window, y-axis), recomputed live as you drag the month-window slider — which opens on the trailing 36 months by default. Quadrant tints follow the red (pain) / teal (relief) convention; node type (LOAD/GEN/EHV) is encoded as point shape (circle / triangle / rotated square) so it never competes with the quadrant color, with a type chip filter to narrow the plot to any subset. Hollow dots are inactive nodes (their last observed month precedes the current window end — retired or truncated); filled dots are active, and inactive nodes are hidden by default until toggled on. Co-located nodes that land on the same point are resolved through a hover-card picker rather than being silently merged.
Zone choropleth
Operating-zone polygons are filled on a diverging teal↔red scale by each zone's congestion. Average mode (default) colors by the observation-weighted mean over a month window — so a node with more observed months counts proportionally more — while Snapshot mode colors by a single chosen month. A colorbar legend anchors the scale at zero; zones with no data fall back to the neutral background fill. A type selector above the map picks which per-type zone rollup is shown (LOAD by default, GEN, EHV, or ALL). The ALL slice pools every node type into one number and can mix import-constrained (positive, more common at LOAD nodes) and export-constrained (negative, more common at GENnodes) congestion together — read it as a net figure, not a single physical quantity; the colorbar caption and hover card both label the active slice so it isn't mistaken for the LOAD-only view.
Zone trend chart
The zone detail page plots the zone's monthly mean with its OLS trend line and a p5–p95 band across contributing nodes (published only when at least five nodes contribute that month, so a thin month isn't over-interpreted). The companion landing chart overlays one line per zone plus a node-count-weighted system average. Both share the same type selector as the choropleth (LOAD default, GEN/EHV/ALL) and the same ALL sign-mixing caveat above applies here too.
Node diurnal explorer
One panel with a toggle. The signed by-hourview draws one line per hour of day over the node's observed span, so you can see when congestion concentrates — morning ramp, evening peak, overnight valley — and whether that shape has shifted. The diurnal band summary collapses the 24 hours into daytime (HE 7–17), nighttime (HE 23–6), and evening-peak (HE 18–22) means plus a peak-to-trough spread and a daytime OLS trend, all observation-weighted. Every hour-of-day bucket is keyed to local Eastern Prevailing Time (the PJM market clock, DST-adjusted), so the shape lines up with local wall-clock hours rather than UTC.
Seasonal & diurnal heatmaps
A year × month grid exposes seasonality and a year × hourgrid exposes the diurnal shape across years. Both share one outlier-robust (p95-capped) per-node color scale, so a single scarcity spike doesn't mute the underlying structure; cross-node ranking lives in the scatter and zone table, not here. Each heatmap can flip to a line-chart view (one line per calendar year plus a bold mean).
Counter-cyclical decile chart
A direction-split stacked bar per system-stress decile — positive (red, up) and negative (teal, down) share of the node's hours — overlaid with two dashed baselines averaged across the node's own type (a GEN node is drawn against the GEN baseline, never LOAD or EHV). It visualizes the β described above: whether the node's congestion runs with or against its own type's system stress as the grid tightens from the quietest decile to the most-stressed.
Threshold frequency
For each year and sign, the share of hours whose absolute congestion clears 5, 20, 50 $/MWh. Where the slope answers which direction, this answers how often it bites — a node can trend mildly yet spend a rising fraction of hours above a painful threshold.
Pareto concentration curves
Per sign, the cumulative share of total congestion contributed by the top X% of hours. A steep curve means congestion is concentrated in a few extreme hours (often dispatchable around); a shallow curve means it is spread broadly across the year.
ISO coverage
The statistics above are shared, but each ISO publishes its congestion data differently — different feeds, node taxonomies, zone definitions, and revision rules. This section records the per-ISO sourcing.
PJM — live
Real-time hourly LMP is pulled from PJM Data Miner (the rt_hrl_lmps feed), keeping the congestion component for LOAD, GEN, and EHV-typed pnodes and filtering to the current revision of each hour. Nodes are mapped to PJM's 21 recognized operating zones; external, hub, interface, aggregate, zone, and residual pricing points are dropped — any pnode type outside the three admitted ones is rejected by default. After the type-aware voltage gate, the coverage gate, and co-located (same-type) consolidation, the retained nodes feed every chart on the site.
CAISO — in progress
CAISO ingestion is being built against OASIS real-time LMP. The same gates, statistics, and charts apply once the node and zone mapping is finalized; this section will document the feed and any CAISO-specific handling when it ships.
ERCOT — in progress
ERCOT settlement-point prices use a different congestion decomposition than the PJM/CAISO LMP model, so the sourcing and sign handling are still being validated. Details will be recorded here once coverage is live.
Caveats & limitations
Data-quality caveats
Months with zero observed hours are stored as null, rendered as gaps, and excluded from the linear fit and MK test. The coverage gate (≥36 unbroken months) limits exposure to sparse records, but isolated missing months inside an otherwise dense series are normal and not a data problem. Treat the zone code, not the rendered polygon, as the authoritative identifier.
Limitations
LMP congestion is a screening proxy. It shows that congestion was observed at a node but does not quantify the physical flow constraint, the remediation cost, or the headroom available for a specific MW size. Production interconnection decisions require power-flow modeling (e.g. encoord SAInt). Waypoint is designed for screening, not for interconnection studies.