Home energy retrofits
⌂ All tools ↳ National insights
EnerGuide data

What happened after Canadian home energy retrofits?

Explore matched EnerGuide evaluations to see which upgrades were installed and how modelled energy use, emissions and estimated operating costs changed.

— retrofits match
Before you interpret these results
Disclaimer
  • Results are based on EnerGuide/HOT2000 modelled energy use, not utility bills.
  • Most matched homes participated in retrofit programs and completed a follow-up evaluation.
  • Results describe energy, emissions and estimated operating costs only. Retrofit cost is a separate, proof-of-concept estimate — see below.
  • Comfort, indoor air quality and homeowner satisfaction are not available in the source data.
This tool CAN show
  • What upgrades were most common
  • How much modelled energy use changed
  • How often heat pumps were installed
  • How modelled emissions changed
  • Estimated operating-cost changes at today's energy rates
  • A proof-of-concept estimated retrofit cost and payback for some measures and homes (not full coverage — see the retrofit cost card)
This tool CANNOT show
  • Actual retrofit invoices or contractor quotes
  • Actual utility bills
  • Comfort improvements
  • Occupant satisfaction
  • Indoor air quality changes

The homes shown here are not a random sample of Canadian homes. Most have both a pre- and post-retrofit EnerGuide evaluation, which often means they participated in a retrofit incentive program and completed a follow-up assessment.

Did the retrofits work?

The bottom-line outcome across every home in this view.

Outcomes
Typical energy savingMedian energy saving
—
loading…
Energy saved per m²Median EUI saving
—
kWh/m² · typical homemedian home
Emissions savedMedian GHG saving
—
tonnes CO₂/yrtCO2e/yr · typical homemedian home
Retrofit activity
Heat pumps added
—
Fuel switches
—
changed heating fuel
Deep retrofits
—
Solar panels addedSolar PV added
—
Upgrades per homeAvg. measures per home
—
average of 8 tracked upgradesmeasures · mean per home
How much did homes save?Energy saving distribution — 1% increments
Saved energy
Used more

Most homes show lower modelled energy use after retrofit. About 2.8% show higher modelled energy use. Many of these homes had no detected upgrade under this tool's thresholds and the increases are generally small. The data cannot determine whether these differences reflect modelling variation, untracked changes, home modifications, occupant behaviour, or a genuine increase in expected energy use.Negative values mean modelled total energy use was higher at the follow-up evaluation than at the initial evaluation. These cases are uncommon and are typically small in magnitude. The dataset alone cannot determine the reason for the increase.

Energy & emissions — before vs after

How much each home used and emitted before and after the work, and how the fuel mix shifted.

Energy use per square metre (kWh/m²)Energy use intensity (EUI) — kWh per m²

Energy use per square metre, before, after, and what the advisor recommended — lower is more efficient.EUI = total energy (kWh) ÷ floor area (m²). A lower EUI means a more efficient home. Pre- and post-retrofit distributions are shown as lines; the purple dashed line is the advisor's recommended-upgrade EUI from the pre-retrofit audit (not what was actually done); the amber bars show, for the homes that improved, how much their EUI dropped by. Outliers above 500 kWh/m² clipped for scale. FSA view only — the province-wide view doesn't yet precompute a recommended-EUI distribution.

Greenhouse gas emissions — tonnes of CO₂ per yearGHG emissions — tCO2e per year

Greenhouse gas emissions from home energy use, before and after.Modelled annual greenhouse gas emissions from home energy use. Fuel switching to electricity can lower GHG even when total energy use rises, depending on grid mix. Pre- and post-retrofit distributions are shown as lines; the amber bars show the reduction distribution. Calculated from each home's own fuel consumption × current (2026) official ECCC emission factors, the same factors for every audit year — see Methodology, "GHG emissions".

Design heat loss — pre & post (kW)

The heating power a home needs on the coldest design day — lower means a better-sealed, better-insulated home that's cheaper to keep warm.Modelled design heat loss (kW) at the design outdoor temperature — the peak heating demand the envelope imposes, i.e. what heating equipment is sized against. A lower post value can allow a smaller furnace or heat pump at replacement time. Pre- and post-retrofit distributions are shown as lines; amber bars show the per-home reduction distribution.

Where the heat escapes — annual loss by component

Every home loses heat through its walls, roof, windows, foundation and the air that leaks through gaps. This shows where it goes, and which parts the retrofits actually fixed.Mean annual heat loss per home (HOT2000 EGHHL*, kWh/yr) by envelope component, averaged over the current selection. Means rather than medians so the six components sum to the whole-home figure.

Energy by fuel — pre vs post · total kWh across all matched homes

Each fuel gets a box sized to its larger of pre/post use; the fill level shows the actual pre or post value as a share of that box, so a half-filled box means usage dropped by half. The bottom row shows the resulting saving (green) or increase (red) per fuel. This chart uses total energy summed across all matched homes, so each fuel's share adds up to the true total. Hover any box for exact values.

Heating fuel flow — aggregate energy pre → post (GWh)

Flow width = total energy (GWh) across all matched homes. Grey flows = same fuel, no switch. Coloured flows = fuel switch. Hover a flow for details.

What was upgraded

Which measures were carried out, and how far insulation and airtightness actually moved.

Audits per year — initial (D) & follow-up (E)

Initial (D) and follow-up (E) audits by year. Two bars per year (D then E); solid segments are the homes matching your current filters, faded segments are the rest — so you can see when the selected retrofits were done against all audit activity in the area.

What measures were done
Insulation & air leakage — before vs afterInsulation & air leakage — median pre → post

Higher R-value and lower air leakage are both better.R-value = imperial thermal resistance (higher = better; RSI shown in brackets is the metric equivalent, R = RSI × 5.68). ACH50 = air changes per hour at 50 Pa (lower = better).

Roof insulation
Wall insulation
Foundation insulation
Air leakage
Solar PV adoption

Share of matched homes with solar PV recorded pre- and post-retrofit, and the median system size among adopters.

The homes in this view

Who these retrofitted homes are — vintage, size, type — and how they sit within the wider neighbourhood.

Year built
Floor area (m²)
Building type
Number of storeys

Equipment detail

Raw heat-pump and window references recorded for the matched homes.

Heat pump + backup
Backup fuel — share of heat-pump homes
Electricity vs. backup-fuel energy — mean kWh/yr

Top: what accompanies the heat pump in matched homes with one — the backup system that covers demand beyond the heat pump's own capacity, or when it's offline. Bottom: how much of the season's heating load the heat pump itself carried (electricity) vs. its backup, for homes with a gas, oil or propane backup. Electric-backup homes aren't shown here: the heat pump's own electricity draw can't be separated from an electric backup's. Wood backups still appear in the fuel-share chart above but not in this comparison.

Heat pump sizing — capacity vs. design heat loss

How much of a home's peak heating need the heat pump alone can cover, at the selected outdoor temperature.Ratio of AHRI-certificate-verified heat pump heating capacity to design heat loss (both kW) — not the raw auditor-entered capacity field, which runs well above the certified value and is inconsistent across different audit rows for the same certificate (see Methodology, section F). Homes without a resolvable AHRI certificate reference aren't included (see Methodology) — coverage is highest for retrofits from about 2019 onward.

Common heat pump models (outdoor unit)

Top 5 most common outdoor heat-pump units among matched homes (pre- and post-retrofit combined), grouped by brand + outdoor model number. One outdoor unit can be certified under several AHRI reference numbers — different indoor coil pairings, refrigerant lines... — so every certificate behind an outdoor model is listed underneath it. Each line shows heating capacity at 47°F and 5°F outdoor temperature, HSPF2 (seasonal heating efficiency), COP at 5°F, and cold-climate status where on file — click the AHRI number for its directory page.

Common window codes
Pre-retrofit
Post-retrofit

Top 5 window codes by frequency, decoded into glazing/coating/fill/spacer/frame using NRCan's published code tables.

Individual retrofits

Every matched home in this postal area, one row each — click to expand. (Shown when a single area is selected.)

Individual retrofits — click a row for detail
Sort by
AreaTypeBuiltm² EUI kWh/m²FuelSavingDepth
How this data was built — methodology

This tool visualises real home-energy audits. Here is where the data comes from, how it is transformed and analysed.

1 · Where the data comes from

