Portland for All · Emergency-Response Data Brief

Portland Police vs Fire — Response Since 2019

How emergency response times, call volumes, and staffing have changed for Portland Police Bureau and Portland Fire & Rescue.

Updated July 2026 Fiscal years (Jul–Jun) 90th-percentile, high-priority calls Sources & how to verify ↓
Reading level
applies to every chart · remembered

Reading these charts: the bureaus measure response time on different clocks — fire's is turnout+travel; police's also includes time a call waits in the dispatch queue. Compare trends, and compare like-for-like (travel vs travel). Every chart has a copyable data table beneath it.

Key findings

+182%
police full response, FY2020→FY2025 (14:32→40:59)
+11% vs +34%
fire vs police travel time — police degrades ~3× faster on the like-for-like clock
934→798
police sworn officers: FY2020 peak to FY2026 — never recovered
$237M→$308M
PPB total budget (all funds) over the same window — more money, fewer officers
-26%
police high-priority demand FY2020→FY2025 — calls fell while response slowed (a capacity/deployment story, not a surge)

PPB is asking for a bigger budget. But the money already climbed ~30% while response got 182% worse — and the slowdown is almost entirely calls waiting for a free unit, not the drive to the scene. The problem isn’t dollars; it’s how the bureau deploys the officers it has.

How to read this report — methods, definitions & caveats
Plain-language explainer — how to talk about this data

Four things to understand to read these charts correctly — written plainly, so they can be paraphrased into a post or a web page.

1 · What “response time” means

Response time = the wait in the dispatch queue + the travel to the scene — the clock as the caller feels it, from the moment 911 has your emergency to the moment help is at the door. The queue (waiting for a free unit to be sent) is the part that explodes when staffing is short; travel is the drive. We add them together because that total is what people actually experience — a metric that counts travel only would hide the part of the wait that got worst.

For the public: “Response time is the whole wait — from when 911 has your emergency to when help arrives — not just the drive.”

2 · Why “p90,” not the average

p90 means 9 of 10 calls are answered faster than this number; 1 in 10 is slower. Two reasons it’s the right yardstick: (a) it’s the national public-safety standard — NFPA 1710, the fire benchmark this comparison is anchored to, is defined as a p90 target (on scene within 5:20 for 90% of high-priority calls), so matching it keeps police and fire like-for-like. (b) the average hides the crisis; p90 exposes it — response times are lopsided: most calls are normal, but a long tail drags out badly, and that tail is the harm we care about. When a system is overwhelmed the tail blows up first, so p90 moves sharply while the average barely twitches. PPB publishes averages, which makes the problem look smaller than it is.

For the public: “We report the 1-in-10 worst wait — that’s the emergency people actually fear, and it’s the national standard fire is graded on.”

3 · Why these numbers differ from Nick’s (high-priority vs. all calls)

If two response charts show different numbers, it’s almost always which calls are counted — not a contradiction. These charts use high-priority calls only (life-safety / urgent); Nick’s chart blends all calls (high + medium + low). We use high-priority because it’s a true emergency-response number — routine calls drag the figure down until it stops looking like emergency response — and because it matches fire, which is also high-priority. Blending in low-priority calls makes the change look less alarming, not because things improved but because routine calls dilute the signal. Our chart axes now say “high-priority” so the two can sit side by side without confusion.

4 · Why we don’t headline “police are X minutes slower than fire”

The two bureaus start their stopwatches at different moments: police response includes the dispatch-queue wait; fire’s clock starts later, at unit notification, so it excludes that wait. That alone makes the police number structurally larger. So the honest comparison isn’t a single minutes gap — it’s direction: police response is degrading several times faster than fire’s, and where the same component exists on both sides (travel vs travel) we compare those.

For the public: “We’re not claiming police are exactly N minutes slower than fire — the bureaus time things differently. The story is the direction: police response is getting worse, fast, while fire’s has held.”

How Portland prioritises 911 calls — high, medium & low

When a 911 call comes in, a BOEC dispatcher assigns it a priority number (1–9) by urgency and danger — not by the type of incident. PPB rolls those into three tiers. The same kind of call can fall in any tier depending on severity: a crash with injuries is High, a fender-bender is Low.

High (priority 1–3)
Immediate threat to life or safety, usually still in progress. e.g. shots fired, an assault, a threat, a behavioral-health crisis, a crash with injuries. These are the calls the headline response-time figures track — the city's official speed yardstick.
Medium (priority 4)
An officer is needed, but there's no immediate danger. e.g. an unwanted person, a welfare check, a theft just discovered, a road hazard.
Low (priority 5–9)
Minor or after-the-fact, often with no active scene. e.g. a building alarm, a cold theft or stolen-vehicle report, a follow-up visit, a harassment report.

Tiers: PPB Dispatched Calls open data (Priority field, PriorityNumber 1–9). Examples are the most common call categories in each tier, 2024.

Key terms — how to read these charts
90th percentile (p90)
the time within which 9 of every 10 calls were answered — a worst-case yardstick that captures the slow tail people actually feel, not the flattering average. “p90 of 15:00” means 1 call in 10 took longer than 15 minutes.
High-priority calls
the most urgent dispatches (PPB priority 1–3: in-progress crimes, injuries, threats to life). Filtering to these compares each bureau on the calls where speed matters most.
Response clock
Fire measures turnout + travel (time from alarm to arrival). Police response also includes time in the dispatch queue — so the two clocks are not directly comparable. The honest comparison is the trend over time, plus like-for-like parts (travel vs travel).
Time in dispatch queue
for police, the wait after a 911 call-taker has logged the call, until a unit is actually sent. It measures officer availability (no free car to dispatch) — it is not the 911 phone-answer delay.
Fiscal year (FY)
Portland's fiscal year runs Jul–Jun, so FY2020 = Jul 2019–Jun 2020. Fire reports come by fiscal year; charts here use FY. Police FY2019 is incomplete (data starts Jan 2019), so trends are indexed to FY2020.
Confidence markers
on the staffing charts, solid dots are figures confirmed or reported from a primary source; hollow dots (and a trailing * in the tables) are estimates still being verified — treat them as directional. Police filled-sworn counts are sourced figures (PPB staffing reports, City adopted budgets, news citations).
Officer-initiated stop
a stop the officer chose to make (a traffic or pedestrian stop), as recorded under Oregon's STOP Act (HB 2355). This is proactive policing — a different universe from a 911-dispatched call, which the community initiates. The two are never summed in this report.
Stop reason (traffic vs other)
PPB records whether a stop cited only a traffic offense or invoked some other crime. In 2024, ~98% of officer-initiated stops were traffic-only — the proactive-effort echo of the Catalyst California finding. Oregon records no stop duration, so this is share of stops, not officer-hours.
Call group
PPB buckets every dispatched call into eight groups (Disorder, Crime, Traffic, Alarm, Civil, Assist, Other, Community Policing). Disorder/quality-of-life calls are the largest share (~46%); traffic is small (~8%). This is call mix — what the public asks police to handle — not time on task.
Is police response getting worse — and worse than fire?2 charts

The like-for-like comparison, and the standard. Fire and police run on different clocks, so the honest read is the trend and the components that match (travel vs travel) — not a single minutes gap.

Chart 4#

Even fire is slipping further below its own standard

Share of high-priority fire responses meeting the 5:20 turnout+travel target

