Proud Canadian Company

How Affordability Shifted Across Canada

How Bank of Canada Rate Changes Affected Home Prices, Mortgage Qualification and Interest Costs Across Canada

How Has Mortgage Affordability Changed Across Canada?

Three numbers decide whether a home is within reach: the price, the income you need to qualify and the interest you pay while you carry the mortgage. A Bank of Canada decision moves the last two long before it moves prices.

Canada at a Glance

  • Benchmark home price: the national composite benchmark is $651,400, as of September 2026. Over the past 12 months, it decreased by $26,000.
  • Income needed to qualify: a household needs about $130,550 a year to buy a home at the September 2026 benchmark price ($661,800) with 20% down at today’s nesto rates. Compared with rates a year ago, that requirement is increased by $8,301.
  • Interest over a five-year term: the same mortgage costs $119,840 in interest over five years. Compared with rates a year ago, that cost increased by $20,274.

How Has Affordability Changed in Your Province?

Each cell shows the current figure, then the change over 12 months. Prices are the latest CREA benchmark. Income and interest apply today’s nesto rates to each province’s September 2026 benchmark price, so their change shows what rates alone did to the same home.

Sources: CREA composite benchmark prices (September 2026); nesto insurable 5-year fixed rates. Higher income or interest rates put more pressure on buyers; lower prices provide relief.

How we calculate it: qualifying income assumes a 20% down payment, a 25-year amortization and a 39% gross debt service (GDS) ratio. It is stress-tested at the minimum qualifying rate: the greater of 5.25% and the contract rate plus two percentage points. Interest is the total paid over a five-year fixed term and excludes principal, property tax, heating, insurance and maintenance. These are qualification thresholds, not affordability recommendations.



Shortcode validation checklist — new syntax, for live testing

Paste sections of this into a WordPress test page (Paragraph or Custom HTML block) and check the rendered result against the label. Each line shows the same shortcode twice, separated by::: the first copy is in double square brackets ([[tag]]), WordPress’s escape convention, so it prints as literal text — that’s the code you’re checking. The second copy is in normal single square brackets ([tag]), so it actually executes and shows the live value right next to it. Nothing needs stripping or editing before pasting.

Scenario used throughout, matching the editor guide’s own worked examples so results are cross-checkable: 5-year fixed, $500,000 price, $100,000 down, 25-year amortization unless a row says otherwise.


Market type — every location


Part 1 — Mortgage calculator shortcodes

1.1 Every base tag, canonical scenario

1.2 Every suffix (ending), on payment

Same ten endings apply to interest, principal, paid, balance, rate_value and income_needed too — min_down has no endings at all (see the editor guide, 4.6).

1.3 Every change-output style, on payment_change_yoy

1.4 down=”min” vs. a dollar figure — should match the min_down value above

1.5 price/down vs. amount — deliberately different results, per the editor guide (4.1)

1.6 income_needed and location — currently a no-op

location is documented as feeding income_needed‘s property-tax lookup, but property tax isn’t factored in on the live site yet — every location currently returns the same figure for an identical scenario, so a location-by-location sweep here would just repeat one number 37 times. Skipped for now; worth revisiting once property tax ships. One spot-check, to confirm that’s still true today:


Part 2 — Housing market shortcodes

2.1 Every base tag, composite, Canada

2.2 Every type, Canada

2.3 Every accepted location, composite type

Confirms which regions currently have composite-price data.

2.4 Dating a figure

2.5 snlr — every combination: the ratio, the market label, and the change

output=”market” is confirmed as the correct attribute — no text_ prefix. It works only with type="snlr"; anything else renders nothing.

The ratio itself, Canada:

The market label, several locations and periods:

Untested combination — does output=”market” survive on a change tag, or does the change-format win?

Should render nothing — market label only works on snlr:

2.6 Every change-output style, on housing_change_yoy


Part 3 — Market classification, every location

The mechanics are covered in 2.5. This sweeps every accepted location once, so you can see at a glance which ones actually have snlr data published right now.


If a row shows nothing: that’s the shortcode’s normal empty-string behaviour for a missing attribute, an unpublished month, or a region with no data for that type — not necessarily a bug. Note which ones are empty; that’s exactly what today’s pass is for.