# HUD System Performance Measures (SPM): Seattle/King County (WA-500) vs. 67 large CoCs

Prepared 2026-10-10. This is a data note for a FactHub fact check. It describes what the data shows and does not argue a thesis. Saved from the research agent's report, which the agent itself was blocked from writing.

## Gate result: data is available

HUD publishes CoC-level SPM data as a machine-readable Excel workbook, with one sheet per fiscal year (FY2015 to FY2024) and one row per CoC.

- **Resource page:** "CoC System Performance Measures Data Since FY 2015", https://www.hudexchange.info/resource/5691/system-performance-measures-data-since-fy-2015/
  - The live page returned HTTP 404 to a scripted request.
  - Archived snapshot used instead (saved as `raw/page_arch.html`): http://web.archive.org/web/20250514225214/https://www.hudexchange.info/resource/5691/system-performance-measures-data-since-fy-2015/
- **File:** https://files.hudexchange.info/resources/documents/System-Performance-Measures-Data.xlsx
  - The direct download worked: HTTP 200, 2,530,373 bytes, server Last-Modified 2026-01-28.
  - Archive snapshot: http://web.archive.org/web/20260919211746/https://files.hudexchange.info/resources/documents/System-Performance-Measures-Data.xlsx
  - The direct download and the snapshot are byte-identical (SHA-256 82796eb0686e3fc53d64ebd6ca4d9a4b2629f313591b7d1ae8d3d3aab43c61af).
- **Years covered:** sheets 2015–2024. FY2025 is not in the workbook yet. Each SPM fiscal year runs October 1 to September 30.
- **Revisions:** the resource page says CoCs may update their prior-year submission each year, so past values can change between workbook releases.

## Method

**1. Conversion.** Every sheet was converted to CSV through Excel COM with macros force-disabled (`data/scripts/xlsb_to_csv.ps1`). The CSVs are in `raw/csv/`.

**2. Extraction.** `scripts/build_spm.js` (Node) finds each column by its header text and then checks the header at every offset it uses. Header layouts differ by year:
- In FY2015–17 the group labels are offset by one column.
- FY2018 adds a per-project-type M2 breakdown.
- FY2019 adds HMIS data-quality columns.

For the 67 CoCs in `data/coc_geography_map.csv` it extracts:
- **M1:** average and median days homeless, for ES+SH (1a metric 1) and ES+SH+TH (1a metric 2).
- **M2:** the "SPM 2 (All)" columns; in FY2015–17 this is the single M2 block.
  - These count people who exited to permanent housing two years before the report year, and how many returned within 6, 12 and 24 months.
  - The three return figures are cumulative. Percentages were recomputed from the counts.
- **M5:** first-time homeless persons, for ES+SH+TH (5.1) and ES+SH+TH+PH (5.2).
- **M7a:** street-outreach (SO) exits to temporary or permanent destinations, as a share of all SO exits.
- **M7b.1:** ES/SH/TH/PH-RRH exits to permanent housing, as a share of those exits.
- **M7b.2:** PSH (PH excluding RRH) participants who stayed or exited to permanent housing.
- **Bed coverage:** non-DV HMIS beds divided by non-DV HIC beds, ES+TH only.
- **HMIS data quality (FY2019+):** % of exits with unknown or missing destinations, by project type.

The recomputed percentages match HUD's reported percentages within rounding for every row: no differences above 1.5 points, including bed coverage.

**3. Population and per-capita M5.**
- Population comes from `data/coc_homelessness_rent_panel.csv` (ACS, same year).
- The panel has no 2020 value, so FY2020 uses the mean of 2019 and 2021. This is noted in the `pop_note` column.
- First-time homeless per 10k = M5 count ÷ population × 10,000.

**4. Kansas City (MO-604).**
- Before FY2023, HUD reports Kansas City as two CoCs: MO-604M (Jackson County) and MO-604K (Wyandotte County, KS).
- For those years MO-604M is used and per-capita M5 is blanked, because the panel population covers both counties.
- These rows are flagged.

**5. Ranking.** `scripts/rank.js` ranks WA-500 among the large CoCs that report each measure.
- Rank 1 is the most favorable value in HUD's direction: lowest for M1, M2 and M5; highest for M7.
- "Rank excl. DQ" removes CoCs with any of these flags:
  - ES+TH bed coverage below 85% or missing
  - M2 "All" returns that aren't cumulative
  - missing M1
  - a percentage over 100
  - the MO-604 split
