Methodology
Where these numbers come from
Every figure on this site traces to a municipal building permit. No surveys, no "industry averages", no numbers supplied by contractors who want your business.
The source
We use the City of Toronto's Active Building Permits dataset, published through the city's open data portal. The source changes as permits are added, revised or removed. Each record includes the type of work, a free-text description, the month it was issued, the first three characters of the postal code, and a declared construction value.
We refresh from the portal monthly. The date at the foot of each cost page is the newest permit date in that page's sample, not the date we imported the data or updated this methodology.
Toronto also publishes a larger "Cleared Permits" file with 428,473 records. We do not use it. Its construction-value field is populated on roughly 2% of rows, and almost exclusively for drain permits. Reporting a median from it would be arithmetic performed on absence.
How a permit becomes a number
- Match the workEach permit's description and work-type text is tested against hand-written patterns for a specific job. A permit reading "underpin existing basement, lower slab 2ft" matches underpinning. One reading "demolish existing dwelling, construct new 3 storey" does not, even though it contains the word, because it is a whole house.
- Discard values outside the rulesValues below $500 or outside the category band listed below are excluded. The source does not establish that every excluded value is a typo.
- Remove statistical outliersWe apply Tukey fences at 1.5× the interquartile range within each job and time window. A statistical outlier is not necessarily an error.
- Refuse to publish thin dataA job and city combination is only published when at least 30 permits survive the steps above, spread across at least 6 separate months. Combinations that fail are not published as a page with a caveat. They are not published at all.
- Show the distribution, not a rangeWe report the 10th, 25th, 50th, 75th and 90th percentiles and draw the full shape. Renovation costs are right-skewed, so an average is misleading and a min-to-max range is close to meaningless.
How permits are classified
We search each permit's work type, description and structure type, ignoring capitalization. Each record goes into the first category it matches. We then keep only declared values inside that category's screening band. These bands are not typical prices.
- Basement underpinning: permits mentioning underpinning or lowering a basement. New two- or three-storey buildings and demolition of an existing house are excluded. Declared-value band: $8,000 to $400,000.
- Deck construction: permits mentioning a deck. Roof decks, parking decks, new dwellings and condos are excluded. Declared-value band: $2,000 to $120,000.
- Porch work: permits mentioning a porch or veranda. New dwellings and demolition of an existing house are excluded. This sample is not limited to front-porch replacements. Declared-value band: $2,000 to $150,000.
- Home additions: permits mentioning a rear addition, rear extension or two storey addition. New dwellings are excluded. This does not cover every kind of home addition. Declared-value band: $20,000 to $800,000.
- Garden suites: permits mentioning a garden suite. Declared-value band: $50,000 to $900,000.
- Laneway suites: permits mentioning a laneway suite or laneway house. Declared-value band: $50,000 to $900,000.
- Second suites: permits mentioning a second suite, basement apartment or accessory dwelling. New dwellings and demolition of an existing building are excluded. Garden and laneway suites are checked first. Declared-value band: $10,000 to $500,000.
Values below $500, missing or invalid dates, and statistical outliers are also excluded. The same permit can appear in both the Toronto total and one district total; these are two geographic views of that record. Matching does not mean every permit in a category has identical scope.
Dates, duplicates and percentiles
We use the permit's issue date when present, otherwise its application date. The current sample starts 730 days before the current UTC day. An earlier report period covers the preceding 730 days. A stored permit number is unique within each geographic permit table, but the cost-observation table does not separately deduplicate rows by permit number. Each source row takes its first matching category.
For each window we calculate the 25th and 75th percentiles, keep values within 1.5 times their difference below and above those points, then calculate the published percentiles from the retained values. When a percentile falls between two recorded values, we interpolate between them. The median is the 50th percentile. The 30-permit gate is checked after outlier removal; the six-month gate uses dates of the matched records before outlier removal.
The source is a changing active-permits file and we do not publish an immutable copy of each monthly input. These rules explain the current calculation, but a future download of the City file may not reproduce an earlier published figure exactly. We publish only category-level aggregates, not individual records.
Current and archived report data
The Toronto Renovation Cost Report links its current CSV and dated aggregate releases. Each dated release preserves the published category figures, screening counts, calculation rules and code fingerprints. It does not contain the underlying permit rows, and our database does not record an import timestamp. The newest permit date is not an import date. A later download of the changing City file may therefore produce different results even when the same rules are applied.
What a declared value records
This is the most important limitation on the site and we would rather you learned it here than after comparing the figures with a quote. The declared construction value is the amount the applicant stated when filing. The source does not provide a consistent itemized breakdown of what each declaration includes.
- Scope varies between permits, even within the same category.
- Fees, professional services, finishing, tax and contingency are not itemized consistently in this field.
- Changes, overruns and final payments after filing are not recorded.
It is self-reported and unaudited. Treat every figure here as a description of what was declared in the sampled permit record, not as an invoice or a complete project budget.
What we deliberately do not do
- We do not join permits back to street addresses. The city supplies both, but combining them would produce an address-level record of what identifiable households spent on their homes. We store only the first three postal characters and discard the rest at ingest.
- We do not let contractors edit the numbers. Contractors pay us for homeowner introductions. They have no access to the dataset, the methodology, or the pages.
- We do not publish a city we have no permit data for. If a page exists, the data behind it exists.
Corrections
If a figure looks wrong, tell us and include the page. We will re-run the query and either fix it or explain the derivation. Corrections are noted at the foot of the page with a date.