transcript.md
↑ ContentsState Planner chat · https://stateplanner.com
- State: Pennsylvania (PA)
- Started: November 4, 2026, 3:56 AM UTC
- Runtime: 54 sec
- Status: completed
Prompt
Pennsylvania County Building Permits: How Many New Homes Did Each County Permit, 2020-2025?
Model: Anthropic: Claude Opus 5.5 (anthropic/claude-opus-5.5, via openrouter)
Response
New housing units permitted by Pennsylvania counties, 2020–2025
Source: Census Bureau Building Permits Survey, final annual county estimates with the Bureau's imputation for permit offices that didn't report. These are new, privately owned housing units that permits authorized. A permit isn't a start or a completion, and the figures leave out manufactured homes, conversions and public housing. The per-resident rates use the Census Bureau's July 1, 2025 county population estimates.
Statewide: permits authorized about 177,600 units over the six years. Of those, 100,800 (57%) were single-family houses, 9,300 were in 2–4 unit buildings and 67,500 were in buildings of 5 or more units.

Most years came in at 25,000–28,000 units. 2021 was much higher, at 47,900, and nearly all of the extra units were in Philadelphia: the city permitted 25,257 units that year, 21,917 of them in buildings of 5 or more units. In every other year Philadelphia permitted about 3,000–5,700.

