Did the 2023 refugee crisis change Toronto's shelter numbers?
In the summer of 2023, refugee claimants sleeping outside a downtown intake office made national news. I used the city's own monthly counts to ask what actually changed, when, and for how long.
This page comes in two parts: the story in plain language first, then technical notes with the specification, full estimates, and robustness checks.
In brief
- Approach
- Before-and-after comparison
- Data
- Toronto monthly shelter counts, January 2022 to June 2026
- What the evidence shows
- Counts rose before the crisis and later declined. The August estimate depends on the non-refugee comparison.
- What to keep in mind
- Counts reflect access and capacity as well as need. The +21% estimate is not a permanent policy effect.
The city's own numbers let us test the story
Toronto publishes a monthly count of people actively using its shelter system, split into groups, including refugee claimants. That makes a genuine test possible: was the crisis a sudden shock, or the visible peak of something that had been building for a long time?
I compare refugee and non-refugee shelter counts before and after June and July 2023. The second group helps account for shared changes. It is an imperfect comparison: intake changes and pressure on the same shelter system may affect each group differently.
How to read the first chart: the bold white line is the monthly count of refugee claimants in the shelter system, from January 2022 to June 2026. The thinner gray line behind it is the non-refugee shelter population, shelter users recorded outside the refugee group, shown for comparison. The dashed hairline is the model's own fit, drawn over the refugee line so you can judge for yourself how closely it tracks the data. The shaded band marks June and July 2023, the months the crisis was in the news.
Refugee shelter counts rose before the crisis and peaked in May 2024
refugee claimants · non-refugee shelter users, for comparison · dashed hairline = the model's own fit, drawn over the data (R² = 0.97) · Jan 2022 – Jun 2026
City of Toronto Shelter System Flow · people actively experiencing homelessness, monthly counts
Read chart description
Two-line time series, January 2022 to June 2026. A bold line of refugee claimants in shelter rises from 1,726 to a peak of 6,198 in May 2024, easing to 3,435 by June 2026; the June and July 2023 funding standoff months show no visible jump. A thinner gray line shows non-refugees for comparison, starting near 7,684 and ending near 5,522. A dashed hairline traces the fitted model, which follows the refugee line closely.
The refugee count rose before the crisis, peaked in May 2024, and then declined. In the refugees-only model, pre-crisis growth is about 5.1% per month. The combined model’s 6.0% term measures growth relative to the non-refugee trend.
A change at the break, followed by a changing trend
The model puts numbers on what the eye sees, and adds an honesty check.
How to read the second chart: the first two rows compare changes in refugee counts with changes in non-refugee counts. The August row describes the difference at the start of the post period. Its size changes later because the model includes a changing trend. The third row is a separate non-refugee-only check. Thin lines show 95% confidence intervals.
The August 2023 contrast is +21%; the later trend changes
First two rows: refugee versus non-refugee changes – 95% confidence intervals; bottom row: non-refugees-only pulse check
City of Toronto Shelter System Flow · controlled-model intervals revised September 2026; month-aggregated HAC, 6 lags
Read chart description
Diverging bar chart of estimated percentage changes in shelter counts first two rows are between-group contrasts at the pulse or August break. During the episode (Jun–Jul, between-group contrast): +3.3%, CI -9.1 to 17.4, p = .622; At the August break (refugee vs non-refugee change): +21.0%, CI 3.9 to 41.1, p = .014; Placebo check (same two months, non-refugees): −3.6%, CI -9.3 to 2.6, p = .25.
The August 2023 level contrast is +21%, relative to the change in the comparison group, with a revised 95% interval of about +4% to +41%. This is the starting difference at the break. Subsequent trend terms change that difference. The refugees-only model estimates a level change near zero, showing how much the headline depends on the comparison.
The first model used a straight post-crisis trend. A curve follows the rise and decline more closely. R² = 0.97 describes in-sample fit on log counts across both groups; it does not measure causal validity or forecasting accuracy.
Where the wave came from
Toronto's shelter system sits downstream of a national process: people claim asylum first, and some of them need a shelter bed later. Canada's immigration department publishes how many asylum claims are filed each month, so the two series can be laid side by side.
How to read this chart: the two lines measure very different things, so both are scaled to 100 at January 2022 and the chart compares their shapes. Ontario asylum claims more than quadrupled from early 2022 to their 2024 peak, then fell steeply after federal policy tightened. Toronto's refugee shelter count rode the same wave in a flatter form: a shelter bed holds a person for months, so the stock rises and falls more slowly than the flow of new claims that feeds it. One caution: not every claimant needs a shelter, and the shelter series counts people while the claims series counts filings, so this chart shows a shared wave rather than a one-to-one pipeline.
Behind the shelter curve: Ontario asylum claims rose and fell on the same wave
refugee claimants in Toronto shelters · new asylum claims filed in Ontario each month – both series scaled so January 2022 = 100, so shapes can be compared across very different units
City of Toronto Shelter System Flow + IRCC asylum claimants open data (values rounded to multiples of 5 at source)
Read chart description
Two indexed lines, January 2022 to May 2026, both scaled to 100 at January 2022. Ontario asylum claims rise to 5.1 times their starting level at the peak, then fall back to about 1.1 times. Toronto refugee shelter counts rise to 3.6 times, then ease to 2.1 times. The two curves rise and fall on the same wave.
The honest fine print
The comparison helps account for some shared changes, but border policy, hotel programs, and intake rules also changed. Counts describe recorded service use, which depends on access and capacity as well as need. The study cannot isolate the effect of one policy.
Technical terms, translated
- Comparison group
- A second population followed over the same months to help account for shared changes. Its usefulness depends on group comparability.
- Placebo check
- A check using another group or date. A result near zero offers limited reassurance; it cannot prove the main estimate is unbiased.
- 95% confidence interval (the thin lines)
- Monthly counts bounce around. The interval describes uncertainty under the model assumptions. It does not cover every source of bias.
- "Tracks 97% of the movement"
- A score for how closely the model's curve follows the real monthly numbers. 100% would mean a perfect trace.
- "Scaled to 100" (the claims chart)
- Shelter counts and claim filings use different units, so both lines are re-expressed as multiples of their own January 2022 value. A value of 400 means four times the starting level.
Technical notes
The specification, full estimates, and the checks behind the plain-language claims above.
Data
City of Toronto Shelter System Flow, January 2022 to June 2026: 54 months for each of two groups, or 108 group-month observations. This page is a fixed snapshot. A monthly refresh workflow is prepared locally; an active public deployment has not been verified.
Design and estimation
Controlled interrupted time series on log counts. The pulse covers June and July 2023; the post period begins in August. The equation includes group-specific trends and a quadratic post-period curve, plus shared annual and semi-annual seasonal terms. The September 2026 review retained OLS coefficients and recalculated uncertainty with Bartlett HAC on score vectors summed within months, six lags, and a T/(T−1) correction. This accounts for within-month cross-group covariance and serial dependence. The original ordinary HAC calculation treated group-stacked rows as one time series.
where Gg = 1 for the refugee series, Pt = 1 in June–July 2023 (the pulse), At = 1 from August 2023, τt = months since August 2023 (0 before), and s(t) holds annual and semi-annual sine–cosine pairs. The reported refugee-specific effects are α2 (pulse), α3 (August 2023 level contrast) and α5 (curvature); month-aggregated HAC errors, 6 lags.
| Term | Estimate | 95% CI | p |
|---|---|---|---|
| Pre-period trend difference, per month | +6.0% | +4.8 to +7.2 | < 0.001 |
| Crisis-months pulse (Jun–Jul 2023) | +3.3% | −9.1 to +17.4 | 0.622 |
| August 2023 level contrast | +21.0% | +3.9 to +41.1 | 0.014 |
| Post-period linear trend difference | −0.82% | −3.02 to +1.42 | 0.469 |
| Post-period curvature difference | −0.19% | −0.25 to −0.14 | < 0.001 |
| Control-series pulse (non-refugees) | −6.1% | −9.0 to −3.1 | < 0.001 |
n = 108 group-months. OLS on log counts with annual and semi-annual sine-cosine seasonal terms; month-aggregated HAC errors, 6 lags; R² = 0.97. Effects converted as (e^b − 1) × 100.
| Check | Estimate | 95% CI | p |
|---|---|---|---|
| Refugees-only model: pulse | −5.5% | −13.5 to +3.3 | 0.211 |
| Refugees-only model: post level | −0.1% | −8.6 to +9.1 | 0.974 |
| Refugees-only model: post trend, per month | −1.6% | −2.6 to −0.5 | 0.005 |
| Placebo (non-refugees alone): pulse | −3.6% | −9.3 to +2.6 | 0.250 |
| Window extended to Jan 2021: pulse | +2.7% | −10.4 to +17.6 | 0.706 |
| Window extended to Jan 2021: post level | +19.7% | +1.6 to +40.9 | 0.032 |
The wider-window estimate is similar. The refugees-only model has a near-zero post level: the headline depends on the comparison group.
Model choice
The quadratic post-period curve fits the observed hump better than the initial straight trend (R² 0.97 versus 0.91). Selection after inspecting these data makes this exploratory. Strong in-sample fit does not establish a causal explanation.
Threats to validity
Refugee-specific confounding and spillovers remain possible. The August contrast is exp(α3)−1. At month τ, the full differential departure is exp(α3 + α4τ + α5τ²)−1. Extrapolating a fast pre-crisis trend far into the future is a strong assumption; later departures should not be read as policy impacts.
The same study in SQL
This study's three sources also live in one relational database
(population_groups to shelter_monthly by foreign
key, plus asylum_claims and the model's fitted values), built
with enforced integrity: composite primary keys and CHECK constraints on
every count. Ten queries then take a wider tour of the language than the
other two SQL rebuilds on this site: a data-quality audit (a LAG-based
calendar-continuity check, and a proof that the refugee and non-refugee
series partition the total caseload in all 102 months), the context table
pivoted with conditional aggregation, peak detection by window rank, a
rolling three-month frame, the cross-source IRCC join indexed to January
2022 with FIRST_VALUE, and this one, a regression computed in nothing but
aggregates:
-- OLS slope of ln(actively homeless) on a month index,
-- refugee series, pre-crisis window: beta = cov(x,y) / var(x)
WITH series AS (
SELECT (CAST(strftime('%Y', m.month) AS INT) * 12
+ CAST(strftime('%m', m.month) AS INT)) AS x,
LN(m.actively_homeless) AS y
FROM shelter_monthly m
JOIN population_groups g USING (group_id)
WHERE g.name = 'Refugees'
AND m.month BETWEEN '2022-01-01' AND '2023-05-01'
),
stats AS (SELECT AVG(x) AS xbar, AVG(y) AS ybar FROM series)
SELECT (EXP(SUM((x - xbar) * (y - ybar))
/ SUM((x - xbar) * (x - xbar))) - 1) * 100
AS pct_growth_per_month
FROM series, stats;
-- returns +5.08% a month; the full model with seasonality and
-- Newey-West errors reads +6.0% [4.8, 7.2]
An automated checker verifies every query against the committed outputs and independent recomputes (the slope to the sixth decimal): 38 of 38 match.
Reproducibility
Three scripts (get_data.py, run_analysis.py,
make_charts.py) on pandas and statsmodels, plus the refresh
workflow. Revised controlled-model intervals are reproduced by audit_shelter.py in the website tools folder. Original results remain in the project
results.json and fitted-series CSV. The SQL rebuild adds
build_db.py, queries.sql, and
run_checks.py in the project's sql/ folder.
References
- City of Toronto. (2026). Toronto Shelter System Flow [data set]. City of Toronto Open Data Portal. https://open.toronto.ca/dataset/toronto-shelter-system-flow/ (data through June 2026; retrieved July 2026).
- Immigration, Refugees and Citizenship Canada. (2026). Asylum claimants: monthly IRCC updates [data set]. Open Government Portal. https://open.canada.ca/data/en/dataset/b6cbcf4d-f763-4924-a2fb-8cc4a06e3de4 (data through May 2026; retrieved July 2026; counts rounded to multiples of 5 at source).
- Bernal, J. L., Cummins, S., & Gasparrini, A. (2017). Interrupted time series regression for the evaluation of public health interventions: a tutorial. International Journal of Epidemiology, 46(1), 348–355.
- Newey, W. K., & West, K. D. (1987). A simple, positive semi-definite, heteroskedasticity and autocorrelation consistent covariance matrix. Econometrica, 55(3), 703–708.