2026-07-01T16:31:40.465004 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 0 20 40 60 80 100 % within 5:20 NFPA 1710 target: 90% Fire: % of high-priority responses within 5:20

What this shows. The share of high-priority fire responses that arrive within the 5:20 benchmark. The dotted line is the NFPA 1710 national target of meeting that standard 90% of the time.

What to look for. Even fire — the better-performing bureau — is drifting below its own target and trending down. It's still far ahead of police, but the direction is the wrong way for everyone.

What this shows. Share of high-priority fire responses meeting the 5:20 total-response benchmark, year by year, with the dotted line marking the NFPA-1710 target of clearing that standard 90% of the time. This is a compliance rate against a fixed national clock, not an indexed change.

What to look for. The compliance share sits below the 90% line and trends downward, even though fire remains well ahead of police on the same chart. Caveat: NFPA-1710 is a turnout+travel standard not directly comparable to PPB's queue+travel full-response clock — the two bureaus are never summed; this card scores fire against fire's own target.

What this shows. Even the bureau that's working is slipping. Fire — by far the stronger performer — is drifting below its own national target and heading the wrong way.

What to look for. If the well-run bureau is already missing the standard 10% of the time and falling, the city has no margin to spare. Fire is still far ahead of police, but everyone is trending down — the question is whether Portland reverses it or watches the better half erode too.

Fire high-priority responses within the 5:20 standard
FY% within 5:20
201958%
202055%
202149%
202248%
202344%
202443%
202542%
NFPA 1710 target: 90%. Police publishes no equivalent standard.
Is this a demand problem, or a capacity problem?4 charts

If response is slowing, is it because demand is rising — or because there's no free unit to send? Total dispatched volume is flat-to-down, and the growth is the dispatch-queue wait, not the drive: the signature of a capacity problem, not a surge.

Chart 2#

Dispatch queue — not travel — drives the police delay

Police high-priority response, split into its two components (minutes)

2026-07-01T16:31:40.517392 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 5 10 15 20 25 30 35 40 minutes Fire (for reference) Travel time Time waiting in dispatch queue

What this shows. The police high-priority response time, split into its two parts: the blue bar is actual travel time; the orange bar stacked on top is time waiting in the dispatch queue. The dashed line is fire, for scale.

What to look for. The orange (queue) segment grows from a sliver into the majority of the bar. The slowdown isn't cars driving slower — it's calls waiting longer for any car to be free, which points at officer availability, not traffic.

What this shows. PPB's open data splits a high-priority response into two clocks — time-in-queue (call accepted, waiting for an available unit) and travel (unit assigned to on-scene) — stacked here to total p90 response; the fire dashed line is NFPA-1710 turnout+travel, plotted for scale only and not a like-for-like sum. Both segments are p90, high-priority.

What to look for. The orange queue segment, near-zero early, comes to dominate the bar while the blue travel segment stays comparatively flat — isolating the slowdown to dispatch wait, not drive time. Caveat: the Aug-2020 BOEC queue-cap change (4h→14h) widens the measurable tail, so later queue segments are partly a recording-window effect; the directional growth survives it.

What this shows. Break the wait apart and the story is plain: cars aren't driving slower — calls are sitting in the queue with no car free to send. The travel time barely moves; the wait for any unit is what explodes.

What to look for. Queue time grows from a sliver into the majority of the response. You can't pave your way out of that, and you can't blame traffic — it's an availability problem, which is to say a staffing-and-deployment problem the city can actually fix.

Police high-priority p90 response by component (mm:ss)
FYTravelDispatch-queue waitTotal responseFire (ref)
202011:452:4714:327:38
202113:246:2219:467:57
202213:5510:4424:397:55
202314:3421:4336:178:19
202415:0922:5238:018:27
202515:4225:1740:598:27
Chart 3#

Fewer calls, slower response — a deployment crisis, not a surge

Police high-priority demand vs speed, by fiscal year

2026-07-01T16:31:40.578357 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 10 20 30 40 50 60 70 high-priority calls (thousands) High-priority calls (000s) response (min) 0 5 10 15 20 25 30 35 40 response time (minutes)

What this shows. Two things on one chart for police: green bars are the number of high-priority calls; the purple line is how slow p90 response got. If rising demand were the cause, bars and line would climb together.

What to look for. They move in opposite directions — calls fall while response times rise. Fewer calls but slower service is the signature of a capacity / deployment problem, not a demand surge.

What this shows. Two PPB series on a shared timeline: green bars are the annual count of high-priority calls (workload), the purple line is p90 high-priority response (speed). A genuine demand-driven slowdown would show both rising together; decoupling points elsewhere.

What to look for. Calls fall while p90 response climbs — the two series diverge rather than track. Caveat: call counts are sensitive to classification and the same Aug-2020 BOEC queue-cap window that inflates response tails, so read the opposing direction, not the precise gap. All p90, high-priority.

What this shows. The "we're just overwhelmed by calls" defense fails its own chart. Demand is falling. Response is getting slower. Fewer calls, worse service — that is not what being overwhelmed looks like.

What to look for. When workload drops and speed still craters, the bottleneck is on the supply side — how the bureau is staffed and deployed, not how much the public asks of it. More 911 volume isn't the problem, so more money for volume isn't the fix.

Police high-priority demand vs speed, by fiscal year
FYHigh-priority callsp90 response (mm:ss)
202070,77014:32
202170,90919:46
202268,41724:39
202361,97936:17
202453,29538:01
202552,21240:59
Chart 19#

Total calls to Portland police are falling

All dispatched police calls per year, with the high-priority subset, 2020–2025

2026-07-01T16:31:40.637408 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 50 100 150 200 dispatched calls (thousands) 224k 226k 213k 204k 199k 209k 70k 72k 64k 58k 52k 51k -7% since 2020 High-priority subset All dispatched calls

What this shows. Total dispatched police demand per calendar year, 2020–2025 — every 911/non-emergency call PPB was sent to (green bars), with the high-priority subset broken out (purple line). This is the reactive universe — what the community calls police about — counted, not weighted by time on scene.

What to look for. Demand is flat-to-down: total calls slip from ~224k to ~209k (−7%), and the high-priority subset falls harder, ~70k→51k (−27%). So the rising response times elsewhere in this report are not a story of surging demand — calls went down while waits went up, which points back at staffing, not call volume.

What this shows. Annual count of dispatched 911/non-emergency calls PPB was sent to, 2020–2025, with the high-priority subset broken out — counts of calls, not workload weighted by time on scene.

What to look for. Totals fall ~224k to ~209k (−7%) and the high-priority subset ~70k to 51k (−27%). As raw counts with no time-on-scene weighting this bounds demand, not effort — but it does rule out rising volume as the cause of the longer waits elsewhere in this report.

What this shows. Police demand isn't surging — it's falling. Total calls are down −7%, and the urgent ones down −27%.

What to look for. Calls went down while waits went up. The response-time crisis is a story about staffing and deployment, not a city overwhelming its police.

Total dispatched police calls by calendar year
CYAll callsHigh-priorityΔ vs 2020
2020224,48470,389+0.0%
2021225,74071,611+0.6%
2022213,12864,211-5.1%
2023204,40258,150-8.9%
2024198,67252,137-11.5%
2025208,74251,207-7.0%
2020→2025. PPB Dispatched Calls open data (RegJIN). Call COUNTS — community-initiated demand, not officer-hours or time on task.
Chart 22#