- WA-500 is always kept in that ranking, even in years when it has a flag itself (for example, FY2019 coverage of 81.7%).

## Results: King County rank

### FY2019

| Measure | Better | WA-500 | Rank (all reporting) | Large-CoC median | Rank excl. DQ |
|---|---|---|---|---|---|
| M1 days homeless, ES+SH (avg) | lower | 104 | 51 of 67 | 78 | 36 of 46 |
| M1 days homeless, ES+SH (median) | lower | 47 | 40 of 67 | 44 | 27 of 46 |
| M1 days homeless, ES+SH+TH (avg) | lower | 139 | 50 of 67 | 106 | 35 of 46 |
| M1 days homeless, ES+SH+TH (median) | lower | 61 | 38 of 67 | 57 | 27 of 46 |
| M2 returns ≤6 mo % | lower | 8.68 | 34 of 67 | 8.68 | 19 of 46 |
| M2 returns ≤12 mo % | lower | 13.23 | 31 of 67 | 14.18 | 17 of 46 |
| M2 returns ≤24 mo % | lower | 18.77 | 28 of 67 | 20.05 | 14 of 46 |
| M5 first-time homeless (ES+SH+TH), persons | lower | 8,292 | 62 of 67 | 3,410 | 43 of 46 |
| M5 first-time (ES+SH+TH) per 10k | lower | 36.81 | 45 of 66 | 19.83 | 28 of 46 |
| M5 first-time (ES+SH+TH+PH) per 10k | lower | 42.61 | 45 of 66 | 26.58 | 28 of 46 |
| M7a SO successful exit % | higher | 62.66 | 15 of 67 | 36.96 | 10 of 46 |
| M7b1 ES/SH/TH/RRH exit to PH % | higher | 36.56 | 42 of 67 | 41.96 | 25 of 46 |
| M7b2 PSH retention/exit to PH % | higher | 95.38 | 42 of 67 | 96.30 | 28 of 46 |

WA-500 data quality in FY2019: bed coverage 81.7% (below 85%); unknown shelter exit destinations 54%.

### FY2024 (latest in the HUD file)

| Measure | Better | WA-500 | Rank (all reporting) | Large-CoC median | Rank excl. DQ |
|---|---|---|---|---|---|
| M1 days homeless, ES+SH (avg) | lower | 206.8 | 61 of 67 | 119.6 | 47 of 52 |
| M1 days homeless, ES+SH (median) | lower | 119 | 57 of 67 | 56 | 43 of 52 |
| M1 days homeless, ES+SH+TH (avg) | lower | 249 | 61 of 67 | 139 | 47 of 52 |
| M1 days homeless, ES+SH+TH (median) | lower | 145 | 60 of 67 | 66 | 46 of 52 |
| M2 returns ≤6 mo % | lower | 6.57 | 24 of 67 | 7.35 | 16 of 52 |
| M2 returns ≤12 mo % | lower | 9.85 | 18 of 67 | 12.45 | 12 of 52 |
| M2 returns ≤24 mo % | lower | 15.34 | 16 of 67 | 18.82 | 10 of 52 |
| M5 first-time homeless (ES+SH+TH), persons | lower | 7,554 | 60 of 67 | 3,652 | 46 of 52 |
| M5 first-time (ES+SH+TH) per 10k | lower | 32.28 | 42 of 67 | 28.68 | 30 of 52 |
| M5 first-time (ES+SH+TH+PH) per 10k | lower | 44.22 | 45 of 67 | 33.82 | 33 of 52 |
| M7a SO successful exit % | higher | 76.10 | 4 of 67 | 31.07 | 4 of 52 |
| M7b1 ES/SH/TH/RRH exit to PH % | higher | 49.23 | 7 of 67 | 35.63 | 5 of 52 |
| M7b2 PSH retention/exit to PH % | higher | 94.38 | 57 of 67 | 96.70 | 47 of 52 |

WA-500 data quality in FY2024: bed coverage 86.3%. The only flag is the HUD file defect affecting transitional-housing returns (see caveats).

## King County (WA-500) time series, FY2015–FY2024