Audit data comes from Natural Resources Canada's EnerGuide Rating System (ERS) open dataset — the official record of home-energy audits across Canada, covering audit years 2004–2026. NRCan introduced the rating system in 1998 as an unbiased, credible way to estimate how energy is used in a home, and it has since rated over a million of them. An audit is a registered energy advisor visiting a home and modelling it in HOT2000 — NRCan's residential energy analysis and rating software, described by NRCan as "the Canadian standard for evaluating the energy performance of houses and multi-unit residential buildings" — to work out how much energy the home uses and where that energy is lost.

2 · Matching "before retrofit" and "after retrofit"

Each audit record has an evaluation type tag. We treat type D as the initial ("before retrofit") evaluation and type E as the follow-up ("after retrofit") evaluation. A home is identified by a stable house ID, and we keep it when it has at least one before and at least one after audit. Where a home has more than one of either — a re-audit, or a home that went through an incentive program more than once — we use its earliest before audit and its latest after audit, so the pair spans the home's whole audit history. That after audit must be dated later than the before one. That paired record becomes one pre → post row. A home audited only once is dropped — there is nothing to compare it to.

3 · Making sure it's really the same home

To avoid accidentally comparing two different homes (or a home that had a major addition), a pair is kept only if, between the two audits, the floor area changed by no more than 5%, the house type, number of storeys, and number of dwelling units stayed the same, and both audits used the same weather data in the energy model. Pairs that fail these checks are removed before anything is counted.

4 · Converting everything to the same units

The source records each fuel in its own unit, so we convert everything to a common one — kilowatt-hours (kWh) — before comparing: natural gas from cubic metres, oil and propane from litres, wood from tonnes, and the overall total from megajoules. Electricity is already in kWh. Greenhouse-gas emissions are calculated by us: each home's own fuel use multiplied by today's official emission factors, so every matched home gets a figure and homes audited in different years compare fairly. We do not use the audit's own GHG number (see section I below).

5 · Fields we calculate ourselves

From the audit values we derive the numbers you see:

EUI (energy use intensity) = total energy ÷ floor area, in kWh/m² — lets a small efficient home and a large one be compared fairly.
Energy saving % = (before − after) ÷ before. Positive means energy use dropped; negative means it rose. Negative cases are rare (2.8% of homes) and mostly small: about 56% of them have no retrofit measure flagged. It is not clear why those homes have higher energy usage — see the open questions at the end of this section.
Retrofit depth, based on how much total energy fell. The three bands are mutually exclusive at the boundaries: Shallow = 0 to 10% saved (10% exactly counts as shallow), Medium = more than 10% and less than 50%, Deep = 50% or more (50% exactly counts as deep). A home that used more energy after the retrofit falls into none of the three — that is 2.8% of matched pairs, so the three shares do not sum to 100%.
Fuel switch = the main heating fuel changed (e.g. gas → electricity).
Design heat loss comes straight from the audit, converted to kW: the peak heating power the home needs on the coldest design day. It is a measure of the building envelope (and what heating equipment must be sized to), not annual energy use — a lower value after the retrofit can allow a smaller furnace or heat pump at replacement time.
Average measures per home = the mean, across matched homes, of how many of the 8 tracked upgrade measures (below) each home did — a home with insulation, air sealing and a heat pump added counts as 3. It is not a count of distinct upgrade "events", just how many of the 8 tracked categories cleared their threshold.

6 · What counts as an "upgrade"

Each measure is flagged per home using a sensible threshold, so tiny modelling wiggles don't get counted as real work:

Roof / wall / foundation / floor insulation — the insulation value went up by more than 10%.
Air sealing — air leakage dropped by more than 10%.
Windows changed — the recorded window type is different before vs after.
Heating system changed — the heating fuel or equipment type is different, and it wasn't a heat pump addition (see below) — a heat pump addition is itself a furnace type/fuel change, so without this exclusion "Heating system changed" and "Heat pump added" would double-count the same homes in every measure-mix chart. This exclusion applies to the aggregate charts on this page; the raw Heating_Change field in the per-home table (FSA mode) is the unmodified ERS diff and can be true alongside HeatPump_Addition.
Heat pump added — no heat pump recorded before, one recorded after. Can co-occur with a furnace type/fuel change (e.g. replacing a gas furnace with a heat pump) — that home counts only toward "Heat pump added", not "Heating system changed".

7 · Two views: postal code or province

Postal code. When you pick a single FSA (the first three characters of a postal code), the tool loads the actual individual audit records for that area and calculates everything live in your browser — that is why you also get the sortable table of individual homes.

Province. When you look at a whole province, doing that over hundreds of thousands of records would be slow, so the medians and chart shapes are pre-calculated once. Both paths use the same bucket widths and definitions, so the two views agree.

8 · How the histograms are built

Charts that show a distribution group values into fixed-width "buckets" and count how many homes fall in each — for example energy-use buckets are 20 kWh/m² wide, design-heat-loss buckets 2 kW, and the saving-% chart uses 1% steps. The "improvement" charts only count homes that actually got better on that measure, so homes that stayed flat don't dilute the picture.

9 · Things to keep in mind

These are modelled energy estimates from the audit software, not metered utility bills — actual consumption varies with weather and occupant behaviour. Outliers (e.g. EUI above 500 kWh/m²) are clipped so the charts stay readable. Pre-retrofit solar is rarely recorded in the source, so "solar added" reflects systems present at the follow-up audit and may slightly overcount homes that already had panels. The source data contains no retrofit cost information and no utility bills. This tool estimates annual operating costs using current provincial energy rates applied to modelled fuel consumption, and separately, as a proof of concept, an estimated retrofit cost and payback period (see below) — none of these are actual utility bills, historical costs, contractor quotes, or a substitute for a real payback calculation.

The sample is self-selected. Requiring both a before and an after audit means these are overwhelmingly homes that took part in retrofit incentive programs (which required the follow-up audit) and finished their planned work. Homeowners who renovated without a program, or who started and never booked the follow-up, are not captured — so the savings shown here are likely somewhat higher than what a randomly chosen renovation achieves, and the homes themselves skew toward owners motivated enough to go through a grant process.

10 · Estimated retrofit cost & payback (proof of concept)

A separate, experimental estimate — not derived from the ERS source data (which has no cost fields at all) but from pairing each home's recorded upgrades against PNNL/DOE's National Residential Efficiency Measures Database (REMDB), a US per-measure cost-regression database (2023 USD; no CAD conversion or Canadian-labour adjustment applied). Figures are incremental: insulation and air sealing have no business-as-usual equivalent, so their cost is the full REMDB figure; windows are priced as the efficient-minus-standard premium; an air-source heat pump is netted against the home's own pre-audit heating system (matched like-for-like where ERS records the fuel/type, a generic gas-furnace assumption otherwise) plus the air conditioner it replaces — and can come out negative, meaning REMDB estimates the heat pump was cheaper than replacing the old system. Solar panels and an HRV/ERV are priced at full REMDB cost too, on the same no-business-as-usual logic: PV from the capacity the audit actually added (post minus pre KWPV, at REMDB's per-watt rate), an HRV/ERV whenever the recorded ventilation type gains one — though that last one is a flat placeholder, since the fields REMDB fits it on (recovery efficiency and airflow) don't survive the pipeline. Low/Mid/High correspond to REMDB's 10th/50th/90th percentile cost regressions. Payback = incremental cost (mid) ÷ this home's own annual $ saved (the Energy bill card above) — undefined/hidden for homes with near-zero or negative energy savings, and flagged lower-confidence for Alberta electricity and for any home whose dominant pre-retrofit fuel is oil, propane, or wood, since those utility rates are national screening estimates, not measured per-province data (see the price-source note above). Coverage is partial: not every measure is priced (furnaces/boilers, floor insulation and doors are out of REMDB's current scope here), apartments/duplexes/triplexes are excluded entirely, and 13% of the homes it does cover end up with no priced measure at all — full methodology, per-measure formulas and every assumption: docs/RETROFIT_COSTS.md.

Advanced methodology — source columns, formulas & pipeline

This section documents the full technical pipeline for readers familiar with the EnerGuide Rating System (ERS) dataset and HOT2000 — including the original source column names, every conversion factor and threshold, and the transformation scripts. Column names in UPPERCASE are the original headers of the ERS public CSVs; mixed-case names (e.g. Pre_TotalEnergy) are the fields this site derives from them.