High-priority calls aren’t rising — the demand is flat-to-falling

High-priority dispatched calls per year, 2015–2025 (two definitions, shown separately)

2026-07-01T16:31:40.688297 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2016 2018 2020 2022 2024 0 20 40 60 80 100 120 high-priority dispatched calls (thousands) 51,207 116,300 same year, ~1.7× apart (different definition) PPB/TAC report — “High” tier (broader grouping) Our open data — Priority 1/2/3

What this shows. High-priority police calls per year across the full decade. Diane asked for ten years; the City's open data only starts in 2019, so the earlier years (2015–2020, the dashed grey line) come from a different City report that counts “high priority” more broadly — it runs about 1.7× larger, which is why the two lines are kept separate, never joined. The solid blue line is the like-for-like Priority 1/2/3 count we use everywhere else.

What to look for. Whichever definition you use, high-priority demand is not rising — it is flat then falling. Our Priority-1/2/3 count drops ~70k→51k (−27%) since 2019; the broader tier was already flat-to-down before that. So the longer waits elsewhere in this report are not a story of more urgent calls flooding in.

What this shows. Two non-comparable high-priority series shown side by side: City open-data Priority 1/2/3 (2019–2025) and the PPB/TAC report's broader High/Medium/Low “High” grouping (2015–2020). They differ ~1.67× in the 2019–2020 overlap, so they are plotted as distinct lines and never stitched into one trend; pre-2019 Priority-1/2/3 is simply not published.

What to look for. Both definitions show flat-to-falling high-priority volume — the open-data line is down ~27% (2019→2025). The seam is a definitional artifact, not a real jump; the overlap years make the ~1.7× gap explicit. Demand is ruled out as the driver of the rising response times.

What this shows. Ten years of data, one conclusion: the urgent calls are not overwhelming the city. Even on the broadest definition, high-priority demand is flat-to-falling.

What to look for. The number of serious calls is down ~27% since 2019 — yet waits keep climbing. This is a staffing and deployment story, not a city drowning in 911 calls.

High-priority dispatched calls by calendar year — two definitions
CYPriority 1/2/3 (open data)“High” tier (PPB/TAC report)
2015125,900
2016125,100
2017129,100
2018124,700
201969,922117,000
202070,389116,300
202171,611
202264,211
202358,150
202452,137
202551,207
Two DIFFERENT definitions, shown side by side — never summed or joined. Priority 1/2/3 is the City open data (2019–2025); the broader “High” tier is the PPB/TAC report (2015–2020), which runs ~1.67× larger in the overlap years. Pre-2019 Priority-1/2/3 isn't published. See docs/BACKFILL.md.
Is a bigger budget the answer?6 charts

PPB is asking for a bigger budget. But the money climbed ~30% while response got worse — and even after officers rebounded from the FY2022 trough, response kept slowing. The shortfall isn't dollars, and it isn't simply headcount: it's how the force is deployed.

Chart 5#

More money, fewer cops — PPB's budget rose as its ranks fell

PPB total budget (all funds) vs filled sworn officers, by fiscal year

2026-07-01T16:31:40.749392 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 2026 0 50 100 150 200 250 300 budget ($ millions) PPB total budget ($M, all funds) Sworn officers (filled) 780 800 820 840 860 880 900 920 940 sworn officers (filled)

What this shows. PPB's total budget, all funds (blue bars) against the number of filled sworn officers (purple line). “Sworn” = badge-carrying police, as opposed to civilian staff.

What to look for. The money line climbs from ~$237M to ~$308M while officers fell from a 2020 peak of 934 into the high-700s — more dollars are buying fewer cops on the street. That undercuts the claim that a bigger budget is what produces more policing capacity.

What this shows. Bars are PPB's adopted budget, all funds, by fiscal year (City Budget Office), in nominal dollars — not inflation-adjusted, so real growth is smaller than the line implies. The series is filled sworn officers (badge-carrying, excludes civilian staff); authorized strength is confirmed but some filled-counts are reported/estimated where the city hasn't published a clean year-end figure.

What to look for. ~$237M→~$308M nominal (+~30%) against filled sworn ~934 (2020) → high-700s. The estimate caveat is why this card's staffing source carries a hollow confidence dot. Read the divergence, not the absolute dollar level: more budget, fewer officers, regardless of the inflation adjustment.

What this shows. Portland is spending more on policing than ever — roughly 30% more — and getting fewer officers for it. The budget line and the staffing line cross. "Fund the bureau and response will follow" is not what the city's own numbers show.

What to look for. If a third more money bought a smaller force, the next dollar won't buy speed either. The bottleneck isn't the size of the appropriation — it's hiring, retention, and how thinly the existing force is spread. That's where the response crisis actually lives.

Sources for this chart

○ = partly reported/estimated; see the staffing note under “How to read this report.”

All sources & how to verify ↓
PPB total budget (all funds) vs filled sworn officers
FYBudget (all funds)Filled sworn
2019881
2020$236.8M934
2021$223.3M824
2022$230.9M773
2023$249.0M809
2024$261.7M804
2025$282.4M822
2026$308.5M798
Chart 6#

PPB can't fill the jobs it already funds

Authorized vs filled sworn officers — the gap is unfilled funded positions

2026-07-01T16:31:40.806246 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 2026 0 200 400 600 800 1000 sworn officers Funded but UNFILLED (vacancies) Authorized (funded) positions Officers actually on staff

What this shows. Two officer counts: authorized (positions the budget already funds) and filled (officers actually on staff). The shaded band between them is unfilled funded positions — jobs the city is paying for but can't fill.

What to look for. The shaded gap persists and widens. PPB isn't blocked by a lack of funding — it can't hire and retain up to the headcount it's already funded for. More budget can't fix a hiring problem.

What this shows. Authorized (funded) sworn positions against filled sworn officers, with the shaded band between them measuring unfilled funded positions — headcount the budget pays for but no body occupies. Authorized strength is confirmed; some filled-counts are reported/estimated where the city hasn't published a clean year-end figure.

What to look for. The shaded gap persists and widens rather than closing — funded seats the bureau cannot fill, distinct from a funding shortfall. Caveat: the estimate on filled counts is why staffing here carries lower confidence; the existence and direction of the gap is robust to it.

What this shows. The money is already appropriated. The jobs are already funded. They sit empty. Portland's problem isn't a budget the council won't pass — it's positions the bureau can't fill.

What to look for. The gap between funded and filled doesn't shrink with more dollars because dollars were never the constraint — hiring and retention are. Authorizing more positions on top of the ones already going unfilled funds vacancies, not officers.

Sources for this chart

○ = partly reported/estimated; see the staffing note under “How to read this report.”

All sources & how to verify ↓
Authorized vs filled sworn officers (the gap = unfilled funded jobs)
FYAuthorized (funded)FilledUnfilled gap
20191,001881120
2020916934-18
202188282458
2022882773109
202388180972
202483980435
202587782255
Chart 7#

Portland pays more per call than ever — for slower police response

PPB cost per dispatched call and high-priority response time, by fiscal year

2026-07-01T16:31:40.862523 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 0 500 1000 1500 cost per dispatched call ($) $969 $1,025 $1,039 $1,170 $1,348 $1,387 2020 2021 2022 2023 2024 2025 10 20 30 40 high-priority response (min) 15 20 25 36 38 41