| FY | Bed cov % | M1 ES+SH avg | M1 ES+SH med | M1 ES+SH+TH avg | M1 ES+SH+TH med | M2 exits to PH | Ret ≤6 mo % | Ret ≤12 mo % | Ret ≤24 mo % | M5 ES+SH+TH | M5 incl. PH | M5 /10k | SO exits | M7a % | M7b1 % | M7b2 % |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2015 | 79.5 | 76 | 24 | 140 | 50 | 2,441 | 4.8 | 8.0 | 11.7 | 6,574 | 9,330 | 31.1 | 1,460 | 16.8 | 30.5 | 94.1 |
| 2016 | 79.4 | 79 | 28 | 144 | 48 | 4,281 | 5.2 | 7.6 | 12.1 | 9,119 | 11,393 | 42.4 | 1,099 | 27.0 | 30.2 | 94.1 |
| 2017 | 77.5 | 90 | 39 | 145 | 58 | 4,741 | 6.1 | 9.5 | 14.2 | 9,961 | 12,335 | 45.5 | 963 | 30.9 | 31.9 | 94.4 |
| 2018 | 80.7 | 102 | 44 | 143 | 60 | 5,695 | 6.0 | 9.6 | 15.1 | 9,901 | 12,258 | 44.3 | 1,842 | 51.1 | 34.7 | 95.3 |
| 2019 | 81.7 | 104 | 47 | 139 | 61 | 5,955 | 8.7 | 13.2 | 18.8 | 8,292 | 9,599 | 36.8 | 3,013 | 62.7 | 36.6 | 95.4 |
| 2020 | 81.6 | 117 | 55 | 159 | 72 | 7,743 | 9.2 | 15.5 | 21.9 | 8,398 | 10,298 | 37.3 | 2,636 | 73.9 | 32.4 | 96.5 |
| 2021 | 85.6 | 164 | 86 | 214 | 109 | 8,960 | 8.8 | 13.4 | 17.4 | 6,546 | 8,275 | 29.1 | 2,612 | 65.7 | 42.4 | 97.0 |
| 2022 | 86.6 | 175 | 97 | 218 | 118 | 6,992 | 7.6 | 10.0 | 15.3 | 7,678 | 10,006 | 33.9 | 3,623 | 71.0 | 39.2 | 95.9 |
| 2023 | 83.3 | 188.9 | 111 | 232.2 | 133 | 6,687 | 6.6 | 10.3 | 14.9 | 8,304 | 11,431 | 36.6 | 5,555 | 68.1 | 46.9 | 95.9 |
| 2024 | 86.3 | 206.8 | 119 | 249 | 145 | 7,851 | 6.6 | 9.9 | 15.3 | 7,554 | 10,349 | 32.3 | 4,867 | 76.1 | 49.2 | 94.4 |

## Selected peers, FY2024 (FY2019 in parentheses)