Pipeline overview — CSVs to interactive charts (hover any box)
No Yes ERS CSVs Annual extracts 2004–2026 Prepare Clean and normalize data Pair audits Group by HOUSEID Earliest D + latest E Calculate Convert to kWh, savings & measures Store data Store outputs in parquet files Canada JSON Precomputed charts Province JSON Precomputed charts FSA JSON Detailed home-level data Valid pair? Exclude Emission factors 2021 Census Energy Rates FSA map AHRI directory Transform and add data Transform data into JSON files for web loading and add supplemental data Interactive website Canada → Province → FSA Extract cost fields Footprint, windows, ASHP config (raw CSVs) Price vs REMDB Low/Mid/High, incremental vs business-as-usual Retrofit costs JSON Per-FSA companion tree joined client-side by HOUSEID Proof-of-concept branch — separate from the main ERS pipeline, priced against an external US cost database (section H)

How an ERS CSV extract becomes a row on this page: cleaned and paired into a before/after home (earliest initial audit, latest follow-up), checked that it's really the same home, converted to common units and reduced to the derived fields below, enriched with GHG emission factors — then stored as Parquet and transformed into the static JSON this page loads, enriched with Census, AHRI, pricing and boundary data, and split into Canada, province and FSA views. The dashed branch is the retrofit-cost proof of concept (section H): priced separately against an external US cost database and joined back in client-side by house ID. Hover (or focus with Tab) any box for the numbers, filters or data behind it. Full detail in sections A–J below.

A · Source data & record selection

Input is NRCan's public ERS dataset as annual CSV extracts (evaluation entry years 2004–2026, all provinces and territories, using the PROVINCE column). Records are separated on EVALTYPE: D = initial (pre-retrofit) evaluation, E = follow-up (post-retrofit) evaluation. Pairs are formed on HOUSEID, across all file years, with these rules applied in order:

Pairing. A HOUSEID is kept if it has at least one D record and at least one E record anywhere in the dataset. Where a home has more than one of either — a re-audit, or a home that went through an incentive program more than once — it is reduced to its earliest D and its latest E, so the pair spans the home's whole audit history. The E's ENTRYDATE must then be no earlier than the D's. ENTRYDATE is recorded to the month only, so a D and E in the same month tie; they are kept, because EVALTYPE — not the date — says which audit came first, and the EnerGuide data team confirmed on 2026-09-23 that same-month D and E audits are usable (84,754 pairs; until then a strict "later than" rule dropped them). Only 482 pairs where the E is genuinely dated before the D are dropped. Records with no ENTRYDATE are excluded before this reduction, since they cannot be ordered.

Changed 2026-07-24. This rule previously required exactly one D and exactly one E, dropping every multi-audit home rather than guessing which evaluation paired with which — 149,145 homes, about 9% of those holding both an initial and a follow-up audit. Measured against the full dataset, the earliest-D/latest-E reduction gives a correctly-ordered pair for 99.6% of them. The matched sample rose from 1,369,305 to 1,451,433 homes (+6.0%), and the share of D&E homes that end up matched rose from 84.0% to 89.1%; the remainder of the gain is absorbed by the same-home integrity filters below, which reject proportionally more multi-audit homes because a longer span makes structural change likelier. Headline results were essentially unchanged by the addition — the median saving stayed at 20% — which is the evidence that the recovered homes resemble the ones already included. The trade-off is stated in the open questions below: a home with two separate retrofit projects now contributes one row covering both.

Same-home integrity filters. A pair is dropped when the home appears to have physically changed between D and E:

  • FLOORAREA changed by more than ±5% (relative to D, which must be > 0). Tightened from ±10% on 2026-09-23 on the EnerGuide data team's advice; the tighter limit removes about 18,700 more pairs whose area moved 5–10%, the size of a small addition or a newly finished basement.
  • a change in TYPEOFHOUSE, STOREYS, or NUMDWELLINGUNITS
  • a different HOT2000 weather file (WTHDATA, e.g. Wth110 → Wth2020) in the D and the E. A new weather file changes modelled consumption by itself, so part of the "saving" would come from the model rather than the house. Added 2026-09-23 after the EnerGuide data team flagged weather-file changes; it removes 35,940 pairs (2.2%), which include all 97 pairs that also span the HOT2000 v10 → v11 upgrade. Blank on either side is not treated as a change.

These three are compared robustly, not as raw strings: NUMDWELLINGUNITS is compared as a number, so 1.0 and 1 (the same count written differently in different audit years) count as equal, and a field left blank in both audits is treated as unchanged — a pair is dropped only when a field genuinely differs, or is present in one audit but blank in the other. Changed 2026-09-25: NUMDWELLINGUNITS blank in one audit also counts as unchanged. The field is often left blank on the earlier audit and filled on the later one (blank → 0 or blank → 1 are the most common cases), so a blank means "not recorded", not a different number of units. Only two recorded counts that differ (e.g. 1 → 2) still drop the pair. This kept 22,687 more pairs; about 21,000 other one-side-blank homes are still dropped because their house type or storeys also changed, and about 2,000 fail the weather-file check. A count of 0 is treated the same way, as "not recorded", since a home cannot have zero dwelling units (0 → 1 was the next most common mismatch). That kept only 361 more pairs: most of those homes also changed weather file or house type between audits. TYPEOFHOUSE and STOREYS keep the stricter rule, but since 2026-09-25 ignore capitalization: the house-type labels switched from Single detached to Single Detached (and Mobile home to Mobile Home) around 2016–2020, and 29,109 pairs had been counted as a house-type change for that alone. 99.4% of them were also modelled with a different weather file, so they are still removed, now under the weather-file check where they belong; only 144 more pairs were kept. This removes additions, rebuilds, and evaluations keyed to the wrong house, without discarding pairs over cosmetic formatting or jointly-missing values. (An earlier exact-string comparison dropped roughly 831,000 otherwise-valid pairs on those two artifacts alone — almost all on NUMDWELLINGUNITS; see the open-questions note below.) No other outlier filtering is applied at the record level — extreme values are only clipped at chart-display time (see section G).

Nationally, about 1,646,734 HOUSEIDs carry both a D and an E record, and 1,541,128 matched pairs (93.6%) survive every gate above (as of 2026-09-25). Pairs removed, gate by gate in pipeline order: date order 482 · floor area 63,236 · house type / storeys / dwelling units 6,474 · weather file 35,940. Within the structural check a change in storeys is the largest reason (about 4,300 homes), ahead of a real change in house type (about 2,400) and in unit count (about 600); a home can fail more than one. An independent recount over the raw files (diagnose_pairing_drops.py) lands within 355 pairs of this total. Each matched pair is one address (HOUSEID): its oldest D and newest E, selected by those two records' own EVALUATIONSIDs. Fixed 2026-09-24: the records used to be pulled back by HOUSEID alone, so a second evaluation at the same address in the same year also got joined — 20,460 duplicate rows across 14,486 addresses, some pairing a D that was not the oldest or an E that was not the newest. Also fixed the same day: files up to 2025 write HOUSEID as 5063805.0 and the 2026 file as 5063805, which split 23,402 addresses in two; IDs are now normalized, which recovered about 17,400 homes with both audits. Known source quirk: 1,187 HOUSEIDs (mostly 2022 onward) are reused for different addresses in different provinces; pairing is done within each province, so each pair stays consistent, but the national funnel counts such an ID once.

Identity and descriptive fields carried through unchanged: HOUSEID, CLIENTPCODE (the forward sortation area — the public file carries only the first three postal characters), PROVINCE, YEARBUILT, FLOORAREA, TYPEOFHOUSE, STOREYS, FNDTYPE, and ENTRYDATE (reduced to year for publication).

B · Unit conversion to kWh

Each fuel is reported in its own unit in the source, so all energy quantities are converted to kWh at extraction time. MJ→kWh is exact (÷3.6). The per-fuel heating values are published Government of Canada conversion factors, cited per row below.