Map legend: counties are shaded by units permitted per 1,000 residents over 2020–2025. Darkest navy is 20 or more, then mid-blue for 14–19.9, light blue for 8–13.9, pale blue for 5–7.9 and near-white for under 5. Click a county to see its total, its units by building size and its population.
Housing units permitted by county, 2020–2025
| County | Total units | Single-family | 2–4 units | 5+ units | 2025 alone | Per 1,000 residents |
|---|---|---|---|---|---|---|
| Philadelphia | 44,336 | 4,614 | 5,065 | 34,657 | 3,366 | 28.2 |
| Allegheny | 17,786 | 7,844 | 215 | 9,727 | 3,191 | 14.5 |
| Montgomery | 11,674 | 8,535 | 284 | 2,855 | 2,231 | 13.3 |
| Chester | 10,766 | 7,975 | 222 | 2,569 | 1,400 | 19.3 |
| Lancaster | 8,145 | 5,279 | 375 | 2,491 | 1,296 | 14.5 |
| York | 7,973 | 5,975 | 192 | 1,806 | 1,589 | 16.8 |
| Butler | 6,616 | 5,525 | 289 | 802 | 1,246 | 33.1 |
| Cumberland | 6,085 | 4,388 | 156 | 1,541 | 745 | 21.9 |
| Northampton | 5,398 | 2,918 | 165 | 2,315 | 1,050 | 16.6 |
| Bucks | 4,912 | 3,960 | 90 | 862 | 780 | 7.6 |
| Lehigh | 4,220 | 3,149 | 38 | 1,033 | 394 | 11.0 |
| Dauphin | 3,686 | 2,475 | 198 | 1,013 | 329 | 12.6 |
| Franklin | 3,515 | 2,627 | 235 | 653 | 1,033 | 21.9 |
| Washington | 3,101 | 2,726 | 244 | 131 | 359 | 14.7 |
| Westmoreland | 2,814 | 2,130 | 358 | 326 | 421 | 8.1 |
| Berks | 2,725 | 1,993 | 122 | 610 | 582 | 6.2 |
| Centre | 2,713 | 1,787 | 179 | 747 | 314 | 17.2 |
| Lebanon | 2,430 | 1,604 | 38 | 788 | 542 | 16.6 |
| Adams | 2,275 | 2,275 | 0 | 0 | 476 | 21.1 |
| Luzerne | 1,949 | 1,706 | 77 | 166 | 295 | 5.9 |
| Delaware | 1,913 | 1,584 | 86 | 243 | 217 | 3.3 |
| Monroe | 1,588 | 1,437 | 13 | 138 | 257 | 9.5 |
| Erie | 1,462 | 982 | 42 | 438 | 243 | 5.5 |
| Lackawanna | 1,461 | 1,146 | 188 | 127 | 277 | 6.7 |
| Beaver | 1,409 | 1,011 | 51 | 347 | 285 | 8.5 |
| Pike | 1,370 | 1,003 | 0 | 367 | 167 | 21.8 |
| Fayette | 1,272 | 1,192 | 56 | 24 | 196 | 10.3 |
| Schuylkill | 991 | 877 | 8 | 106 | 211 | 6.8 |
| Carbon | 922 | 895 | 10 | 17 | 195 | 14.0 |
| Wayne | 884 | 880 | 4 | 0 | 150 | 17.1 |
| Perry | 650 | 635 | 15 | 0 | 127 | 13.9 |
| Blair | 596 | 458 | 68 | 70 | 86 | 5.0 |
| Columbia | 552 | 475 | 5 | 72 | 111 | 8.3 |
| Mercer | 487 | 447 | 4 | 36 | 90 | 4.5 |
| Clearfield | 457 | 410 | 23 | 24 | 75 | 5.9 |
| Crawford | 453 | 453 | 0 | 0 | 99 | 5.5 |
| Mifflin | 445 | 436 | 4 | 5 | 54 | 9.6 |
| Bradford | 425 | 410 | 4 | 11 | 62 | 7.1 |
| Somerset | 420 | 420 | 0 | 0 | 57 | 5.8 |
| Huntingdon | 413 | 361 | 4 | 48 | 64 | 9.6 |
| Lycoming | 412 | 363 | 6 | 43 | 69 | 3.7 |
| Bedford | 407 | 407 | 0 | 0 | 75 | 8.6 |
| Cambria | 385 | 375 | 10 | 0 | 61 | 3.0 |
| Susquehanna | 379 | 362 | 12 | 5 | 61 | 9.9 |
| Lawrence | 361 | 353 | 2 | 6 | 70 | 4.3 |
| Northumberland | 360 | 340 | 20 | 0 | 31 | 4.0 |
| Union | 359 | 307 | 8 | 44 | 63 | 8.5 |
| Snyder | 315 | 299 | 16 | 0 | 69 | 7.9 |
| Armstrong | 289 | 195 | 2 | 92 | 29 | 4.5 |
| Tioga | 260 | 260 | 0 | 0 | 74 | 6.4 |
| Warren | 239 | 165 | 4 | 70 | 35 | 6.5 |
| Wyoming | 234 | 176 | 8 | 50 | 67 | 9.1 |
| Indiana | 224 | 194 | 30 | 0 | 40 | 2.7 |
| Venango | 223 | 217 | 0 | 6 | 50 | 4.5 |
| Juniata | 215 | 215 | 0 | 0 | 30 | 9.2 |
| Greene | 204 | 204 | 0 | 0 | 36 | 6.0 |
| Jefferson | 196 | 196 | 0 | 0 | 0 | 4.5 |
| Elk | 185 | 177 | 8 | 0 | 23 | 6.2 |
| McKean | 182 | 170 | 0 | 12 | 33 | 4.7 |
| Clinton | 180 | 178 | 2 | 0 | 38 | 4.8 |
| Montour | 159 | 151 | 8 | 0 | 18 | 8.9 |
| Fulton | 149 | 149 | 0 | 0 | 17 | 10.3 |
| Clarion | 148 | 148 | 0 | 0 | 23 | 4.0 |
| Potter | 135 | 135 | 0 | 0 | 21 | 8.5 |
| Sullivan | 77 | 77 | 0 | 0 | 12 | 13.1 |
| Forest | 22 | 22 | 0 | 0 | 2 | 3.3 |
| Cameron | 0 | 0 | 0 | 0 | 0 | 0.0 |
Main points
- By total units: Philadelphia (44,300) and Allegheny (17,800) permitted the most. Montgomery, Chester, Lancaster and York followed with about 8,000–11,700 each. Those six counties account for 57% of the statewide total.
- Per resident: Butler permitted the most, with 33.1 units per 1,000 residents, mostly single-family. Philadelphia was next at 28.2, though about 57% of its units came in 2021 alone. Cumberland, Franklin, Pike, Adams and Chester also topped about 19 per 1,000.
- Building size: in most counties outside the metro cores, nearly all permitted units were single-family houses. Philadelphia is the only county where most units were in buildings of 5 or more units (78%). Allegheny was just over half (55%).
- Zero or near zero: Cameron County reported no permitted units over the six years, and Jefferson reported none in 2025.
I can break down any county by permit office (municipality), show a year-by-year trend, or total the construction values (in nominal dollars) if you'd like.
Chart Queries
Pennsylvania Housing Units Permitted by Building Size, 2020-2025
SELECT YEAR AS "Year",
s.size AS "Building size",
sum(s.u) AS "Units"
FROM pa_bps_county_permits,
LATERAL (
VALUES ('Single-family', units_1),
('2-4 units', units_2 + units_3_4),
('5+ units', units_5plus)
) s(size, u)
WHERE YEAR BETWEEN 2020 AND 2025
GROUP BY 1,
2
ORDER BY 1
charts/turn-1-pa-units-by-year.csv
Picture: charts/turn-1-pa-units-by-year.png
Exploratory Queries
Query 1 — Check years available and county coverage for 2020-2025.
SELECT YEAR,
count(*),
sum(units_total) u,
sum(units_1) sf,
sum(units_5plus) mf5
FROM pa_bps_county_permits
WHERE YEAR >= 2019
GROUP BY YEAR
ORDER BY YEAR
| year | count | u | sf | mf5 |
|---|---|---|---|---|
| 2019 | 67 | 23539 | 14878 | 7097 |
| 2020 | 67 | 25706 | 15846 | 7921 |
| 2021 | 67 | 47894 | 18764 | 26590 |
| 2022 | 67 | 28149 | 18150 | 8658 |
| 2023 | 67 | 25320 | 15912 | 8457 |
| 2024 | 67 | 24810 | 16348 | 7192 |
| 2025 | 67 | 25709 | 15812 | 8675 |
Query 2 — Total permitted units by county 2020-2025 with per-1,000-resident rate.
WITH p AS (
SELECT geoid,
sum(units_total) u,
sum(units_1) sf,
sum(units_2 + units_3_4) small,
sum(units_5plus) mf,
sum(units_total) FILTER (
WHERE YEAR = 2025
) u25
FROM pa_bps_county_permits
WHERE YEAR BETWEEN 2020 AND 2025
GROUP BY geoid
),
pop AS (
SELECT geoid,
pop_estimate
FROM pa_census_county_pop_est
WHERE YEAR = (
SELECT max(YEAR)
FROM pa_census_county_pop_est
)
)
SELECT c.name,
p.*,
pop.pop_estimate,
round(p.u * 1000.0 / pop.pop_estimate, 1) per1k
FROM p
JOIN pa_census_counties c USING (geoid)
LEFT JOIN pop USING (geoid)
ORDER BY u DESC
| name | geoid | u | sf | small | mf | u25 | pop_estimate | per1k |
|---|---|---|---|---|---|---|---|---|
| Philadelphia County | 42101 | 44336 | 4614 | 5065 | 34657 | 3366 | 1574281 | 28.2 |
| Allegheny County | 42003 | 17786 | 7844 | 215 | 9727 | 3191 | 1225035 | 14.5 |
| Montgomery County | 42091 | 11674 | 8535 | 284 | 2855 | 2231 | 877643 | 13.3 |
| Chester County | 42029 | 10766 | 7975 | 222 | 2569 | 1400 | 557116 | 19.3 |
| Lancaster County | 42071 | 8145 | 5279 | 375 | 2491 | 1296 | 563159 | 14.5 |
| York County | 42133 | 7973 | 5975 | 192 | 1806 | 1589 | 473197 | 16.8 |
| Butler County | 42019 | 6616 | 5525 | 289 | 802 | 1246 | 200169 | 33.1 |
| Cumberland County | 42041 | 6085 | 4388 | 156 | 1541 | 745 | 277270 | 21.9 |
| Northampton County | 42095 | 5398 | 2918 | 165 | 2315 | 1050 | 324411 | 16.6 |
| Bucks County | 42017 | 4912 | 3960 | 90 | 862 | 780 | 647828 | 7.6 |
| Lehigh County | 42077 | 4220 | 3149 | 38 | 1033 | 394 | 384383 | 11.0 |
| Dauphin County | 42043 | 3686 | 2475 | 198 | 1013 | 329 | 293351 | 12.6 |
| Franklin County | 42055 | 3515 | 2627 | 235 | 653 | 1033 | 160652 | 21.9 |
| Washington County | 42125 | 3101 | 2726 | 244 | 131 | 359 | 210802 | 14.7 |
| Westmoreland County | 42129 | 2814 | 2130 | 358 | 326 | 421 | 349324 | 8.1 |
| Berks County | 42011 | 2725 | 1993 | 122 | 610 | 582 | 440072 | 6.2 |
| Centre County | 42027 | 2713 | 1787 | 179 | 747 | 314 | 157393 | 17.2 |
| Lebanon County | 42075 | 2430 | 1604 | 38 | 788 | 542 | 146380 | 16.6 |
| Adams County | 42001 | 2275 | 2275 | 0 | 0 | 476 | 107594 | 21.1 |
| Luzerne County | 42079 | 1949 | 1706 | 77 | 166 | 295 | 332126 | 5.9 |
| Delaware County | 42045 | 1913 | 1584 | 86 | 243 | 217 | 580937 | 3.3 |
| Monroe County | 42089 | 1588 | 1437 | 13 | 138 | 257 | 167179 | 9.5 |
| Erie County | 42049 | 1462 | 982 | 42 | 438 | 243 | 265832 | 5.5 |
| Lackawanna County | 42069 | 1461 | 1146 | 188 | 127 | 277 | 216502 | 6.7 |
| Beaver County | 42007 | 1409 | 1011 | 51 | 347 | 285 | 166032 | 8.5 |
25 out of 67 are listed here.
Query 3 — Philadelphia's yearly totals and the population-estimate year used.
SELECT YEAR,
units_total,
units_5plus,
(
SELECT max(YEAR)
FROM pa_census_county_pop_est
) popyr
FROM pa_bps_county_permits
WHERE geoid = '42101'
AND YEAR BETWEEN 2020 AND 2025
ORDER BY YEAR
| year | units_total | units_5plus | popyr |
|---|---|---|---|
| 2020 | 5665 | 3652 | 2025 |
| 2021 | 25257 | 21917 | 2025 |
| 2022 | 3223 | 2034 | 2025 |
| 2023 | 3863 | 3027 | 2025 |
| 2024 | 2962 | 1848 | 2025 |
| 2025 | 3366 | 2179 | 2025 |
Map Layer Queries
Units permitted per 1,000 residents, 2020-2025 — colored by "cls": 20 or more per 1,000 (#08306b), 14 to 19.9 (#2171b5), 8 to 13.9 (#6baed6), 5 to 7.9 (#c6dbef), Under 5 (#f7fbff)
WITH p AS (
SELECT geoid,
sum(units_total) u,
sum(units_1) sf,
sum(units_2 + units_3_4) sm,
sum(units_5plus) mf
FROM pa_bps_county_permits
WHERE YEAR BETWEEN 2020 AND 2025
GROUP BY geoid
),
pop AS (
SELECT geoid,
pop_estimate
FROM pa_census_county_pop_est
WHERE YEAR = 2025
)
SELECT c.geom,
c.name AS "County",
p.u AS "Units permitted 2020-2025",
p.sf AS "Single-family units",
p.sm AS "2-4 unit buildings",
p.mf AS "5+ unit buildings",
pop.pop_estimate AS "Population(2025 est.)",
round(p.u * 1000.0 / pop.pop_estimate, 1) AS "Units per 1,000 residents",
CASE
WHEN p.u * 1000.0 / pop.pop_estimate >= 20 THEN 'a'
WHEN p.u * 1000.0 / pop.pop_estimate >= 14 THEN 'b'
WHEN p.u * 1000.0 / pop.pop_estimate >= 8 THEN 'c'
WHEN p.u * 1000.0 / pop.pop_estimate >= 5 THEN 'd'
ELSE 'e'
END AS cls
FROM pa_census_counties c
JOIN p USING (geoid)
JOIN pop USING (geoid)
Picture: maps/turn-1-county-permits-2020-2025.png
Used Data Sets
pa_bps_county_permits— last synced 2026-10-14 · 2,412 rowspa_census_counties— last synced 2026-09-26 · 67 rowspa_census_county_pop_est— last synced 2026-10-15 · 3,752 rows