What this shows. An efficiency ratio: total PPB budget divided by the number of dispatched calls (blue bars = dollars per call), against p90 response time (purple line). What is the public getting per dollar?

What to look for. Cost per call climbs and response gets slower at the same time — Portland is paying more than ever for worse service. (A budget÷volume ratio, not a true unit cost, but the direction is unambiguous.)

What this shows. An efficiency ratio: total PPB budget divided by dispatched-call volume (blue bars = dollars per call), plotted against p90 response (purple line). It is a budget÷volume quotient, not a true unit cost — it attributes the whole bureau budget to dispatched calls and ignores proactive and non-dispatch work.

What to look for. Dollars-per-call rises while p90 response gets slower — more spent per call and worse service in the same years. Caveat: because the denominator is call volume, part of the per-call climb reflects falling call counts, not just rising spend; the joint direction (cost up, speed down) is unambiguous regardless.

What this shows. Per call answered, Portland is paying more than ever — and getting it slower than ever. The price went up and the product got worse at the same time.

What to look for. When cost-per-call and response time climb together, you are not underfunding a service — you are overpaying for a failing one. The next dollar buys the same broken ratio. Spending isn't the lever; how the bureau is staffed and deployed is.

PPB cost per dispatched call and p90 response
FYCost per callp90 response (mm:ss)
2020$96914:32
2021$1,02519:46
2022$1,03924:39
2023$1,17036:17
2024$1,34838:01
2025$1,38740:59
Budget ÷ all dispatched calls (an efficiency ratio, not marginal cost).
Chart 8#

Fire grew and held its response; police shrank and slowed — as its budget rose

Filled sworn officers (police) vs total personnel (fire, FTE) — y-axis starts at 650

2026-07-01T16:31:40.923818 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 2026 650 700 750 800 850 900 Staffing (people) 729 774 881 798 Fire staffing (FTE) Police staffing (sworn)

What this shows. Both bureaus' staffing in absolute headcount — police filled sworn officers and total fire personnel (FTE). The y-axis starts at 650 (not zero) so the year-to-year movement is legible; the values are real counts, not an index.

What to look for. Police peaked at 934 sworn in FY2020, shed ~160 officers by FY2022, then partly recovered (toward ~820) — all while its budget kept climbing and its response kept getting worse. Fire, by contrast, held its ranks and its response. The lesson isn't to hire more — it's that more dollars bought neither the headcount nor the service.

What this shows. Absolute headcount for both bureaus — PPB filled sworn officers and total PF&R personnel (FTE) — as real counts, not an index. The y-axis is truncated at 650 (not zero) to make year-to-year movement legible, which visually exaggerates the proportional size of the swings.

What to look for. Police peak at 934 sworn (FY2020), shed ~160 to FY2022, then partly recover toward ~820; fire holds roughly flat. Caveat: the truncated axis amplifies these moves, and sworn excludes civilian staff, so this is officer/firefighter headcount only — read it alongside the budget line, not on its own.

What this shows. Police staffing cratered and clawed part of the way back — 934, down ~160, then toward ~820 — while the budget climbed the whole time and response kept getting worse. Fire just held, and held its service with it.

What to look for. More dollars bought police neither the headcount nor the speed. Fire is the control group: same city, same pressure, stable ranks, stable response. The takeaway isn't "hire more at any cost" — it's that money alone clearly didn't buy either one.

Sources for this chart

○ = partly reported/estimated; see the staffing note under “How to read this report.”

All sources & how to verify ↓
Bureau staffing — absolute headcount (FY2019 index shown for reference)
FYFire FTEPolice swornFire indexPolice index
2019729881100100
202072593499106
202173582410194
202275277310388
202380080911092
202480080411091
202577482210693
202679891
Chart 9#

Response blew up — even as staffing recovered after 2022

Filled sworn officers vs full high-priority response (incl. dispatch-queue wait), FY2020–2025

2026-07-01T16:31:40.992183 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 780 800 820 840 860 880 900 920 940 filled sworn officers Filled sworn officers high-priority response, full (min) 0 5 10 15 20 25 30 35 40 response time (minutes) +182%

What this shows. Police filled sworn officers (blue, left axis) against p90 full response time including the dispatch-queue wait (purple, right axis), FY2020–2025. The response axis is zero-based; each line is read by its direction.

What to look for. Through FY2022 the lines open like scissors — officers fall, response climbs. But after FY2022 officers recover while response keeps right on climbing to +182%. So this isn't a simple headcount story: what grew is the wait for a free unit to dispatch, not the number of badges.

What this shows. Filled sworn count (left axis) and p90 high-priority full response — dispatch-queue wait plus travel (right axis) — on a shared FY2020–2025 timeline; the response axis is zero-based, so the climb is read by slope, not against a floating baseline. Two series on independent axes show co-movement, not a fitted causal coefficient.

What to look for. Officers fall through FY2022 then recover while response climbs monotonically to +182%, so the headcount correlation breaks after FY2022. The component that grew is the wait for a free unit, not travel — this chart asserts the divergence, it does not itself decompose the wait.

What this shows. Portland got its officers back after FY2022 — and full response time kept climbing anyway. More badges did not buy speed.

What to look for. If the force recovered while the wait still grew to +182%, the problem was never just headcount — it is the wait for a free unit to dispatch. You cannot hire your way out of a deployment problem.

Sources for this chart

○ = partly reported/estimated; see the staffing note under “How to read this report.”

All sources & how to verify ↓
Police: filled sworn officers vs p90 full response, by fiscal year
FYFilled swornp90 response, full (mm:ss)
202093414:32
202182419:46
202277324:39
202380936:17
202480438:01
202582240:59
Chart 10#

Fire added staff — and held its response

Total fire personnel (FTE) vs high-priority response (turnout+travel), FY2019–2025

2026-07-01T16:31:41.056786 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 730 740 750 760 770 780 790 800 fire personnel (fte) Fire personnel (FTE) high-priority response (turnout+travel, min) 0 1 2 3 4 5 6 7 8 response time (minutes) +14%

What this shows. The same pairing for fire: total personnel in FTE (vermillion, left axis) against p90 response — turnout+travel (purple, right axis). The response axis is zero-based, so the line's near-flatness is honest, not a scaling trick.

What to look for. Fire held its staffing and its response — up just +14% over six years, a fraction of police's blow-up. The contrast is the whole argument: police outcomes collapsed despite rising dollars, while fire's held.

What this shows. Fire's total personnel in FTE (left axis) against p90 high-priority response measured as NFPA-1710 turnout+travel (right axis), zero-based so the line's near-flatness reflects the data, not axis compression. This is a different clock from police — turnout+travel, not queue+travel — so the figures are not summable across bureaus.

What to look for. Response rises only +14% across the six-year window, a fraction of police's trajectory and within plausible year-to-year drift. Because turnout+travel carries no dispatch-queue component, this is the comparable lower bound for fire, not a full door-to-door time.

What this shows. Fire faced the same city — same traffic, same budget pressure — and held its response to +14% over six years. The collapse was never inevitable; one bureau simply avoided it.

What to look for. Fire kept its staffing and kept its response flat while police outcomes collapsed despite rising dollars. The contrast is the whole argument: this is about how a bureau is staffed and deployed, not streets no bureau can control.

Fire: total personnel (FTE) vs p90 response, by fiscal year
FYFire FTEp90 response (mm:ss)
20197297:24
20207257:38
20217357:57
20227527:55
20238008:19
20248008:27
20257748:27
Where does the harm land?5 charts

