Energy · Analysis

Ontario's Grid: Clean, but Drifting

Ontario runs one of North America's cleanest grids, and the usual line is that it's basically decarbonized. The hourly generation data tells a less comfortable story — and shows exactly where the "job done" narrative goes wrong.

The question

Ontario phased out coal in 2014 and built a grid that runs mostly on nuclear and hydro. So is it still decarbonizing — or has it started to backslide?

The story in five seconds: Ontario still runs one of North America's cleanest grids — but its emissions-free share has slipped from 93.2% (2020) to 80.1% (2025). Natural-gas generation has tripled (10.1 → 32.2 TWh) while nuclear dipped during refurbishment, and renewables held roughly flat near a third of supply.

Canada · Electricity Decarbonization Tracker

Ontario transmission-connected generation

Generation mix & carbon trajectory · 2019–2026 · Source: IESO Generator Output Capability

Total generation (2025)
162.4 TWh
▲ +10.7% vs 2020
Emissions-free share
80.1%
▼ 13.1 pts vs 2020 (93.2%)
Renewable share
32.1%
≈ flat vs 2020 (33.5%)
Natural-gas generation
32.2 TWh
▲ 3.2× vs 2020 (10.1 TWh)

Monthly generation mix

Every month, May 2019 → present (GWh, stacked). Seasonal nuclear refuelling dips and the steady rise of the gas wedge are both visible.

Annual generation mix

Full calendar years (2020–2025). Nuclear + hydro carry the system; note gas climbing every year since 2021.

Emissions-free share of generation

Nuclear + hydro + wind + solar + bioenergy, as % of total.

The substitution: gas up, nuclear down

As nuclear units enter refurbishment, gas fills the gap (TWh).

Charts render from assets/js/ontario-data.js, generated directly from the same star-schema fact tables that feed the Power BI model — the site numbers can't drift from the pipeline.

How this was measured

The headline is only worth as much as the data behind it, so most of the work was upstream of the charts. The pipeline runs from the original publisher all the way to the model — no hand-edited spreadsheets in between.

1

Extract

Incrementally download IESO monthly Generator Output Capability CSVs (hourly, per generator). Only re-fetch the open month — closed months are immutable.

2

Transform

Skip comment lines, unpivot Hour 1–24 to long form, pivot measurements to columns, attach DST-safe local timestamps, write Hive-partitioned Parquet.

3

Model

Roll hourly output up to province × fuel × period GWh and load a star schema: Date, Province, Fuel, Generator dims around generation & emissions facts.

4

Visualize

DAX measures for renewable share, grid intensity and YoY change in Power BI / Fabric; this page mirrors the model in Chart.js.

The data model

Generation is keyed to a year-end date, a province, and a fuel type, with a generator dimension for plant-level drill-down. Renewable and emitting flags live on the fuel dimension so a single measure can switch between "renewable" and "emissions-free":

-- emissions-free = everything except Natural Gas and the mixed "Other" category
Total Generation (GWh) = SUM ( Fact_Generation[Generation_GWh] )

Renewable Share % =
    DIVIDE (
        CALCULATE ( [Total Generation (GWh)], Dim_FuelType[IsRenewable] = 1 ),
        [Total Generation (GWh)]
    )

YoY Δ Renewable Share =
    [Renewable Share %]
  - CALCULATE ( [Renewable Share %], DATEADD ( Dim_Date[Date], -1, YEAR ) )

Data quality & reconciliation

Public CSVs are messy in ways that fail silently. Two real bugs only surfaced because the loader was validated against an actual April-2025 file rather than trusted because it "looked right":

Reconciliation: IESO grid-connected vs CER provincial total

A pipeline you can't reconcile is a pipeline you can't trust. The IESO feed covers transmission-connected generators only, so it runs a few percent below the Canada Energy Regulator's province-wide total — exactly the gap you'd expect from embedded rooftop solar and small hydro:

YearIESO grid-connected (TWh)CER total (TWh)Notes
201998.1partial — feed starts May 2019
2020146.8
2021141.9148.3gap ≈ 6.4 TWh (4.3%) = embedded generation
2022146.4
2023148.6
2024156.6nuclear 51% / hydro 24% / gas 16% / wind 8.5%
2025162.4first year "Other" appears (178 GWh)
Why that gap is a feature, not a bug: CER reports ~2,171 MW of distribution-connected solar in Ontario vs only 478 MW transmission-connected, so IESO structurally under-counts solar. The honest label is "transmission-connected generation (IESO)" — the right basis for the grid mix and the decarbonization story; for absolute provincial totals, cite CER.

Scope & sources

Method: IESO Generator Output Capability, transmission-connected generators only (excludes embedded/distribution-connected solar & small hydro — ~4% of the provincial total per CER). Annual GWh = Σ hourly output. Grid carbon intensity (ECCC NIR): 220 g/kWh (2005) → 35 g/kWh (2022).

Sources: IESO Generator Output Capability · CER Ontario Energy Profile · ECCC National Inventory Report

J

Jeff Ahmadi

I write data-driven analysis of energy systems — how grids generate, emit and decarbonize, read through primary data. Connect on LinkedIn.