| CoC | Bed cov % | M1 ES+SH avg | M1 med | Ret ≤24 mo % | M5 /10k | M7a % | M7b1 % | M7b2 % |
|---|---|---|---|---|---|---|---|---|
| WA-500 Seattle/King | 86.3 (81.7) | 207 (104) | 119 (47) | 15.3 (18.8) | 32.3 (36.8) | 76.1 (62.7) | 49.2 (36.6) | 94.4 (95.4) |
| WA-503 Tacoma/Pierce | 100 (95.7) | 121 (81) | 52 (41) | 15.9 (20.5) | 42.6 (33.9) | 24.6 (11.2) | 32.9 (33.5) | 96.3 (89.3) |
| OR-501 Portland/Multnomah | 88.9 (87.6) | 139 (99) | 82 (45) | 16.2 (25.3) | 72.2 (42.7) | 35.0 (58.5) | 33.8 (50.9) | 96.2 (96.3) |
| CA-501 San Francisco | 94.3 (57.7) | 202 (146) | 126 (92) | 15.2 (11.0) | 63.3 (4.5) | 16.5 (3.7) | 17.4 (45.6) | 96.8 (95.9) |
| CA-502 Oakland/Alameda | 91.6 (88.5) | 242 (152) | 138 (111) | 16.0 (17.6) | 18.1 (15.3) | 12.3 (30.8) | 39.5 (53.9) | 97.3 (97.4) |
| CA-600 Los Angeles | 90.9 (61.5) | 204 (265) | 142 (74) | 16.7 (16.0) | 29.1 (17.4) | 22.7 (9.5) | 29.6 (35.0) | 97.0 (97.1) |
| CA-601 San Diego | 98.0 (92.3) | 160 (118) | 78 (61) | 20.8 (23.3) | 21.7 (15.5) | 22.6 (29.1) | 31.3 (42.0) | 94.8 (94.4) |
| CA-500 San Jose | 100 (100) | 201 (70) | 124 (35) | 23.4 (20.5) | 18.1 (13.4) | 42.3 (37.1) | 39.0 (32.2) | 96.5 (92.4) |
| CO-503 Denver | 88.8 (42.7) | 108 (50) | 49 (14) | 19.0 (12.2) | 38.5 (19.7) | 31.1 (19.3) | 29.9 (30.9) | 97.1 (97.9) |
| AZ-502 Phoenix | 92.7 (84.4) | 119 (68) | 77 (46) | 25.2 (28.4) | 23.3 (19.0) | 31.0 (35.3) | 42.7 (42.0) | 96.3 (92.8) |
| NY-600 New York City | 90.8 (88.7) | 286 (175) | 228 (49) | 13.4 (22.3) | 106.7 (73.0) | 71.3 (49.5) | 37.7 (48.1) | 98.3 (98.4) |
| IL-510 Chicago | 24.4 (96.4) | 139 (157) | 62 (62) | 15.8 (25.9) | 28.7 (37.8) | 31.6 (60.6) | 25.7 (22.6) | 97.6 (97.2) |
| MN-500 Minneapolis | 79.9 (95.7) | 125 (68) | 79 (36) | 22.6 (26.0) | 42.2 (38.2) | 29.0 (83.3) | 21.9 (23.7) | 91.6 (93.3) |
| DC-500 Washington DC | 92.0 (93.6) | 118 (198) | 54 (98) | 34.4 (35.9) | 101.2 (72.4) | 34.3 (75.0) | 24.6 (70.1) | 98.7 (97.8) |
| MA-500 Boston | 86.6 (98.9) | 290 (260) | 141 (122) | 20.6 (14.2) | 97.4 (91.4) | 3.2 (12.6) | 35.1 (29.3) | 97.6 (97.6) |
| TX-700 Houston | 100 (99.3) | 73 (63) | 36 (27) | 21.2 (23.9) | 8.8 (11.8) | 22.2 (31.7) | 47.6 (32.6) | 94.9 (95.2) |

FY2024 M7a ranges from 1.4% to 83.7% across the 67 large CoCs.

## KCRHA-published SPM figures (WA-500)

**Source:** KCRHA CoC Board deck, "Understanding System Performance Measures: A HUD Federal Report Overview" (April 1, 2026), https://kcrha.org/wp-content/uploads/2026/04/System.Performance.Measure.2025_04.01.2026.pdf (copy in `raw/kcrha/`).

| Item | FY2024 | FY2025 |
|---|---|---|
| Average time in shelter (days) | 248 | 263 |
| Returns to homelessness | 10% | 15% |
| PIT sheltered count | 7,058 | 7,126 |
| Annual sheltered count | 14,470 | 13,884 |
| First-time homeless | 10,332 | 9,592 |
| Street outreach exits to permanent housing | 75% | 50% |
| Income growth | ~39% | ~39% |

**What KCRHA says drove the changes:**
- The rise in returns came mostly from street-outreach exits.
- The outreach decline is linked to record cleanup and correct record closure.
- Some changes reflect data-quality improvements rather than service performance. KCRHA worked with 63 agencies on data corrections; two did not respond.

**How the deck lines up with the HUD workbook:**
- The deck's FY2024 figures are close to, but not identical with, the workbook (249 days, 10,349 first-time incl. PH, 76.1% M7a). Likely causes are a resubmitted prior year or slightly different sub-measures.
- The deck doesn't say which return window its 10%→15% uses. In the workbook, FY2024 is 9.85% at 12 months and 15.34% at 24 months.

**Second deck not used:** https://kcrha.org/wp-content/uploads/2025/03/KC-Regional-Homelessness-Authority-Systems-Performance-Measure-Overview_04022025.pdf (also saved). Its text could not be extracted with Node tooling, so nothing from it is used.

## Data-quality and definitional caveats

**Self-reported HMIS data.** Each CoC submits its own SPMs from its HMIS, and HUD doesn't audit them. The numbers depend on local data entry, which projects take part, and how records are closed. KCRHA's FY2025 outreach figure moved 25 points after record cleanup.