The citywide averages hide who got left behind. Police calls carry a location and a priority, so they break out by precinct and by call tier (fire data is citywide only). East Portland — the lower-income, most diverse precinct — is slowest in every year, and every priority of call got slower (High = priority 1–3, Medium = 4, Low = 5–9 — what falls in each tier?).

Where — by neighborhood (precinct)

Chart 15#

The slowest police response is concentrated in East Portland

FY2025 p90 high-priority police response (incl. dispatch-queue wait), by PPB precinct

2026-07-01T16:31:41.152486 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ Central 40:11 (+214% vs FY2020) East 46:33 (+216% vs FY2020) North 36:20 (+131% vs FY2020) 36:20 46:33 FY2025 p90 high-priority response

What this shows. The latest (FY2025) p90 high-priority response — the full wait including the dispatch queue — drawn on the city map. Each of PPB's three precincts is shaded by how long a high-priority call waits there now (darker = slower), labeled with that wait and its change since FY2020. Same numbers as the line chart below, placed in space.

What to look for. The map removes any doubt about where the slowdown lands. The deepest shade sits over East Portland — the lower-income, most diverse part of the city. The worst response isn't scattered citywide; it is concentrated in the precinct that was already the slowest to begin with.

What this shows. FY2025 p90 high-priority full response (dispatch-queue wait plus travel) aggregated to PPB's three precinct polygons and shaded by magnitude, each labeled with its current wait and change since FY2020. A three-bin choropleth conveys rank and rough magnitude, not a continuous surface — within-precinct variation is averaged away.

What to look for. East Portland holds the deepest shade: slowest now and already slowest at baseline. With only three areal units this is a coarse spatial summary, not a per-capita or call-density rate — darker means a longer p90 wait, not more calls.

What this shows. The slowdown has an address. The worst police response in the city sits over East Portland — the lower-income, most diverse part of town.

What to look for. The worst response isn't scattered citywide — it is concentrated in the precinct that was already slowest. The part of Portland with the least is waiting the longest, and the map leaves no doubt where.

FY2025 p90 high-priority police response by precinct (mm:ss)
PrecinctFY2025 responseChange since FY2020
Central40:11+214%
East46:33+216%
North36:20+131%
The value shading each precinct on the map. Full response incl. dispatch-queue wait; PPB only, boundaries verified stable 2019–25.
Chart 11#

The slowdown fell hardest on East Portland

p90 high-priority police response by precinct (incl. dispatch-queue wait), FY2020–2025

2026-07-01T16:31:41.226585 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 10 20 30 40 50 p90 high-priority response (minutes) 40:11 46:33 36:20 Central Precinct East Precinct — hardest hit North Precinct

What this shows. Police high-priority response — the full wait including the dispatch queue — drawn separately for each of PPB's three precincts. Each call is placed in a precinct by its own latitude/longitude (a spatial join to the current PPB district boundaries); fire stays citywide and is not shown here.

What to look for. The collapse is not evenly spread. East Portland — the lower-income, most diverse precinct — is the slowest in every single year and rose the most in absolute terms. The citywide average hides that the worst-served part of the city got left furthest behind.

What this shows. Police p90 high-priority full response (queue+travel) plotted as a separate series per precinct, each call assigned by a spatial join of its latitude/longitude to the current PPB district boundaries; fire is citywide and not shown. Boundaries are held at their present definition across all years, so any historical redistricting is not reflected.

What to look for. East Portland is the slowest series in every year and rose the most in absolute terms, a divergence the citywide average masks. These per-precinct lines are not exposure-normalized — they show where the wait lands, not calls per capita.

What this shows. The collapse is not evenly shared. East Portland — the lower-income, most diverse precinct — is the slowest in every single year.

What to look for. The citywide average is a comforting fiction: it hides that the worst-served part of the city got left furthest behind. East didn't just stay slowest — it rose the most. An average is not neutral when the gap is the story.

p90 high-priority police response by precinct (mm:ss), fiscal year
FYCentralEastNorth
202012:4714:4515:45
202115:2020:5922:34
202220:3326:3327:09
202328:1349:4432:17
202433:3446:5634:30
202540:1146:3336:20
FY2020→FY2025 change: Central +214%, East +216%, North +131%. Full response incl. dispatch-queue wait. PPB only; boundaries verified stable 2019–25.
Chart 12#

In every precinct the dispatch queue — not travel — is the new wait

p90 high-priority police response split into travel + queue, by precinct and fiscal year

2026-07-01T16:31:41.313361 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ ’20 ’21 ’22 ’23 ’24 ’25 0 10 20 30 40 50 p90 high-priority response (minutes) Central ’20 ’21 ’22 ’23 ’24 ’25 East ’20 ’21 ’22 ’23 ’24 ’25 North Travel Dispatch-queue wait

What this shows. Each precinct's p90 response split into travel (blue, the drive) and dispatch-queue wait (orange, time before any unit is sent). Queue here is the derived penalty (full response minus travel), so each stacked bar sums to that precinct's p90 response.

What to look for. Travel barely moves anywhere — the growth is the orange queue segment in all three precincts, and it is deepest in East. The mechanism is the same citywide (no free car to send), but its weight lands hardest where response was already worst.

What this shows. Each precinct's p90 full response decomposed into travel (measured drive time) and queue, where queue is the derived remainder — full response minus travel — not an independently logged interval, so the two segments sum to that precinct's p90 by construction. Both are p90, high-priority.

What to look for. Travel is near-constant across precincts and years; the entire stacked-bar growth is the queue segment, deepest in East. Because queue is a residual, any error in the travel measurement loads onto it — read it as the dispatch-availability penalty, not a directly clocked wait.

What this shows. The slowdown has a cause, and it isn't traffic. Travel barely moved — what grew is the queue, the time before any unit is even sent.

What to look for. Same mechanism citywide — no free car to send — but its weight lands hardest in East, where response was already worst. This is a deployment failure, not a driving-distance problem, and it falls heaviest on those with the least.