Derived field (pre/post)Source columnSource unitFactor to kWhEnergy content & source
Pre/Post_TotalEnergyEGHFCONTOTALMJ/yr× 0.277781 kWh = 3.6 MJ (exact)
Pre/Post_HeatEnergyEGHFURNACEAECMJ/yr× 0.277781 kWh = 3.6 MJ (exact)
Pre/Post_ElectricityEGHFCONELECkWh/yras-is—
Pre/Post_NaturalGasEGHFCONNGASm³/yr× 10.361137.30 MJ/m³ (0.0373 GJ/m³, basis 1,000 Btu/ft³) — CER energy conversion tables
Pre/Post_OilEGHFCONOILL/yr× 10.777838.80 MJ/L, light fuel oil — StatCan RESD 57-003-X (the factor ECCC's National Inventory Report uses)
Pre/Post_PropaneEGHFCONPROPL/yr× 7.091725.53 MJ/L — CER energy conversion tables
Pre/Post_WoodEGHFCONWOODGJ, else EGHHEATFCONSW, else EGHFCONWOODGJ/yr, else MJ/yr, else tonnes/yr× 277.778, else × 0.27778, else × 3,888.89GJ column used verbatim where populated (HOT2000 v11.2+); else HOT2000's own per-home heating-fuel split (already MJ, no assumption needed); tonne fallback (14.0 GJ/t) only for the remaining ~0.3% of records with neither column — NRCan Solid Biofuels Bulletin No. 2 (air-dry firewood 14–15 MJ/kg HHV)
Pre/Post_HeatLossEGHDESHTLOSSW× 0.001 (→ kW)design heat loss, not energy
Pre/Post_GHG_currentper-fuel consumption (Pre/Post_Electricity, _NaturalGas, _Oil, _Propane)tCO₂e/yrΣ fuel kWh × current (2026) ECCC factor ÷ 10⁶calculated for every matched pair; wood = 0 (biogenic). The audit's own ERSGHG is not used — see Methodology section I
Pre/Post_SolarPVKWPVkW DCas-is—

Wood. Since HOT2000 v11.2 the dataset reports wood energy directly in GJ (EGHFCONWOODGJ), which is used as-is — no heating-value assumption at all for those records. Older records only carry tonnes (EGHFCONWOOD), which by itself needs a heating-value assumption to convert to energy — but most of those records also carry EGHHEATFCONSW, HOT2000's own per-home split of heating energy by fuel (already in MJ, no assumption needed, and already used for the heating-only Pre/Post_HeatWood figures elsewhere on this page), so that's used first. Only for the remaining ~0.3% of tonnes-only records with neither column does the flat 14.0 GJ/t fallback apply, and for those, per-home wood energy is approximate to the extent the actual wood type (softwood, hardwood, pellets) differs from that figure. (A flat-factor version of this fallback previously produced a small number of homes — 29 Pre-audit, 14 Post-audit, all wood-primary — where computed wood energy exceeded the home's own reported total; preferring EGHHEATFCONSW resolves this, since it's a subset of the home's own reported heating total by construction.)

Validation. As a consistency check, for homes consuming electricity plus exactly one other fuel, the per-fuel quantities × these factors reconcile with the audit's own total (EGHFCONTOTAL) to within about 1% across all audit years — so the cited factors closely track whatever HOT2000 applies internally. None of this affects Pre/Post_TotalEnergy or any savings figure (those convert from MJ exactly); it only scales the per-fuel breakdown charts.

C · Calculated fields

All formulas operate on the kWh-converted values above; percentages are undefined (null) when the denominator is not > 0.

FieldFormulaSource columns
EnergySavingPct(pre − post) ÷ pre, on total energyEGHFCONTOTAL (D, E)
HeatEnergySavingPct(pre − post) ÷ pre, on space-heating energyEGHFURNACEAEC (D, E)
EUI (kWh/m²)total energy ÷ floor area, computed at render time for pre and post separatelyEGHFCONTOTAL, FLOORAREA
Average measures per homesum of the 8 measure-flag counts (section D) ÷ matched-home countall 8 *_Upgrade/*_Change/HeatPump_Addition flags
FuelSwitchprimary heating fuel differs between D and EFURNACEFUEL (D ≠ E)
Shallow_Retrofitpost ≥ 0.90 × pre and post ≤ pre (saved 0–10%)EGHFCONTOTAL
Medium_Retrofitpost < 0.90 × pre and post > 0.50 × pre (saved >10%, <50%)EGHFCONTOTAL
Deep_Retrofitpost ≤ 0.50 × pre (saved ≥ 50%)EGHFCONTOTAL
(no band)post > pre — energy rose. All three flags are false, so the bands do not sum to the matched-home count (2.8% of pairs)EGHFCONTOTAL
Pre/Post_Yearyear component onlyENTRYDATE (D, E)

D · Measure (upgrade) definitions

Each measure is a per-home boolean computed from the D vs E values of one or two source columns. The ±10% thresholds are meant to avoid counting a slight modelling difference as a retrofit measure — AIR50P of 5.8 in one audit against 5.83 in the other, for example, is re-measurement noise, not work performed.

Measure flagSource columnRule (D = pre, E = post)
Wall_Insulation_UpgradeMAINWALLINS (RSI)E > 1.10 × D, with D > 0
Roof_Insulation_UpgradeCEILINS (RSI)E > 1.10 × D, with D > 0
Foundation_Insulation_UpgradeFNDWALLINS (RSI)E > 1.10 × D, with D > 0
Floor_Insulation_UpgradeEGHINEXPOSEDFLR (RSI)E > 1.10 × D, with D > 0
Air_Tightness_UpgradeAIR50P (ACH @ 50 Pa)E < 0.90 × D, with D > 0 (lower is better)
Windows_ChangeWINDOWCODEboth non-empty and different, after normalizing text format (201030.0 = 201030)
Windows_PartialNUMWINESTAR, WINDOWCODEE count > D count (both recorded) and Windows_Change not set
Heating_ChangeFURNACEFUEL, FURNACETYPEeither differs
HeatPump_AdditionHPSOURCEblank or "N/A…" in D, populated in E

Supporting HVAC detail columns carried for display: HEATAFUE, EGHFURSEASEFF (seasonal efficiency/COP), HPSOURCE, COP, and AHRI (the certified heat-pump reference number — see section F).

E · Transformation pipeline (Python)

Stage 1 — annual CSVs → one Parquet per province (ers_web_pipeline.py). The yearly source CSVs are too large to load in memory, so they are stream-read with PyArrow in ~100k-row batches, all columns as strings (numeric coercion happens later, per column). Three passes: (1) split each year's file into D and E Parquet intermediates per province; (2) build a cross-year pairing index of HOUSEID → (D year, E year) applying the exactly-one-D/one-E and date-order rules; (3) join each (D-year, E-year) group, apply the integrity filters, unit conversions, measure flags, and derived fields, and append to ers_web_<PROV>.parquet (Snappy compression, ~50 columns). One data-quality repair worth noting: some source years serialize the AHRI identifier as 211644151.0 and others as 211644151; without normalizing the trailing .0, ~20% of Ontario's "distinct" AHRI numbers were duplicates of this kind.

Stage 2 — Parquet → static JSON. Three scripts read the province Parquet files and emit everything the page fetches:

split_fsa_json.py writes one file per FSA (fsa_json/<PROV>/<FSA>.json) holding that area's raw matched rows, plus a per-province _index.json (row count, median saving, and dore_count per FSA, used for the search typeahead, the choropleth, and the "retrofits selected" KPI denominator). dore_count is the area's full audited population — every HOUSEID with any initial (D) or follow-up (E) evaluation, matched or not — computed by a separate lightweight scan of the raw ERS CSVs (build_fsa_audit_totals.py), since the shipped files carry only matched pairs. A home is counted under its D record's FSA (or its E record's when it has no D). Categorical values are case-normalized first — audit years disagree on casing ("single detached" vs "Single Detached"), which otherwise silently splits one category into two. Annual-kWh columns are rounded to integers and EnergySavingPct kept at 4 decimals to control file size. AHRI numbers are masked to each province's five most common (matching what the province view lists); all other values ship as null.

precompute_province_stats.py writes province_json/<PROV>.json: every chart on the page, pre-aggregated in Python for the whole province and for each house-type slice — medians, measure counts, Sankey fuel-flow totals, per-fuel means for the waterfall, and all histogram bins. Bin widths and clipping rules are copied verbatim from the front-end code (EUI 20 kWh/m², GHG 1 tCO₂e, design heat loss 2 kW, savings 1%, insulation 0.25–0.5 RSI/ACH steps), so the precomputed province view and the raw-row FSA view produce identical chart shapes for the same data.

aggregate_canada.py builds the all-Canada default view: counts and histogram bins are additive and summed exactly from the province JSONs; medians are not additive, so the national medians (and those for each program era) are computed exactly from every matched row, by running the same per-slice code the provinces use over all provinces' rows together. Until 2026-09-25 they were read off the summed histogram bins, which returned the lower edge of the bin — the Canada GHG headline showed 6.0 → 5.0 tCO₂e/yr where the true medians are 6.85 → 5.00; the fuel waterfall ships per-home means, so each province's mean is weighted by its row count before combining.

Why this format. The site is static — plain files served from a repository, no database or API server. Loading a full province of raw rows into the browser (hundreds of thousands of rows) is neither fast nor necessary, so the page fetches the smallest artifact that answers the current selection: one precomputed province JSON when no FSA is chosen, or one FSA's raw-row file (median ≈ 490 rows, largest ≈ 5,800) when one is. FSA files use an array-of-arrays layout ({"columns": […], "rows": [[…], …]}) rather than an array of objects — writing the ~50 column names once instead of once per row measured ~77% smaller for a typical FSA. Raw rows are only shipped at FSA granularity, which is also what makes the individual-retrofits table possible there and not province-wide.

F · Supplementary datasets

2021 Census join. extract_fsa_census.py reads the Statistics Canada 2021 Census Profile at forward-sortation-area geography (catalogue 98-401-X2021013, long format: one row per FSA × characteristic) and keeps ~30 housing-stock characteristics by their CHARACTERISTIC_ID: population (1), total private dwellings (4), structural dwelling type (42–49), tenure (1415–1416), period of construction (1441–1448), dwelling condition (1450–1451), and owner-household costs and values (1482–1489). StatCan suppression and quality symbols (x, F, E, r, rE, .., …) become nulls. The result is one ~1 MB JSON keyed by FSA, fetched once and joined in the browser to the selected area via CLIENTPCODE. This is a context panel only — census values never enter the retrofit calculations.

Heat pump backup identification. For a home with a heat pump, the heating-equipment fuel and type columns (FURNACEFUEL, FURNACETYPE) describe the companion system HOT2000 models alongside the heat pump — the furnace or boiler that covers load beyond the heat pump's capacity or when it is offline — not the heat pump's own energy source, which is always electricity. That is what the "Heat pump + backup" card counts. The "still burned this fuel" sub-line is the share of homes with that recorded backup fuel whose post-retrofit heating-only consumption in that same fuel is above zero (Post_HeatNaturalGas, Post_HeatOil, Post_HeatPropane). It is computed for combustion fuels only: electric backup shares a meter with the heat pump's own draw, so the figure would be 100% by construction, and the wood species share a single combined consumption field.

AHRI directory enrichment. The ERS AHRI column carries the AHRI certification number of an installed heat pump but no product details. Every number surfaced on the site is looked up against the AHRI Directory's public search endpoints; current (Appendix M1) rating fields are preferred, with legacy Appendix M values as fallback: brand, model, heating capacities at 47 °F / 17 °F / 5 °F, HSPF2, SEER2/EER2, COP at 5 °F, refrigerant, ENERGY STAR and cold-climate designations, and listing status. Appendix M and Appendix M1 are the two versions of the US Department of Energy's test procedure for rating heat pumps and air conditioners (10 CFR Part 430, Subpart B). M1 took effect for equipment manufactured from 2023 and tests at external static pressures closer to real installed ductwork, so it generally reports lower capacities and efficiencies than M did for the same unit — which is also why its efficiency metrics are renamed (HSPF2, SEER2, EER2). The two are not interchangeable, so where a certificate carries both the M1 figures are used and the M values only fill gaps. Numbers that no longer resolve are flagged "Delisted" rather than dropped. The page renders these beside each AHRI number and deep-links to the directory entry.

Which ERS heat-pump fields agree with the certificate, and which don't. The raw auditor-entered HPCAP (heat pump capacity, Watts) is unreliable for a sizing claim — checked against the AHRI certificate across 318,585 rows nationally, it runs a median 1.6× the certified 47 °F capacity, clusters visibly near 1×/2×/4× of the true value (consistent with a unit-entry error), and 63% of AHRI codes appearing more than once show inconsistent HPCAP values across different audit rows for the very same certified unit. The generic COP field looked similarly unreliable at first — its values run systematically higher than the certificate's Heating_COP_at_5F_M1 — but a spot-check against NEEP's published performance table for the site's most common installed unit (AHRI 211644151) shows why: NEEP lists that unit's COP as 3.00 at the AHRI 47 °F rated point and 1.80 at 5 °F, and the ERS COP field's median for that exact unit is 2.99 — matching the 47 °F point, not 5 °F. COP appears to be recorded at the mild rating condition throughout, so it isn't unreliable, it's just being compared at the wrong temperature; the AHRI Directory's own search endpoint only exposes a certified COP at 5 °F, so this can't yet be validated at 47 °F across the full dataset. The cold-climate-ASHP-specific fields do carry a 5 °F match already recorded elsewhere in the source: CCASHPCOP (present when CCASHP = "T") agrees with the certificate's 5 °F COP almost exactly — HOT2000 most likely populates it from the AHRI number directly rather than a manual entry — and CCASHPCAPACITYMAINTENANCE (the auditor-recorded 5F/47F capacity ratio, as a %) tracks the certificate closely too: across 210,243 rows nationally, the median difference from the certified value is 0.0 percentage points, and 85% of homes land within ±10pp of it. None of these three fields — CCASHPCAP, CCASHPCAPACITYMAINTENANCE, CCASHPCOP — are currently used on this page; this note is left here as a record of which raw fields to prefer if that changes.

Energy prices (the bill card). The "Energy bill — $ per year" chart prices each home's modelled energy at current residential rates; no price data comes from the ERS dataset itself. Natural gas tariffs come from the community-maintained MaxPr1me/canada-utility-rates repository, which aggregates official utility and regulator rate pages and is re-scraped monthly; each rate we keep carries the originating source_url, so any number can be traced back to the utility that published it. Electricity tariffs no longer come from that repository: it was caught giving a Saskatchewan rate (9.28¢/kWh, dated 2025-01-01) about 67% below SaskPower's own published schedule (15.476¢/kWh, effective 2026-02-01) despite being flagged "high confidence," and a forced re-download reproduced the same stale figure. Electricity is now sourced from offgridsolarsystem.ca's rate-aggregation page (dated 2026-07-01) instead — a third-party blog, not a utility-primary source, chosen because it was independently verifiable (it matched SaskPower's own PDF exactly) and gives full national coverage in one place. Only the Saskatchewan figure has actually been cross-checked against a utility source; the rest of the country is carried as-is and flagged, not confirmed — see section H below for the full account. Heating oil comes from StatCan table 18-10-0001 (monthly average retail price of household heating fuel, ¢/L by city), and heating oil and propane also come from NRCan's Prices by City exports (Furnace Oil and Auto Propane) — that page has no machine-readable endpoint, so those two are a manual re-download step rather than an automated fetch.

Reduction rules, applied by rates_etl.py (per-city detail for ON/QC/AB) and utility_rates_reference.py (one blended number per province, all provinces): residential tariffs only; the latest effective_date per (utility, tariff) wins; carbon components are excluded because the federal consumer fuel charge went to zero on 2025-04-01; $/GJ converts to $/m³ at 0.03798 GJ/m³ and $/day fixed charges to monthly at ×365/12; a utility offering several residential plans contributes one, time-of-use blended to a single ¢/kWh on the OEB-typical 63/18/19 off/mid/on split. Alberta is the weak spot: it is deregulated, so energy and wires are separate bills that must be summed rather than averaged, and the upstream export omits the electricity transmission volumetric charge and the default gas commodity charge outright — screening-grade constants are substituted for both, flagged low confidence, because omitting them would bias AB electricity ~15% low and make AB gas look nearly free. Propane, oil and wood rates are single-province averages throughout and are lower confidence than the electricity and gas tariff figures; the wood rate is one flat national screening ¢/kWh, since no per-species price breakdown exists.

Window-code decoding. WINDOWCODE is the 6-digit HOT2000 window characterization code; each digit position indexes a lookup table — glazing, coating/tint, gas fill, spacer, window type, frame material. The digit tables are used both to render a readable description and to compare pre vs post codes attribute-by-attribute for the "most common window changes" card. User-defined codes (digits outside the standard tables) are shown raw and excluded from the attribute comparison. The 6 tables, from NRCan's Support.xlsx reference workbook (Python/build_window_lookup.py):

1 — Glazing
1 Single (SG)
2 Double/double with 1 coat
3 Triple/triple with 1 coat
4 TG with 2 coatings
5 Double Acrylic
6 DG + 1 Heat Mirror 66
7 DG + 1 Heat Mirror 88
8 DG + 12Heat Mirror 88
2 — Coating/tint
0 Clear
1 Low-E .04 (soft)
2 Low-E .10 (soft)
3 Low-E .20 (hard1)
4 Low-E .35 (hard2)
5 Tint
6 Tint + Low-E .04
7 Tint + Low-E .10
8 Tint + Low-E .20
9 Tint + Low-E .35
A Reflective
B Reflective + tint
3 — Fill
0 13 mm air
1 9 mm air
2 6 mm air
3 13 mm Argon
4 9 mm Argon
5 6 mm Argon
6 9 mm Krypton
4 — Spacer
0 Metal
1 Fused Glass
2 Insulating
5 — Window type
0 Picture
1 Hinged
2 Slider with sash
3 Semi-sash slider
4 Patio door
5 Skylight
6 — Frame
0 Aluminum
1 Aluminum Thermal Break
2 Wood
3 Aluminum Clad Wood
4 Vinyl
5 Reinforced Vinyl

Map boundaries. FSA polygons come from Statistics Canada's 2021 cartographic boundary file (lfsa000b21a_e), inverse-projected from the Statistics Canada Lambert conformal conic to WGS84 geographic coordinates and simplified with an area-scaled tolerance (small urban FSAs keep near-full detail; very large rural FSAs are simplified aggressively) into one GeoJSON per province.

Map colour scale. Shapes are filled on a diverging scale centred on 0% median saving (green = saved energy, red = used more), or a sequential navy scale by audited-home count when no FSA in view has a saving figure. Both use a gamma-corrected mix (t^0.55 rather than a straight linear blend from the pale base colour) so low-magnitude areas — most of a typical province's range — separate visually instead of bunching near-white; the legend bar is sampled from the same function so it matches the fill exactly. Each shape additionally prints its own median saving % at its bounding-box centre, sized off that shape's own footprint (small FSAs below a legibility floor are left unlabelled rather than showing an unreadable smudge).

G · Assumptions & known limitations

Fuel energy contents are published Government of Canada conversion factors (table in section B, sources cited per fuel), applied as single constants — not utility- or year-specific heating values (real delivered natural gas varies by a few percent). They reconcile with HOT2000's own totals to within ~1% (see the validation note in section B); the largest remaining assumption is the 14.0 GJ/t wood fallback on records that predate EGHFCONWOODGJ. Since the headline total (EGHFCONTOTAL) is converted from MJ exactly, none of this affects the savings figures.

The ±10% measure thresholds are heuristics, chosen to separate real work from model-to-model noise, not derived from a formal sensitivity analysis. Negative energy savings occur in 2.8% of matched pairs; about 56% of those have no measure flagged at all, which could be inter-audit modelling variance rather than retrofits that backfired — but this has not been confirmed (see the open questions at the end of this section).

All energy values are HOT2000 modelled estimates under standard operating conditions, not metered consumption. GHG applies one flat set of current (2026) official factors to every audit year (section I). That makes retrofits from different years comparable, but it does not reflect the grid the home actually ran on at the time.

The sample is self-selected: requiring both a D and an E evaluation selects heavily for incentive-program participants who completed their planned work and booked the follow-up. That mechanism points upward: these homes did the work and came back to have it verified, which the average renovation attempt does not. It is a reasoned expectation rather than a measured bias, and it is not the only selection at work — incentive programs also steer participants toward a particular, often cheaper, measure mix. Treat these savings as unrepresentative of Canadian homes generally, most plausibly on the high side, rather than as a quantified upper bound.

Geography is FSA-only (the public dataset carries just the first three postal characters in CLIENTPCODE), and charts clip display outliers for readability (EUI ≤ 500 kWh/m², GHG ≤ 30 tCO₂e, design heat loss ≤ 150 kW, floor area ≤ 700 m², year built 1850–2030) — clipped homes remain in all medians and counts. The Canada-wide view offers only "All types" because house-type labels are not a consistent taxonomy across provinces. The source contains no retrofit cost information and no household utility bills. Dollar values on the Energy bill card are estimated operating costs derived from modelled energy use and current provincial energy prices. A separate, proof-of-concept retrofit cost and payback estimate (section H above) is priced against an external US cost database, not derived from the ERS source data — partial coverage, not a substitute for a real quote.

H · Retrofit cost estimate — proof of concept

What it is. A separate model, run outside the ERS pipeline entirely — the source data has no cost fields — that prices each home's recorded measures against PNNL/DOE's National Residential Efficiency Measures Database (REMDB), vintage 2024.12.23 (2023 USD; no CAD conversion or Canadian-labour adjustment applied anywhere). Every figure is an incremental cost — the extra spend over the business-as-usual (BAU) choice a homeowner would likely have made anyway, not a full invoice — computed at REMDB's Low/Mid/High (10th/50th/90th percentile) quantile-regression coefficients: material_price = coef1×metric1 + coef2×metric2 + intercept, then either × installation_multiplier or + installation_adder (REMDB's own rule — each component/class row uses exactly one of the two), with metrics clamped to REMDB's stated bounds before use.

Per measure. Roof/wall/foundation insulation and air sealing have no BAU equivalent (nobody re-insulates as routine upkeep), so incremental cost is full REMDB cost, priced against geometric area proxies derived from FOOTPRINT/BASEMENTFLOORAR under a rectangle-footprint assumption (2:3 aspect ratio, a stated judgement call, not a sourced Canadian housing-stock distribution). Windows are priced as efficient(post pane count) − standard(pre pane count), per window, from REMDB's raw Windows Data sheet (not its collapsed machine-readable row, which cannot see glazing class), with frame material (Vinyl/Metal) read from WINDOWCODE's frame digit where decodable. Solar PV and HRV/ERV are likewise full-cost, not incremental: PV is priced on the capacity the retrofit added (Post_SolarPV − Pre_SolarPV, clamped to 0.1–20 kW to drop unit artifacts) against REMDB's Solar PV row, which is a $/watt regression rather than a flat system price; an HRV/ERV is flagged when CENVENTSYSTYPE goes from neither to one of them, and priced at REMDB's Mechanical Ventilation / ERV-HRV row using fixed midpoint metrics (0.70 SRE, 150 CFM), because neither recovery efficiency nor airflow survives ers_web_pipeline.py — every such row carries hrv_source = flat_placeholder_metrics, so it is a class-average placeholder, not a per-home fit.

An air-source heat pump is netted against the home's own pre-audit heating system plus the air conditioner it replaces: incremental = ASHP_cost − BAU_heating_cost − BAU_cooling_credit, and can be negative. BAU heating is like-for-like where possible — Pre_HeatType/Pre_HeatFuel mapped to the closest REMDB row (gas furnace, gas/oil boiler, electric baseboard, all REMDB-fitted; plus two rows REMDB itself never fit but real raw line-item data exists for — Oil Furnace and Electric Boiler — derived as the 10th/50th/90th percentile installed-$/BTU or material-$/BTU across 6 and 10 raw workbook rows respectively) — falling back to a generic gas furnace only when REMDB has no row at all for that fuel/type (propane, wood, electric furnace). The BAU cooling credit reads ACCENTESTAR/ACWINDNUM/cooling-energy fields to credit central, room, or no pre-existing A/C. ASHP ducted-vs-ductless classification (HPEquipType/NUMBEROFHEADS, base-case fields — not the UGR*-prefixed "proposed upgrade" variants) falls back, when unrecorded (the pre-2025 majority of records), to each province's own most-common reported class rather than one hardcoded constant — Atlantic Canada (PE/NB/NF/NS) independently falls back to ductless, every other province/territory to centrally-ducted, consistent with each region's forced-air-furnace housing stock.

Payback = incremental cost (mid) ÷ this home's own annual $ saved, using the same blended provincial rates as the Energy bill card above (utility_rates_reference.json) — computed directly in the cost pipeline, not from the bill card's own rendering path. Electricity rates were re-sourced this round: the prior source (canada-utility-rates) was caught giving a Saskatchewan rate stale by over a year and ~67% understated, despite being marked "high confidence" internally — verified directly against SaskPower's own published rate PDF. Electricity now comes from a third-party rate-aggregation page, cross-checked against SaskPower and matching exactly there, but not independently re-verified for any other province — flagged, not settled. Natural gas stayed on the original source after the same audit found every province's gas rate frozen at an identical 2024-10-01 effective date (~21 months stale), a more systemic gap with no verified replacement lined up yet. Heating oil and propane rates (needed for payback on Atlantic Canada's oil-heavy stock) use national screening constants pending the same NRCan "Prices by City" manual-download step that section F's price notes describe — cross-checked against two independent current sources (~$2.00 CAD/L oil, ~$1.10 CAD/L propane) but not per-province. Every payback figure carries a machine-readable flag for which of these applied.

Pipeline & delivery. Python/retrofit_cost_extract_fields.py pulls the ERS fields ers_web_pipeline.py's BASE_MAPPING doesn't carry (footprint, window/door counts, ASHP config, pre-existing cooling) straight from the raw yearly CSVs. Python/retrofit_cost_estimate.py does the pricing, run per province, all 10 provinces plus Northwest Territories and Nunavut (Yukon has no ERS records at all). Its input is 1,509,263 records, not the full 1,541,128 matched pairs: apartments, duplexes and triplexes are excluded outright (31,865 records, 2.1%) because REMDB's regressions are fitted on single-dwelling geometry and the footprint proxies below are meaningless for a unit inside a larger building. Of those 1,509,263, 1,313,102 (87%) carry at least one priced measure (costs regenerated 2026-09-25 against the current pairs). Python/build_retrofit_costs_json.py splits the output into a companion tree, retrofit_costs_json/<PROV>/<FSA>.json, mirroring fsa_json's own per-FSA layout and array-of-arrays compression, with dictionary-coded categorical columns (a shared _dictionary.json) instead of repeating string labels per home. Deliberately a separate tree from fsa_json, joined client-side by HOUSEID — cost methodology has changed independently of the underlying ERS row data repeatedly during this feature's development, and keeping them separate means a cost-only fix stays a small script re-run instead of forcing a full fsa_json rebuild every time.

Coverage is partial and this is a proof of concept, not a production estimate. Eight measures are priced (roof, wall and foundation insulation, air sealing, windows, ASHP, solar PV, HRV/ERV); furnace/boiler replacement cost, floor insulation, and doors are not priced at all (no capacity/area field survives the pipeline, or no change-signal field exists). Apartments, duplexes and triplexes are excluded from the whole cost model (31,865 of the 1,541,128 matched pairs), since REMDB's regressions and the footprint proxies above both assume single-dwelling geometry. Insulation material and wall construction type are fixed assumptions (Batt, Wood/Steel Stud) — ERS records neither; the HRV/ERV figure uses fixed placeholder metrics rather than per-home ones. The rectangle-footprint aspect ratio (2:3) is an assumed judgement call, not a sourced distribution. Full methodology, every formula and assumption: docs/RETROFIT_COSTS.md.

I · GHG emissions

How it is calculated. For every matched home, before and after: each fuel's annual consumption (kWh) × that fuel's current (2026) official emission factor from ECCC's published reference values, summed and divided by 10⁶ to give tCO₂e/yr. Electricity uses the home's province's grid factor; natural gas, oil and propane use fixed combustion constants; wood counts as 0 (biogenic, no official factor). The same factors apply to every audit year, so a 2008 retrofit and a 2024 retrofit are compared on equal footing — the figures show what each retrofit's energy change is worth in emissions today, not what it emitted at the time.

ProvinceElectricity, g CO₂e/kWh (2026)
Alberta438
British Columbia18
Manitoba2.5
New Brunswick234
Nfld. & Labrador17
N.W.T.420
Nova Scotia581
Nunavut800
Ontario59
P.E.I.234
Quebec1.9
Saskatchewan631
Yukon74

Combustion, all provinces: natural gas 185–189 g CO₂e/kWh (varies slightly by province), heating oil 255.4, propane 213.6, wood 0. Constants and citations: ghg_factors.py; calculation: compute_ghg_scenarios.py.

Why not the audit's own GHG figure. The EnerGuide file has its own GHG field, ERSGHG. We do not use it, on the EnerGuide data team's advice (2026-09-23): it was reported for only about half of matched pairs (50.5% nationally, as low as ~9% in Saskatchewan), and the emission factors behind it were updated only sporadically, so audits from different years used different, sometimes outdated, factors. Until 2026-09-23 this page offered four GHG bases, including that field and two variants calibrated to it; they were retired in favour of this single one. The history is in docs/RETROFITS.md.

Limitations. What the data can't tell us: the emissions a home actually produced in its audit year. What we assumed: today's grid mix and combustion factors for every year, and zero for wood. What would change the answer: a different grid year — grids like Alberta's have been changing, so the same retrofit is worth a different GHG saving at older factors; the EnerGuide data itself implies an Alberta electricity factor about a third higher than ECCC's 2026 value (585 vs 438 g/kWh).

J · Open questions — to be investigated with the EnerGuide team

Open items we would like to confirm with NRCan's EnerGuide team.

  • Homes with more than one D or E audit. When a HOUSEID has several initial and/or several follow-up audits (a re-audit, or a home that went through an incentive program more than once), these 149,145 homes — about 9% of those holding both audit types — used to be dropped entirely rather than guessing which evaluations pair. They are now paired earliest-D to latest-E, which yields a correctly-ordered pair for 99.6% of them and raised the matched sample from 1,369,305 to 1,451,433 homes.
    What we would like the EnerGuide team to confirm: is earliest-D-to-latest-E the right reduction? About 55% of these homes have two Ds and two Es, and for them the span may cover two separate retrofit projects reported as one before/after. We chose it because it is conservative in the direction that matters — it captures the home's whole change rather than an arbitrary half — and because headline results barely moved when the homes were added (median saving stayed at 20%), suggesting they behave like the homes already in the sample. But if the intended reading is one row per project, the correct treatment would instead be to pair each D with the next E that follows it, producing multiple rows per home. Which does NRCan consider faithful to how these evaluations are recorded?
  • Same-month audit dates (~84,900 nationally, ~5% of D&E homes) — settled 2026-09-23, now included. ENTRYDATE in the public file is recorded at month precision (values are the first of a month), so a D and E carried out in the same month tie, and the old "follow-up dated after initial" rule dropped them. None had unparseable dates, and 99.4% were exact same-day ties rather than reversals. The EnerGuide data team confirmed same-month D and E audits are usable, so the rule is now E ≥ D. The 482 pairs where the E genuinely predates the D remain excluded.
  • Negative energy savings with no measures (2.8% of matched pairs). Some homes use more energy after the retrofit than before, and about 56% of those have no retrofit measure flagged at all. The working assumption is inter-audit modelling variance, but that has not been confirmed — what else could explain it? (Both figures fell when the pairing rule above changed — previously ~4% and ~75% — which is itself mild evidence for the modelling-variance reading, since the homes added were ones with longer, better-documented audit histories.)
  • Conversion factors. The kWh conversions in section B use published Government of Canada heating values. Are there factors better aligned with HOT2000’s own fuel library and the ERS, which we could adopt instead?
  • Heating-only propane exceeds whole-house propane by a constant 0.27%. Space-heating consumption (EGHHEATFCONSP) should by definition be a subset of the home's total propane use, yet it exceeds it in about 80% of propane-heated homes. The ratio is not scattered — it sits at 1.0027 across the interquartile range, which is the signature of a units constant rather than a data fault. It matches: the heating field is HOT2000's own MJ output, while whole-house propane is a volumetric column converted here at 25.53 MJ/L (CER, section B), and 25.60 ÷ 25.53 = 1.0027. In other words HOT2000 appears to use ~25.60 MJ/L internally and our published figure is 0.27% low. This is cosmetic at chart scale but it is the cleanest available evidence of a HOT2000 fuel-library value, so it is worth confirming and adopting.
  • What exactly each envelope component in "Where the heat escapes" covers. The six EGHHL* fields are taken at face value as Windows & doors (EGHHLWINDOOR), Walls (EGHHLWALLS), Foundation (EGHHLFOUND), Roof (EGHHLCEILING), Exposed floor (EGHHLEXPOSEDFLR) and Air leakage (EGHHLAIR), but HOT2000's own component boundaries are not publicly documented in detail.
    What we would like the EnerGuide team to confirm: does EGHHLAIR include mechanical ventilation heat loss (e.g. an HRV's unrecovered share) or only envelope infiltration? Does EGHHLFOUND cover the whole basement/crawlspace envelope (walls and slab) or just below-grade walls, with the slab counted elsewhere? Does EGHHLCEILING include cathedral/flat-roof assemblies, or only attic ceilings? Confirming the boundaries would let us describe each bar precisely instead of by field name alone.
  • What emission factors does HOT2000 use to compute ERSGHG, and at what geographic granularity? Settled 2026-09-23: the EnerGuide data team advised using current official factors and not relying on ERSGHG (partial reporting, sporadic factor updates). We no longer use the field — see section I.

Both pairing items are surfaced in the "From every audit to your selection" funnel above: the Not paired flow is where the remaining unpaired homes drop out. Since both pairing items were resolved, that flow has shrunk — about 94% of homes holding both an initial and a follow-up audit now reach the matched sample, up from 84.0% before 2026-07-24.

Sources

Data availability — every ERS column vs. what this page uses

The public EnerGuide/ERS extract carries 433 columns per audit record. This page reads 48 of them. The table below is every one of those 48, grouped in pipeline order, with its % filled (measured across all 4,542,544 raw audit records — see caveat below), the unit conversion applied if any, and exactly what it's used for. The full 433-column reference, with the same fill-rate methodology, is in ERS_DATA_DICTIONARY.md.

ERS source columnUsed as% filledConversionUsed for
Identity & pairing
HOUSEIDHOUSEID100.0%—Pairing key: matches one home's before (D) and after (E) audits
CLIENTPCODEFSA100.0%—FSA (postal first 3 chars) -- area selector, map
PROVINCEPT100.0%—Province selector
YEARBUILTYearBuilt100.0%—Year-built distribution
FLOORAREAFloorArea100.0%—Floor-area distribution; same-home match gate (≤5% change pre/post)
TYPEOFHOUSEBldgType100.0%—Building-type filter/breakdown; same-home match gate (must match pre/post)
STOREYSStoreys100.0%—Storeys distribution; same-home match gate (must match pre/post)
FNDTYPEFoundationType90.3%—Foundation type (displayed)
NUMDWELLINGUNITS(filter/flag only, not a displayed column)48.2%—Same-home match gate (must match pre/post) -- not shown in table
EVALTYPE(filter/flag only, not a displayed column)100.0%—Splits each row into "before" (D) vs "after" (E) audit
ENTRYDATEPre_/Post_Date100.0%—Audit date; pairing order gate (E must postdate D); audit-year extraction
Energy totals, per fuel (whole-house)
EGHFCONTOTALPre_/Post_TotalEnergy100.0%× 0.27778 (MJ → kWh)% energy saved; retrofit depth (shallow/medium/deep) thresholds
EGHFURNACEAECPre_/Post_HeatEnergy100.0%× 0.27778 (MJ → kWh)% heating energy saved
EGHFCONELECPre_/Post_Electricity100.0%—Energy-by-fuel chart, fuel Sankey
EGHFCONNGASPre_/Post_NaturalGas100.0%× 10.3611 (m³ → kWh)Energy-by-fuel chart, fuel Sankey
EGHFCONOILPre_/Post_Oil100.0%× 10.7778 (L → kWh)Energy-by-fuel chart, fuel Sankey
EGHFCONPROPPre_/Post_Propane100.0%× 7.0917 (L → kWh)Energy-by-fuel chart, fuel Sankey
EGHFCONWOODPre_/Post_Wood100.0%× 3888.89 (tonne → kWh, fallback)Energy-by-fuel chart, fuel Sankey (tonnes fallback path)
EGHFCONWOODGJ—43.4%—Preferred wood-energy source when populated (HOT2000 v11.2+)
Heating-only energy, per fuel
EGHHEATFCONSEPre_/Post_HeatElectricity94.2%× 0.27778 (MJ → kWh)Heating-only per-fuel breakdown
EGHHEATFCONSGPre_/Post_HeatNaturalGas94.2%× 0.27778 (MJ → kWh)Heating-only per-fuel breakdown
EGHHEATFCONSOPre_/Post_HeatOil94.2%× 0.27778 (MJ → kWh)Heating-only per-fuel breakdown
EGHHEATFCONSPPre_/Post_HeatPropane94.2%× 0.27778 (MJ → kWh)Heating-only per-fuel breakdown
EGHHEATFCONSWPre_/Post_HeatWood94.2%× 0.27778 (MJ → kWh)Heating-only per-fuel breakdown
Annual heat loss by component
EGHHLAIRPre_/Post_HeatLossAir100.0%× 0.27778 (MJ → kWh)"Where the heat escapes" component chart (infiltration)
EGHHLCEILINGPre_/Post_HeatLossRoof100.0%× 0.27778 (MJ → kWh)"Where the heat escapes" component chart (roof)
EGHHLWALLSPre_/Post_HeatLossWall100.0%× 0.27778 (MJ → kWh)"Where the heat escapes" component chart (wall)
EGHHLFOUNDPre_/Post_HeatLossFoundation100.0%× 0.27778 (MJ → kWh)"Where the heat escapes" component chart (foundation)
EGHHLEXPOSEDFLRPre_/Post_HeatLossFloor100.0%× 0.27778 (MJ → kWh)"Where the heat escapes" component chart (exposed floor)
EGHHLWINDOORPre_/Post_HeatLossWindowDoor100.0%× 0.27778 (MJ → kWh)"Where the heat escapes" component chart (window/door)
Ventilation
CENVENTSYSTYPEPre_/Post_VentType100.0%—Ventilation type (HRV/none/exhaust-only), displayed
Envelope
AIR50PPre_/Post_AirLeakage100.0%—Air_Tightness_Upgrade flag (post <0.90× pre); air-tightness chart
CEILINSPre_/Post_RoofInsulation100.0%—Roof_Insulation_Upgrade flag (post >1.10× pre); roof insulation chart
MAINWALLINSPre_/Post_WallInsulation100.0%—Wall_Insulation_Upgrade flag (post >1.10× pre); wall insulation chart
FNDWALLINSPre_/Post_FoundationInsulation100.0%—Foundation_Insulation_Upgrade flag (post >1.10× pre); foundation chart
EGHINEXPOSEDFLRPre_/Post_FloorInsulation100.0%—Floor_Insulation_Upgrade flag (post >1.10× pre); floor insulation chart
WINDOWCODEPre_/Post_WindowCode88.4%—Windows_Change flag (code present + different pre/post); Windows_Partial requires it unchanged
HVAC
FURNACEFUELPre_/Post_HeatFuel100.0%—Heating_Change / FuelSwitch flags; fuel breakdown, Sankey
FURNACETYPEPre_/Post_HeatType100.0%—Heating_Change flag; equipment-type display
HEATAFUEPre_/Post_HeatAFUE94.2%—Equipment efficiency, displayed
EGHFURSEASEFFPre_/Post_HeatSeasonalCOP100.0%—Heat pump seasonal COP, displayed
HPSOURCEPre_/Post_HPType100.0%—HeatPump_Addition flag (no HP pre, HP present post)
COPPre_/Post_HPCOP100.0%—Heat pump COP, displayed
AHRIPre_/Post_HPAHRI36.8%—Join key to AHRI certificate lookup (capacity/HSPF2/brand/model)
AIRCONDTYPE(filter/flag only, not a displayed column)94.0%—Cooling_Change flag -- not itself shown in table
Design heat loss, GHG & solar
EGHDESHTLOSSPre_/Post_HeatLoss100.0%× 0.001 (W → kW)Design (peak) heat-loss chart; heat-pump sizing-ratio calc
ERSGHG(not used since 2026-09-23)55.1%—Replaced by GHG calculated at current official factors (Methodology section I)
KWPVPre_/Post_SolarPV36.8%—Solar PV added, KPI + chart

% filled is measured across all raw D/E audit records, not the smaller before/after-matched sample the charts above use, so it reads a little higher than what a single matched retrofit record has filled in. EVALTYPE, AIRCONDTYPE and NUMDWELLINGUNITS are used only to split before/after records or gate the same-home pairing match (section A above) — they never appear as a displayed value, so they carry no conversion factor and no "used as" name.

Was this clear?