**Coverage differs:**
- Domestic-violence providers are excluded everywhere.
- In FY2024, 13 of the 67 CoCs had ES+TH bed coverage below 85%; Chicago's was 24%.
- WA-500 coverage was 77.5–83.3% in FY2015–2020 and FY2023, and 85.6–86.6% in FY2021, FY2022 and FY2024.
- Lower coverage means fewer people counted in M1 and M5.

**Unknown exit destinations:**
- Most large CoCs have 30% or more unknown destinations for shelter or outreach exits (the `unknown_dest_*` flags). This weakens M7 and the M2 cohorts.
- WA-500's shelter exits were at least 30% unknown in FY2019–2022 (54% in FY2019) and below 30% in FY2023–2024.
- Because the problem is so widespread, these flags are reported but don't exclude CoCs from ranking.

**FY2024 HUD file defect:**
- M2 transitional-housing 12- and 24-month return counts are 0 for 316 of 386 CoCs that had TH exits.
- For 267 CoCs, the per-type 12-month counts don't add up to the "All" column. For WA-500 they sum to 733 against 773 in "All".
- Only the "All" columns are used in this analysis; the FY2024 per-type M2 breakdown should not be used.
- FY2022 (63 CoCs) and FY2023 (54 CoCs) show the same zero pattern, but there the parts do add up, so those zeros may be real.
- Panel flag: `M2_TransitionalHousing_not_cumulative` (informational only).

**Definitional changes:**
- Visible in the file:
  - M2 is one combined block in FY2015–17; FY2018 adds the per-type breakdown.
  - Data-quality columns start in FY2019.
  - The FY2015–17 M7a labels say "Temporary/Permanent Housing"; later years say "Temporary/Permanent Destinations".
- HUD's FY2024 HMIS Data Standards (effective Oct 1, 2023) revised the destination and prior-living-situation categories that feed M2, M5 and M7. The exact FY2023/FY2024 SPM spec changes were not verified in the time box, so treat FY2023→FY2024 shifts in destination-based measures with caution.
- FY2020–21 cover the COVID period.

**System design affects the numbers:**
- M7a counts temporary destinations as successful exits.
- Shelter-heavy systems (NYC, Boston) show long M1 and high per-capita M5.
- CoCs that enroll more unsheltered people in HMIS-tracked outreach or shelter will show higher M5 and outreach counts.

**What M5 counts:** people entering ES/SH/TH (or PH) with no HMIS record in the previous 24 months. It is not total inflow into homelessness. People who stay unsheltered and never enroll aren't counted.

**Per-capita M5 is approximate.** It uses the panel's geography; for example, CA-600 excludes Long Beach, Pasadena and Glendale.

## What this does and doesn't show

**What it shows:**
- In King County's HMIS, average time homeless in ES+SH rose from 76 days (FY2015) to 207 days (FY2024); the median rose from 24 to 119 days. In FY2024 these are among the longest of the 67 large CoCs.
- Returns to homelessness are near or better than the large-CoC median.
- First-time homeless per 10k residents is above the median.
- In FY2024, exits from outreach and from ES/SH/TH/RRH to permanent housing ranked near the top.
- PSH retention ranked below the median.

**What it doesn't show:**
- Why CoCs differ, or whether the gaps reflect performance, data practice, coverage or system design.
- Stable ranks for destination-based measures: M2 and M7 can move tens of points on record-closure practice alone, as KCRHA's FY2025 note shows.

## Files

All under `C:\dev\FactHub-Tester\seattle-homelessness\data\spm\`:
- `spm_panel.csv`: 670 rows. Counts, recomputed and HUD-reported %, population, M5 per 10k, unknown-destination %, `dq_flags`.
- `scripts\`:
  - `csvlib.js`, `build_spm.js`: build the panel (`node build_spm.js ../raw/csv ../../coc_geography_map.csv ../../coc_homelessness_rent_panel.csv ../spm_panel.csv spm_rows.json`)
  - `rank.js`: rankings (`node rank.js 2019 2024`)
  - `pdftext.js`: KCRHA PDF text
  - `headers.js`, `groups.js`: structure checks
  - `spm_rows.json`
- `raw\`:
  - `spm_direct.xlsx`
  - `csv\2015.csv` … `csv\2024.csv`
  - `page.html` (the live page's 404 response)
  - `page_arch.html`
  - `kcrha\*.pdf` plus extracted text