FY2025 p90 response by component, by precinct (mm:ss)
PrecinctTravelDispatch-queue waitTotal response
Central13:3426:3740:11
East15:5130:4246:33
North17:2318:5736:20
Queue = full response − travel (a derived penalty; p90 components don't sum). Latest complete fiscal year.

Which calls — by priority tier

Chart 13#

Every priority of call now waits far longer — not just the urgent ones

p90 police response by call-priority tier (incl. dispatch-queue wait), citywide, FY2020–2025

2026-07-01T16:31:41.365847 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 50 100 150 200 p90 police response (minutes) 40:59 118:13 227:06 High priority Medium priority Low priority — longest wait

What this shows. Police p90 response — the full wait including the dispatch queue — drawn separately for each call-priority tier. High is priority 1–3 (the set the city publishes a response time for); Medium and Low are added here. Fire publishes only its high-priority metric, so it is not split by tier.

What to look for. The collapse is not confined to urgent calls. Every tier climbs steeply, and the lower the priority the longer the absolute wait — a low-priority call now takes the better part of an hour at the 90th percentile. The high-priority line (the one matched against fire) is the floor, not the whole story.

What this shows. Police p90 full response (queue+travel) split by call-priority tier: High is priority 1–3, the only band the city publishes a response time for, with Medium and Low reconstructed here from the same open data. Fire reports a single high-priority metric and is not tier-split, so no cross-bureau tier comparison is drawn.

What to look for. Every tier climbs steeply and the absolute wait lengthens as priority falls, with low-priority reaching the better part of an hour at p90. The published high-priority line is the floor; the lower tiers are added context, not official metrics, and none are exposure-normalized.

What this shows. The collapse is not confined to emergencies — every priority tier is climbing steeply. The number the city publishes is the best case, not the whole.

What to look for. A low-priority call now takes the better part of an hour at the 90th percentile. The high-priority figure matched against fire is the floor — the real experience of calling for help is worse than the headline admits.

p90 police response by priority tier (mm:ss), fiscal year
FYHighMediumLow
202014:3235:30103:35
202119:4673:44180:36
202224:3981:55175:03
202336:17110:00193:56
202438:01108:33192:12
202540:59118:13227:06
FY2020→FY2025 change: High +182%, Medium +233%, Low +119%. Full response incl. dispatch-queue wait. PPB only, citywide. High = priority 1–3, Medium = 4, Low = 5–9.
Chart 14#

The dispatch queue is the new wait at every priority level

p90 police response split into travel + queue, by priority tier and fiscal year

2026-07-01T16:31:41.449153 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ ’20 ’21 ’22 ’23 ’24 ’25 0 50 100 150 200 p90 police response (minutes) High priority ’20 ’21 ’22 ’23 ’24 ’25 Medium priority ’20 ’21 ’22 ’23 ’24 ’25 Low priority Travel Dispatch-queue wait

What this shows. Each tier's p90 response split into travel (blue, the drive) and dispatch-queue wait (orange, time before any unit is sent). Queue here is the derived penalty (full response minus travel), so each stacked bar sums to that tier's p90 response.

What to look for. Travel barely moves at any priority — the growth is the orange queue segment across all three tiers. The same mechanism (no free car to send) drives the delay whether the call is urgent or not.

What this shows. p90 (90th-percentile) response per priority tier, decomposed into measured travel and a derived queue penalty — full response minus travel — so the two segments sum to that tier's p90 by construction.

What to look for. Queue is not an independently logged field; it is the residual left after subtracting drive time, so it absorbs any dispatch-side latency. Across all three tiers travel stays near-flat while that residual grows.

What this shows. The drive isn't the problem — the wait before any car is even sent is, and it's growing at every priority.

What to look for. Urgent or not, Portlanders wait for the same reason: no free car to send. That is a staffing and deployment choice, not a map.

FY2025 p90 response by component, by priority tier (mm:ss)
TierTravelDispatch-queue waitTotal response
High priority15:4225:1740:59
Medium priority17:54100:19118:13
Low priority19:35207:31227:06
Queue = full response − travel (a derived penalty; p90 components don't sum). Latest complete fiscal year.
What are officers doing instead?4 charts

Everything above is reactive — 911-dispatched calls. This is the proactive half: officer-initiated stops (Oregon STOP Act), a separate clock never summed with dispatched calls. The Portland echo of the Catalyst California finding — proactive effort flows to traffic, not the violent crime the public calls about — with the caveat that Oregon records no stop duration, so these are counts and shares, not officer-hours.

Chart 16#

Who gets stopped has shifted — White share down, Black & Hispanic share up

Share of PPB officer-initiated driver stops by perceived race, 2015–2024

2026-07-01T16:31:41.515276 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2016 2018 2020 2022 2024 0 10 20 30 40 50 60 70 share of officer-initiated stops (%) 57% 18% 16% 5% 2% 1% 1% White Black/African American Hispanic or Latino Asian Middle Eastern Native Hawaiian American Indian/Alaskan

What this shows. The share of PPB officer-initiated driver stops going to each perceived-race group, every year 2015–2024. These are proactive stops (the officer chose to initiate them under Oregon's STOP Act) — a different universe from the 911-dispatched calls in the rest of this report. Share, not count: each year's bars are of that year's stop total.

What to look for. White drivers' share falls from ~70% to ~57% while the Black/African American share holds near 18% and the Hispanic/Latino share more than doubles (8%→16%) — both well above their population share. The report cannot reproduce California's officer-hours figure (Oregon records no stop duration), so this is composition, not time.

What this shows. Perceived-race composition of officer-initiated driver stops (Oregon STOP Act / HB 2355), share-of-year, 2015–2024, from the one stable multi-year cross-tab PPB republishes (validated column-by-column against each report's printed division totals). Denominator is that year's stops, not population; reference lines are ACS 2020–24 city shares.

What to look for. Share ≠ stop rate (no per-capita exposure denominator) and ≠ officer-hours: Oregon records no stop duration, unlike California RIPA, so the Catalyst "officer-hours" calc is not reproducible. Reason taxonomy shifts across years, so a multi-year "why stopped" comparison is non-comparable and omitted. White ~70%→~57%; Black ~18% steady; Hispanic ~8%→~16%.

What this shows. As Portland police pulled back on the proactive stops they choose to make, the burden didn't lift evenly. White drivers' share of stops fell sharply; the Black and Hispanic shares held or doubled — both already above their share of the city.

What to look for. This is the discretionary half of policing — effort the bureau directs, not calls the public makes. Where that shrinking effort still lands is a choice. A thinner force is not a neutral force; who keeps getting stopped is the question this chart puts on the table.

Share of officer-initiated driver stops by perceived race (%), calendar year
CYWhiteBlack/African AmericanHispanic or LatinoAsianMiddle EasternNative HawaiianAmerican Indian/Alaskan
201569.8%13.2%7.6%4.7%0.3%
201668.1%13.4%8.2%5.0%0.3%
201766.1%16.6%8.3%4.5%0.3%
201864.2%17.6%9.3%5.0%0.8%0.4%0.5%
201965.2%17.2%9.9%5.0%1.4%0.8%0.5%
202065.4%17.1%10.6%4.6%1.2%0.7%0.4%
202163.9%17.9%11.4%4.3%1.3%0.7%0.4%
202261.9%18.9%12.4%3.7%1.5%0.9%0.6%
202358.6%18.9%14.4%5.1%1.8%0.9%0.4%
202456.8%18.1%16.3%5.4%2.1%0.8%0.6%
2015→2024. Perceived race as recorded by the officer; 'Unknown/Other' (retired June 2018) omitted from columns. Validated against each PPB Stops report's printed totals. Share, not count.
Chart 17#

Officers choose traffic stops; the public calls about disorder

Traffic as a share of officer-INITIATED stops vs community-dispatched calls

2026-07-01T16:31:41.558075 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ Officer-initiated stops Community-dispatched calls 0 20 40 60 80 100 share within each universe (%) 98% traffic 2% other 9% traffic 91% other Traffic Everything else

What this shows. Two side-by-side bars, each adding to 100% within its own universe: what officers chose to stop people for (left, PPB Stops 2024) vs what the public called about (right, Dispatched Calls). The bars are never summed — they have different denominators and different clocks.

What to look for. Nearly all proactive stops — ~98% — cite only a traffic offense, while traffic is under a tenth of what the community dispatches police to. This is the Portland echo of the Catalyst California finding: officer-initiated police effort flows overwhelmingly to traffic enforcement, not to the violent crime the public most associates with policing.

What this shows. Two within-universe share distributions, each normalized to 100% of its own denominator: officer-initiated stops by reason cited (PPB Stops 2024) versus dispatched calls by group. Different denominators, different clocks — never summed.

What to look for. These are shares of counts, not officer-hours: neither stops nor calls carry a time-on-task field, so the ~98% describes the mix of proactive stops, not time spent. It is the Portland echo of Catalyst California's finding, not a reproduction of its officer-hours calc.

What this shows. Almost everything police choose to initiate is a traffic stop — while traffic is a sliver of what the public actually calls them for.

What to look for. The discretionary half of policing — ~98% traffic — points where the bureau sends itself, not where the community asks it to go. That deployment choice is the budget debate.

Traffic as a share of each universe — never summed
UniverseTrafficEverything else
Officer-initiated stops (proactive)98.1%1.9%
Community-dispatched calls (reactive)8.7%91.3%
Stops: PPB Stops Data Collection 2024 (traffic-offense-only vs other-crime). Calls: PPB Dispatched Calls CY2025 (FinalCallGroup). Different denominators, different clocks; neither is time-on-task.
Chart 18#

Most calls police are dispatched to are disorder — not violent crime

Composition of dispatched demand by call group, share of all calls

2026-07-01T16:31:41.620087 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2019 2020 2021 2022 2023 2024 2025 0 20 40 60 80 100 share of dispatched calls (%) Disorder 45% Crime 28% Traffic 9% Disorder Crime Traffic Alarm Civil Assist Other Community Policing

What this shows. The composition of dispatched demand — community-initiated 911/non-emergency calls — by call group, as a share of all calls per year. This is the reactive universe: what Portlanders call police about.

What to look for. Disorder/quality-of-life calls are the largest bucket (~46%), with Crime next; Traffic is a small slice (~8%). This is call mix, not time on task (the data carries no time-on-scene field) — so it shows what police are asked to handle, which is mostly not violent crime.

What this shows. Per-year share-of-all-calls composition of dispatched, community-initiated 911/non-emergency demand by call group — the reactive universe, normalized within each year.

What to look for. These are shares of call counts, not time on scene: the data carries no time-on-scene field, so ~46% disorder and ~8% traffic describe demand mix, not workload hours. It captures what police are asked to handle, not how long each takes.

What this shows. What Portlanders actually call police about is mostly disorder and quality-of-life — not the violent crime that dominates the policing debate.

What to look for. Traffic is just ~8% of community demand. The public sets this agenda, and it looks nothing like where proactive effort goes.

Dispatched-call composition by group, CY2025
Call groupCallsShare
Disorder94,93545.5%
Crime58,23127.9%
Traffic18,1048.7%
Alarm12,1245.8%
Other10,2194.9%
Civil8,3494.0%
Assist6,5453.1%
Community Policing2330.1%
Community-initiated dispatched demand (call mix, not time allocation). FinalCallGroup field, PPB Dispatched Calls open data.
Chart 21#

Two different jobs: what the public calls about vs what officers go looking for

Share of dispatched calls by type vs officer-initiated stops by reason, 2024

2026-07-01T16:31:41.676219 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 47% 28% 8% 7% dispatched 911 / non-emergency calls What the public calls about 98% officer-initiated stops, by reason cited What officers go looking for Traffic offense Other crime Disorder Crime Traffic Alarm Civil Other Assist Community Policing

What this shows. The two universes side by side, as a single 2024 snapshot: the full category mix of dispatched calls (left) against officer-initiated stops by reason cited (right). Traffic is the same colour in both, so the eye carries from the thin call slice to the near-whole stop circle. Two different denominators — never summed.

What to look for. What the public calls about is diverse — disorder 47%, crime 28%, traffic only ~8%. What officers initiate is monolithic — ~98% of stops cite a traffic offense. The same Traffic wedge that is a sliver of community demand is essentially the entire proactive workload.

What this shows. A single 2024 snapshot pairing two within-universe distributions: dispatched calls by category (left) and officer-initiated stops by reason cited (right), each summing to 100% of its own denominator — never combined.

What to look for. Both are shares of counts, not time: with no time-on-task field, traffic at ~8% of calls versus ~98% of stops contrasts demand mix against proactive mix, not hours. The shared Traffic colour guides the eye, but the two circles keep separate denominators.

What this shows. Side by side the contrast is stark: community demand is diverse, but what police choose to initiate is almost entirely traffic.

What to look for. The same Traffic wedge that is only ~8% of what the public calls about is ~98% of proactive stops. The bureau's discretionary effort doesn't mirror the city's actual needs.

Dispatched-call mix vs officer-initiated stop mix, 2024
CategoryCountShare of its universe
What the public calls about (dispatched)
  Disorder92,47346.5%
  Crime54,66727.5%
  Traffic16,1728.1%
  Alarm13,7886.9%
  Civil7,8043.9%
  Other7,4453.7%
  Assist6,1453.1%
  Community Policing1780.1%
What officers initiate (stops, by reason)
  Traffic offense23,71798.1%
  Other crime4501.9%
Two separate universes, never summed. Calls: PPB Dispatched Calls (RegJIN) CY2024, FinalCallGroup. Stops: PPB Stops Data Collection 2024, REASON cited (traffic-offense-only vs other-crime) — not filing division.
Is absenteeism part of it?1 chart

A standing share of overtime exists purely to backfill absent officers — the closest public proxy for absenteeism, since Oregon publishes no per-officer sick-leave series. The slowdowns land against falling calls and a force too thin to cover its own shifts.

Chart 20#

About 1 in 4 police overtime hours just covers an absent officer

Sworn overtime worked to backfill absent members, vs all sworn overtime, 2020–2025

2026-07-01T16:31:41.736018 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 5 10 15 20 25 30 sworn overtime (thousands of hours) 26% 6.1k 20% 4.1k 23% 5.1k 28% 6.9k 26% 7.0k 22% 6.4k All sworn overtime Backfilling absent officers

What this shows. How much overtime exists purely to cover absent officers. Each bar is all sworn overtime for the year (grey); the orange chunk is the City overtime dashboard's own “Backfill” flag — “working a shift for a member who is absent.” Oregon publishes no per-officer sick-leave series, so backfill overtime is the closest measurable absenteeism proxy — it counts the hours absence forces onto someone else.

What to look for. Backfill holds at ~a quarter of all sworn overtime, year after year — a flat share, not a worsening spike, but a chronic one. Whatever the cause of the absences, the bureau routinely pays overtime to cover shifts an absent member left open rather than fielding a force that can cover itself — a standing deployment cost, not a demand problem.

What this shows. Annual sworn overtime, with the City overtime dashboard's own "Backfill" flag — overtime 'working a shift for a member who is absent' — broken out as a share of the yearly total.

What to look for. This is a proxy, not a direct measure: Oregon publishes no per-officer sick-leave series, so backfill overtime stands in for absenteeism and may under- or over-count it depending on how shifts are coded. The share holds near ~a quarter of all sworn overtime across years.

What this shows. Roughly a quarter of all police overtime exists for one reason: to cover officers who didn't show.

What to look for. Year after year the bureau pays extra to backfill absent members rather than field a force that can cover itself — a standing deployment cost, not a demand problem.

Sworn overtime — total vs absence backfill, by calendar year (hours)
CYAll sworn OTBackfill (absent-cover)Backfill share
202023,8376,11025.6%
202119,8204,07120.5%
202222,1295,09923.0%
202324,6756,85627.8%
202426,6187,01726.4%
202529,0136,42722.2%
2020→2025. City of Portland Police Overtime dashboard (PPB open data), sworn ranks only. 'Backfill' = the dataset's own flag for working a shift for an absent member. Work Hours (actual), not pay-multiplied.
Alternate chart presentations3 charts

Alternate presentations of the cost-per-call chart — same data as the report above, kept for internal review and design comparison.

Alternate view#

Portland police: costly and slow

Police cost per call (up) and high-priority response time (down), 2020 through 2025

2026-07-01T16:31:41.788786 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 0 250 500 750 1000 1250 1500 cost per police call ($) $969 $1,025 $1,039 $1,170 $1,348 $1,387 2020 2021 2022 2023 2024 2025 0 10 20 30 40 high-priority response (min) 15 min 20 min 25 min 36 min 38 min 41 min longer bar = slower response

Mirror (bars): cost rises above the centre line, response time falls below it — both grow away from centre.

Alternate view#

Portland police: costly and slow

Police cost per call and high-priority response time, side by side, 2020 through 2025

2026-07-01T16:31:41.857312 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 2020 2021 2022 2023 2024 2025 0 200 400 600 800 1000 1200 1400 1600 cost per police call ($) $969 $1,025 $1,039 $1,170 $1,348 $1,387 Cost per call ($, left) Response time (min, right) 0 10 20 30 40 50 high-priority response (min) 15 20 25 36 38 41

Dual axis with side-by-side labeled bars — no line over the chart.

Alternate view#

Portland police: costly and slow

Police cost per call (up) and high-priority response time (down), shaded — 2020 through 2025

2026-07-01T16:31:41.911698 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 0 250 500 750 1000 1250 1500 cost per police call ($) $969 $1,025 $1,039 $1,170 $1,348 $1,387 2020 2021 2022 2023 2024 2025 0 10 20 30 40 high-priority response (min) 15 min 20 min 25 min 36 min 38 min 41 min deeper fill = slower response

Mirror as shaded areas — the same read as the bar mirror with less ink.

Sources — every figure traces back to the original data#

This report asserts nothing it can’t show you. Every dataset below is the City of Portland’s own published record (or the U.S. Census) — click through to check any number yourself. Charts that combine or re-cut these (e.g. the dispatch-queue split, or the overtime “Backfill” proxy) describe exactly how in each chart’s caption and the methodology notes.

Raw data artifacts & checksums — the 41 source files behind this report (249 MB)

Every chart is built from these original files, exactly as published by the City (or the U.S. Census). Each filename is a direct download of the source artifact we hold; the SHA-256 fingerprint lets you confirm, byte-for-byte, that it matches the copy published by the source (linked above) — so nothing here is taken on trust. Nothing is re-processed or hand-edited. Checksums regenerated 2026-07-01.

PPB Dispatched Calls (open data)

FileCoversFetchedSizeSHA-256
DispatchedCalls_OpenData_2019_0.xlsx20192026-06-0128.2 MBdd8aa1404d08…
DispatchedCalls_OpenData_2020_2.xlsx20202026-06-0125.6 MB39990ba2ab62…
DispatchedCalls_OpenData_2021_1.xlsx20212026-06-0126.1 MB3d01e48cdaf4…
DispatchedCalls_OpenData_2022.xlsx20222026-06-0129.4 MBe720acebe74d…
DispatchedCalls_OpenData_2023_1.xlsx20232026-06-0123.8 MBb3c7904d16e5…
DispatchedCalls_OpenData_2024_1.xlsx20242026-06-0123.1 MB4c27c0e31220…
DispatchedCalls_OpenData_2025.xlsx20252026-06-0124.2 MBa86493b44224…
DispatchedCalls_OpenData_2026.xlsx20262026-06-0110.3 MBcae8e3eb85b8…

PPB/TAC “Overview of Police Work in Portland” (2021)

FileCoversFetchedSizeSHA-256
ppb_tac_police_context_2021.pdf2015-20202026-06-261.4 MBe5023864636c…

PPB Stops Data Collection

FileCoversFetchedSizeSHA-256
ppb_stops_2013.pdf20132026-06-23721 KBc5e05113bbdd…
ppb_stops_2014.pdf20142026-06-231.7 MB9328db063758…
ppb_stops_2015.pdf20152026-06-23504 KBf2ea01a34d37…
ppb_stops_2016.pdf20162026-06-23959 KB30e57cdbcbf2…
ppb_stops_2017.pdf20172026-06-231.1 MB50ee7baf6b02…
ppb_stops_2018.pdf20182026-06-231.7 MB88e97e47732a…
ppb_stops_2019.pdf20192026-06-231.7 MBcf58a7fe3bf3…
ppb_stops_2020.pdf20202026-06-231.4 MB9b829e3dd31a…
ppb_stops_2021.pdf20212026-06-231.6 MB964346db994a…
ppb_stops_2022.pdf20222026-06-231.7 MBa803b368dd33…
ppb_stops_2023.pdf20232026-06-231.4 MBaa35d0559a09…
ppb_stops_2024.pdf20242026-06-231.4 MB23a181ce04df…

PPB Police Overtime dashboard

FileCoversFetchedSizeSHA-256
staffing/ppb_overtime_raw.csv2026-06-234.4 MB3d93848a9162…

PF&R Annual Performance Reports

FileCoversFetchedSizeSHA-256
pfr_apr_2018-2019.pdfFY2018-20192026-06-011.0 MBe934a88aad5c…
pfr_apr_2019-2020.pdfFY2019-20202026-06-013.4 MB4b38d5e2fcb2…
pfr_apr_2020-2021.pdfFY2020-20212026-06-011.5 MB20c8a564562c…
pfr_apr_2021-2022.pdfFY2021-20222026-06-013.1 MBa8fb9b5df922…
pfr_apr_2022-2023.pdfFY2022-20232026-06-014.0 MB48253f908f75…
pfr_apr_2023-2024.pdfFY2023-20242026-06-011.6 MBed7a4b132af3…
pfr_apr_2024-2025.pdfFY2024-20252026-06-011.6 MBcb40cda6039e…
pfr_apr_2024-2025_v0.pdfFY2024-20252026-06-011.6 MB56f2d8052a5d…

City of Portland adopted budgets (City Budget Office)

FileCoversFetchedSizeSHA-256
staffing/cbo_police_analysis.pdf2026-06-01365 KBf1efe37ec9e0…
staffing/cbo_police_fy2023-24_analysis.pdf2026-07-011.1 MBe176b3e7cf13…

other

FileCoversFetchedSizeSHA-256
staffing/katu_staffing_investigation_2024.html2026-07-01364 KB8d015b531d6e…
staffing/ppb_2024_annual_report.pdf2026-07-017.4 MBd9aae6684d69…
staffing/ppb_2025_annual_report_draft.pdf2026-07-017.7 MBa580ffbef4b5…
staffing/ppb_filled_fox_2021.html2026-07-01111 KBdef5dad64b93…
staffing/ppb_filled_kgw_2019.html2026-07-01106 KB89f697db55cb…
staffing/ppb_filled_kgw_2022.html2026-07-01244 KB7a11c3b24f31…
staffing/ppb_fy2023-24_requested_budget.pdf2026-07-011.4 MBd14fc83a07ca…
staffing/ppb_staffing_report.html2026-07-0166 KBb66028c983c1…
staffing/ppb_staffing_report_20231109.html2026-07-01115 KB531206b7aa14…