This map shows the average price per m² of houses in each postcode district in England & Wales.
It extends the pioneering work of Anna Powell-Smith from 2017. I've re-run the analysis with data to Jan 1995–Jan 2026, matching records between the Price Paid dataset and floor area from the Energy Performance Certificate dataset. The result is a national dataset of price per m² for 2,276 postcode districts.
| District | £/m² |
|---|
| District | £/m² |
|---|
The underlying datasets are available as CSV files, licensed under the
Open Government Licence
v3.0.
A machine-readable index with row counts and file sizes is available as
data.json.
One row per postcode district × property type, plus an ALL rollup row per
district. 2,276 districts.
| Column | Type | Description |
|---|---|---|
postcode_district |
string | UK postcode district (e.g. SW1A) |
property_type |
string | Property type: ALL (rollup), D detached,
F flat/maisonette, S semi-detached,
T terraced, O other |
num_sales |
integer | Number of residential sales matched to an EPC record |
total_floor_area |
float | Total floor area of matched properties (m²) |
total_price |
float | Total transaction value of matched sales (£) |
price_per_sqm |
integer | Nominal price per m² = total_price / total_floor_area (£) |
adj_price_per_sqm |
integer | CPI-adjusted price per m², base January 2026 (£), using ONS CPI series D7BT |
One row per postcode district × property type × year. Powers the year-range slider. Districts with fewer than 10 matched sales in a given year are excluded.
Download CSV| Column | Type | Description |
|---|---|---|
postcode_district |
string | UK postcode district (e.g. SW1A) |
property_type |
string | Property type: ALL (rollup), D detached,
F flat/maisonette, S semi-detached,
T terraced, O other |
year |
integer | Calendar year of sale |
num_sales |
integer | Number of residential sales matched to an EPC record |
total_floor_area |
float | Total floor area of matched properties (m²) |
total_price |
float | Total transaction value of matched sales (£) |
price_per_sqm |
integer | Nominal price per m² = total_price / total_floor_area (£) |
adj_price_per_sqm |
integer | CPI-adjusted price per m², base January 2026 (£), using ONS CPI series D7BT |
Sale prices are taken from HM Land Registry's Price Paid dataset (standard residential sales to individuals, Jan 1995–Jan 1995–Jan 2026). Floor area per property is taken from Energy Performance Certificates.
Each sale is matched to its EPC in two stages. First, an exact match on the property's Unique Property Reference Number (UPRN) using the UBDC Price Paid–UPRN lookup table, which covers transactions up to January 2022. For each matched sale, the certificate closest in time is used — preferring the most recent one lodged before the sale date, with a fallback to the earliest post-sale certificate if none exists within a ten-year window. For sales after January 2022 — where no UPRN link is available — a second stage matches on postcode plus a normalised address string (combining sub-address, building name or number, and street name), and the most recent certificate for that address is used.
The price per m² for each postcode district is the total transaction value of all matched sales divided by their total floor area — not a mean of per-property ratios. Districts with fewer than 10 matched sales are excluded. Some districts have residential sales but fall below this threshold — for example parts of the City of London (EC2R, EC3V, W1C) and TR23 (Bryher, Isles of Scilly), each with only 2–5 recorded transactions. Other gaps are districts with no matching residential transactions at all, such as industrial estates.
The year-range filter switches the map from its default all-time view to a chosen year window, showing CPI-adjusted prices for matched sales within that period. Each district appears in a given year only where at least 10 matched sales were recorded; sparsely-traded years or early years before widespread EPC adoption (pre-2008) may be absent for some districts. Prices are adjusted to January 2026 pounds for direct comparison across years.
The map uses a hybrid colour scale. The first seven colour bands use quantile breaks, dividing the 2,276 districts into roughly equal groups — this maximises visual contrast across the bulk of the distribution. The top two bands use fixed thresholds: £5,000/m² and £10,000/m². Districts above £5,000/m² are predominantly inner London; above £10,000/m² is almost exclusively central London (Mayfair, Covent Garden, and the City).
First stable release. v1.0.0 marks the point at which this analysis is considered ready for public use and the author commits to semantic versioning from this release onwards. Future patch releases will update data vintages; minor releases will change methodology; major releases will change the output schema or geography.
The district CSV now includes a property_type column. Each postcode district has one ALL row (the previous single row) plus one row per property type: D detached, F flat/maisonette, S semi-detached, T terraced, O other. Consumers relying on one-row-per-district must filter to property_type = ALL.
price_per_sqm_yearly_postcode_district.csv — annual aggregates perdistrict, enabling the year-range filter on the web map.
price_per_sqm_lsoa.csv — LSOA-level aggregation (promoted fromexperimental); used to derive the new MSOA choropleth.
price_per_sqm_msoa.csv — MSOA-level aggregation derived from LSOA data;covers UPRN tier-1 matches only (~60% of sales, 1995–Jan 2022).
A second map view aggregates price per m² to Middle Super Output Area level, giving finer geographic resolution than postcode districts across England and Wales. Coverage is limited to tier-1 UPRN-matched records.
A fourth matching tier recovers rural named properties where PPD has no street field. When paon contains no digits, PPD is keyed on (postcode, normalise_addr(paon)) and matched against EPC (postcode, normalise_addr(ADDRESS1)), ignoring ADDRESS2. Only 1:1 matches on both sides are accepted to limit false positives.
Three fixes applied to both the Python normaliser and the DuckDB macro:
| Fix | Gain | Issue |
|---|---|---|
Hyphens treated as word separators (CROSS-O-THE-HANDS → CROSS O THE HANDS) |
+2,428 records | #114 |
Article "THE" stripped as whole word (THE OLD RECTORY → OLD RECTORY) |
+4,995 records | #113 |
| Compound words canonicalised (FARM HOUSE → FARMHOUSE, etc.) | +342 records | #115 |
Gains measured on the March 2026 dataset.
E20 (Queen Elizabeth Olympic Park / East Village, Stratford) was created by Royal Mail after our Geolytix boundary snapshot and has no polygon. All E20 records are now folded into the geographically contiguous E15, recovering 884 previously lost sales.
| Metric | Value |
|---|---|
| Districts included | 2,276 |
| Total matched sales | 16,577,000 |
| Median real adj price | £3,058/m² |
| Most expensive | W1S — £35,462/m² (real Jan-2026 £) |
| Least expensive | TS2 — £733/m² (real Jan-2026 £) |
| Top 5 | W1S, WC2A, WC2R, W1B, W1K |
| Bottom 5 | DN31, CF43, BD3, TS1, TS2 |
---
| Source | v0.1.0 | v0.2.0 |
|---|---|---|
| HM Land Registry PPD | to Jan 2026 (~22.5M rows) | to March 2026 (~29.3M rows) |
| EPC bulk export | per-LA ZIPs, epc.opendatacommunities.org | single monolithic CSV, get-energy-performance-data.communities.gov.uk (March 2026) |
| UBDC PPD→UPRN lookup | unchanged — covers to Jan 2022 | unchanged |
| ONS CPI | D7BT Jan 1988–Jan 2026 | unchanged |
The EPC source changed to the new MHCLG GOV.UK One Login API (single 5.7 GB CSV). Four CSV parsing issues were encountered and fixed; see research/epc-csv-data-quality.md.
All sale prices are now inflation-adjusted to January 2026 pounds before aggregation, using ONS CPI All Items monthly series D7BT. The headline column is adj_price_per_sqm; nominal price_per_sqm is retained as a reference.
| Tier | Count | Share |
|---|---|---|
| Tier 1 — UPRN exact match | 9,255,768 | 31.6% |
| Tier 2 — address normalisation | 7,321,554 | 25.0% |
| Unmatched | 12,705,953 | 43.4% |
| Total PPD sales | 29,283,275 |
Match rate dropped from 76.9% (v0.1.0) to 56.6% because the PPD gained ~6.8M post-Jan-2022 rows outside the UBDC lookup window. The absolute matched count is broadly unchanged (~16.6M vs ~17.3M).
| Metric | Value |
|---|---|
| Districts included | 2,277 |
| Total matched sales | 16,577,322 |
| Median real adj price | £3,058/m² |
| Most expensive | W1S — £35,462/m² |
| Least expensive | TS2 — £733/m² |
---
First versioned release.
| Source | Coverage | Licence |
|---|---|---|
| HM Land Registry Price Paid Data | Standard residential sales, Aug 2007–Jan 2026 | OGL v3.0 |
| DLUHC Energy Performance Certificates | All domestic lodgements, England & Wales | OGL v3.0 |
| UBDC PPD–UPRN lookup | Transactions to Jan 2022 | Open data, University of Glasgow |
| GeoLytix postcode district boundaries | — | OGL v3.0 |
Price per m² = Σ(sale_price) / Σ(floor_area_m²) per postcode district. Sales matched to EPCs via UPRN (tier 1), address normalisation (tier 2), then postcode-median floor area fallback (tier 3). Districts with fewer than 10 matched sales excluded.
| Metric | Value |
|---|---|
| Total sales | 22,503,694 |
| Matched with floor area | ~77% |
| Districts included | 2,279 |
| Median price per m² | £1,986 |
| Data range | Aug 2007–Jan 2026 |
| Most expensive | W1S — £24,184/m² |
| Least expensive | TS2 — £504/m² |
Price Paid data produced by HM Land Registry © Crown copyright 2026, licensed under the Open Government Licence v3.0. EPC data © Crown copyright DLUHC, licensed under the Open Government Licence v3.0. UBDC PPD–UPRN lookup published as open data by the Urban Big Data Centre, University of Glasgow. Contains Ordnance Survey data © Crown copyright and database right 2026. Contains Royal Mail data © Royal Mail copyright and database right 2026. Contains National Statistics data © Crown copyright and database right 2026. Postcode district derived boundaries reproduced under the Open Government Licence v3.0. Postal boundaries © GeoLytix copyright and database right 2012. Map tiles © CARTO, data © OpenStreetMap contributors.