Why Emergency Departments Back Up Long Before the Hospital Looks Full

For operations, capacity and emergency leaders: why a hospital that reports 85% occupancy still boards admitted patients, and the four numbers that show the problem before the emergency department does.
Ask a hospital how full it is and you will usually get one number: the midnight census divided by beds. At 85%, that number says there is room, roughly one bed in seven empty. At 1 p.m. the same day, admitted patients are lying on stretchers in the emergency department hallway waiting for a bed upstairs. Both facts are true. The midnight number is taken at the wrong hour, against the wrong beds, across a pool of beds that no emergency patient can actually draw from.
Episode 4 of How AI and ML Will Save Lives in Healthcare showed that a hospital is a queue, and that waiting for a bed rises steeply once occupancy passes about 85%. This companion piece takes the next step. That 85% rule assumes one large pool of beds, measured around the clock, with patients arriving and leaving at random. Real hospitals break all three assumptions, and each break moves the cliff to the left.
What follows is a simple way to measure the occupancy the emergency department actually sees, the queueing math for why small units fill first, an hourly simulation in Python where a medicine service reads 85.9% at midnight and is completely full about three hours a day, and the four numbers worth putting on a capacity dashboard instead of the midnight census.
The occupancy the emergency department sees
The number on most capacity reports is one ratio: patients in a bed at midnight, divided by beds, across the whole hospital. An emergency patient waiting for a bed never experiences that ratio. They experience one unit, at one hour, with the beds that unit can staff and has cleaned. As a proposed working definition:
\rho_{\text{ED}}(u, t) = \frac{\text{census}_u(t)}{\text{ready}_u(t)} \qquad \text{versus} \qquad \rho_{\text{reported}} = \frac{\text{census}(00{:}00)}{\text{beds}}Here u is the unit the patient needs (medicine, telemetry, step-down), t is the hour of day, census is the number of occupied beds on that unit at that hour, and ready is the number of beds on that unit that are staffed and clean at that hour. The gap between the two ratios comes from four questions the reported number never asks: which beds, which hour, which unit and which day.
The first gap is pure arithmetic. A hospital licensed for 350 beds that can staff 300 and has 255 patients at midnight is 72.9% full against licensed beds and 85.0% full against staffed beds. Both numbers get reported. Only the second one is real for a patient waiting downstairs. Nationally, this gap is what moved the average: a 2025 JAMA Network Open study led by UCLA researchers found US hospital occupancy rose from about 64% before the pandemic to 75% afterward, and attributed most of the rise to a 16% drop in staffed beds rather than more hospitalizations. The same model projects average occupancy of 85% by 2032 if nothing changes.
An average of 75% means plenty of individual hospitals already sit above 85% on an ordinary day. The other three gaps, hour, unit and day, are where the rest of this piece lives.
Boarding is now the ordinary case
Boarding means an admitted patient is still in the emergency department because no inpatient bed is ready. National standards say no one should board more than four hours. A 2025 Health Affairs study of about 46 million admissions from Epic Cosmos data at roughly 1,500 hospitals found that more than 25% of admitted emergency patients waited four hours or more in non-peak months of 2022 to 2024, and about 35% in winter. Even the best months of 2024 were worse than the worst months of 2017 to 2019.
The wait is not just uncomfortable. In a study of 41,256 admissions at one US academic hospital, Singer and colleagues found in-hospital mortality of 2.5% for patients boarded under two hours and 4.5% for those boarded twelve hours or more, and average inpatient stays of 5.6 days versus 8.7 days for those boarded more than a day. That study is observational, so sicker patients may wait longer for reasons the data cannot fully separate, but the direction matches the much larger English data covered in Episode 4.
Boarding is also about to become a reported number. In the calendar year 2026 outpatient payment rule, CMS adopted an Emergency Care Access and Timeliness measure for the Hospital Outpatient Quality Reporting program. Reporting is voluntary from January 1, 2027 and required from January 1, 2028. As specified, a visit counts against the hospital if the patient waited more than 60 minutes for a treatment space, left without being seen, boarded more than four hours, or spent more than eight hours in the emergency department. Hospitals that track only midnight occupancy will be explaining a number they cannot see coming.
Which unit: small pools fill first
A hospital’s beds are not one pool. A cardiac patient goes to telemetry, a patient after hip surgery to orthopedics, an infectious patient to an isolation room. Each unit is its own queue, and a queue with fewer servers needs more slack to give the same service. Apply the Erlang C formula from Episode 4 to units of different sizes, all at the same 85% occupancy, and the chance that an arriving patient finds no bed changes by two orders of magnitude: 0.4% for a single 300-bed pool, 5.3% for 120 beds, 15.5% for 60, 29.6% for 30 and 38.5% for 20.
[embed: node/93c00d67–9785]
The wait among those who do wait changes just as much. Under the same model, with an average stay of 4.8 days, a patient who waits in the pooled 300-bed hospital waits about 2.6 hours on average. A patient who waits for one 30-bed unit waits about 25.6 hours. Real hospitals do not let that happen. They place the patient on whatever unit has a bed, as an off-service or outlier patient, which trades a queue in the emergency department for care on a unit whose nurses and physicians are not specialized for that patient.
This is not a new finding. In a 2002 paper in Inquiry, Linda Green of Columbia used New York State data and queueing analysis to estimate that as many as 90% of intensive care units and 40% of obstetrics units lacked the capacity to give a patient an appropriate bed when needed, and argued that a single average occupancy target was the wrong guide for planning.
Averages also hide the hot unit. Take ten 30-bed units that average exactly 85%: four medicine units at 95%, two telemetry units at 90% and four surgical units at 72.5%. The hospital reports 85%. A patient arriving on a medicine unit finds it full 70.5% of the time, telemetry 47.1%, surgery 6.5%. Weighting each unit by its admissions (assuming similar stays on every unit), 43.7% of all arrivals find their unit full. Emergency admissions skew toward medicine, so the emergency department’s experience is closer to the 70% figure than to the hospital average.
from math import lgamma, log, exp
def erlang_c(beds: int, load: float) -> float:
"""Probability an arriving patient finds every bed taken (M/M/c).
load = admissions per day x average stay in days (occupied beds on average)."""
if load >= beds:
return 1.0
terms = [k * log(load) - lgamma(k + 1) for k in range(beds)]
tail = beds * log(load) - lgamma(beds + 1) + log(beds / (beds - load))
m = max(terms + [tail])
s = sum(exp(t - m) for t in terms)
return exp(tail - m) / (s + exp(tail - m))
def wait_if_waiting_hours(beds: int, occupancy: float, los_days: float = 4.8) -> float:
"""Mean wait in hours for patients who wait at all: 1 / (c*mu - lambda)."""
mu = 1 / los_days
return 24 / (beds * mu - occupancy * beds * mu)
if __name__ == "__main__":
for beds in (300, 120, 60, 30, 20):
p = erlang_c(beds, 0.85 * beds)
print(f"{beds:>3} beds at 85%: P(wait) = {p:.1%}, "
f"wait if waiting = {wait_if_waiting_hours(beds, 0.85):.1f} h")
# Ten 30-bed units that average 85%
units = [0.95] * 4 + [0.90] * 2 + [0.725] * 4
p_full = [erlang_c(30, r * 30) for r in units]
weighted = sum(p * r for p, r in zip(p_full, units)) / sum(units)
print(f"hospital average {sum(units) / len(units):.0%}, "
f"share of arrivals finding their unit full {weighted:.1%}")The code works in logarithms because factorials of a few hundred overflow ordinary floating point. Run it with your own unit sizes and occupancies, by unit, before trusting any hospital-wide figure.
Which hour: midnight counts the quietest part of the day
The midnight census is an accounting convention, and it happens to be taken near the daily low. A study at a large children’s hospital by Fieldston and colleagues found that midnight occupancy sat closer to the daily minimum than to the peak, that occupancy usually peaked between 10 a.m. and noon, and that the peak ran an average of 4 percentage points above midnight and as much as 13 points on some days. A 5.5-year analysis of a Queensland hospital by Riahi and colleagues reached the same practical conclusion and recommended an hourly occupancy rate for capacity planning.
The mechanism is a timing mismatch. Patients who will go home today still hold their beds through the morning, waiting for rounds, a final test, a ride or a prescription. Scheduled and direct admissions arrive around 8 a.m. Discharges cluster in mid-afternoon; Powell and colleagues used 3 p.m. as the baseline peak in their 2012 boarding model. Emergency admission decisions climb from late morning to a mid-afternoon high. For several hours a day, beds are needed before they are released.
To see how much that matters with everything else held still, the simulation below models one 120-bed adult medicine service: about 18 emergency admissions a day with decisions peaking mid-afternoon, 4 scheduled admissions each weekday morning, an average stay of 4.8 days, discharges peaking at 3 p.m., one hour to turn over a bed, and 40% of weekend discharges slipping a day. It is a proposed toy model for intuition, not calibrated to any real hospital.
"""Hourly bed simulation for one 120-bed adult medicine service.
A proposed toy model for intuition, not calibrated to any real hospital."""
import heapq
import numpy as np
H = np.arange(24)
def bump(center, width):
"""A smooth daily peak around `center` o'clock, as probabilities over 24 hours."""
d = np.minimum(abs(H - center), 24 - abs(H - center))
w = np.exp(-0.5 * (d / width) ** 2)
return w / w.sum()
ED_DECISIONS = 0.85 * bump(15, 4.0) + 0.15 / 24 # admit decisions peak mid-afternoon
ELECTIVE = bump(8, 1.0) # scheduled and direct admits, weekday mornings
def simulate(beds=120, ed_per_day=18.0, elective_per_weekday=4.0, los_mean=4.8,
discharge_peak=15, weekend_defer=0.4, turnaround_h=1.0,
days=3 * 364, warmup=56, seed=1):
rng = np.random.default_rng(seed)
dis_p = bump(discharge_peak, 1.8)
free, ready, queue = beds, [], [] # ready: heap of times a bed is clean again
occ = np.zeros((days, 24)); boarders = np.zeros((days, 24)); ed_waits = []
def book(start):
nights = max(1, int(round(rng.gamma(2.0, los_mean / 2.0))))
dday = int(start // 24) + nights
while dday % 7 in (5, 6) and rng.random() < weekend_defer: # day 0 is a Monday
dday += 1
heapq.heappush(ready, dday * 24 + rng.choice(24, p=dis_p) + rng.random() + turnaround_h)
for day in range(days):
arrivals = [(day * 24 + h + rng.random(), "ed")
for h in rng.choice(24, rng.poisson(ed_per_day), p=ED_DECISIONS)]
if day % 7 < 5:
arrivals += [(day * 24 + h + rng.random(), "el")
for h in rng.choice(24, rng.poisson(elective_per_weekday), p=ELECTIVE)]
arrivals.sort()
i = 0
for h in range(24):
t = day * 24 + h
while ready and ready[0] < t + 1:
heapq.heappop(ready); free += 1
while i < len(arrivals) and arrivals[i][0] < t + 1:
queue.append(arrivals[i]); i += 1
while free and queue: # first come, first served
t_arr, kind = queue.pop(0); free -= 1
wait = max(0.0, t + 0.5 - t_arr)
if kind == "ed" and day >= warmup:
ed_waits.append(wait)
book(t_arr + wait)
occ[day, h] = (beds - free) / beds
boarders[day, h] = sum(k == "ed" for _, k in queue)
occ, boarders, w = occ[warmup:], boarders[warmup:], np.array(ed_waits)
return {"midnight": occ[:, 0].mean(), "daily_peak": occ.max(1).mean(),
"hours_full": (occ >= 0.999).sum(1).mean(),
"boarding_hours": boarders.sum(1).mean(), "wait4": (w >= 4).mean(),
"occ_by_hour": occ.mean(0)}
def average(n_seeds=8, **kw):
runs = [simulate(seed=s, **kw) for s in range(n_seeds)]
return {k: np.mean([r[k] for r in runs], axis=0) for k in runs[0]}
if __name__ == "__main__":
scenarios = {"Baseline: 3 p.m. discharge peak, weekend lull": {},
"Discharge peak moved to 11 a.m.": {"discharge_peak": 11},
"Weekend discharges match weekdays": {"weekend_defer": 0.0},
"Both": {"discharge_peak": 11, "weekend_defer": 0.0}}
for name, kw in scenarios.items():
r = average(**kw)
print(f"{name:48s} midnight {r['midnight']:.1%} daily peak {r['daily_peak']:.1%} "
f"hours full/day {r['hours_full']:.1f} ED boarding h/day {r['boarding_hours']:.0f} "
f"ED waits >= 4h {r['wait4']:.1%}")The baseline reads 85.9% at midnight, the classic safe number. Averaged by hour, occupancy climbs to 91.7% at 1 p.m.; the average day’s highest hour is 92.5%, and the service is completely full for about 3.0 hours a day. Emergency patients accumulate about 18 boarding hours a day, and 6.0% of emergency admissions wait four hours or more. None of that is visible at midnight.

Move the discharge peak to 11 a.m. and nothing about the midnight reading changes, because the same patients still spend the same nights in hospital. The afternoon is what changes.
Which day: the weekend discharge lull
The weekly cycle does to Monday what the daily cycle does to 1 p.m. Discharges fall at weekends because the people who complete them (attending physicians, case managers, pharmacists, post-acute facilities taking new residents) are thinner on the ground. In Irish HSE data from early 2023, hospitals discharged an average of 43 patients per weekday and 13.7 per weekend day. Patients who could have left on Saturday leave on Monday, and the beds they hold meet Monday’s surgical and emergency admissions.
Running the simulation with each fix separately and together shows how differently the two numbers move:
- Baseline (3 p.m. discharge peak, weekend lull): midnight 85.9%, average daily peak 92.5%, full 3.0 hours a day, 18 ED boarding hours a day, 6.0% of ED admissions waiting 4 hours or more.
- Discharge peak moved to 11 a.m.: midnight 85.9%, peak 89.9%, full 1.8 hours, 11 boarding hours, 3.6% waiting 4 hours or more.
- Weekend discharges match weekdays: midnight 83.9%, peak 90.9%, full 1.5 hours, 6 boarding hours, 2.1%.
- Both: midnight 83.9%, peak 87.8%, full 0.7 hours, 2 boarding hours, 0.9%.
Moving the discharge clock four hours earlier leaves midnight occupancy exactly where it was, 85.9%, and cuts boarding hours and four-hour waits by about 39%. A dashboard built on the midnight census would score that improvement as zero. Removing the weekend lull cuts boarding by about 68% while moving midnight occupancy just 2 points. Together, boarding falls by about 86%.
Published models agree on direction. Powell and colleagues found that moving the discharge peak from 3 p.m. to 2 p.m. cut daily boarding hours from 77.0 to 34.4 in their model, and that only a shift to 11 a.m. removed crowding. Khanna and colleagues, simulating 15 months of real patient flow at an Australian teaching hospital, found that discharging 80% of patients before 11 a.m. cut inpatient bed waits by about 25% and freed the equivalent of nine beds, while average occupancy fell only about 1.5%. In a two-year study published in the Emergency Medicine Journal, Mustafa and colleagues found that delayed discharges were significantly associated with the number of patients boarding in the emergency department.
Where forecasting and AI actually help
The math says what to predict. Not tomorrow’s midnight census, and not admissions alone: Episode 4’s simulation showed that predicting admissions at triage changes little when there is no bed to give earlier. What moves boarding is knowing, by unit and by hour, how many beds will be ready before the patients who need them arrive, early enough to change it.
That turns into one number a capacity huddle can act on at 7 a.m.: the expected spare beds on each unit at the afternoon peak, and the chance that an admitted patient is waiting. For unit u at hour t, with f free beds now, each current patient i carrying a probability pᵢ of having left and had the bed cleaned by t, and λ expected admissions before t:
E[S_u(t)] = f + \sum_i p_i - \lambda \qquad \operatorname{Var}[S_u(t)] = \sum_i p_i (1 - p_i) + \lambdaThe variance treats each discharge as an independent yes or no and arrivals as Poisson. Take a 30-bed medicine unit at 7 a.m. with 2 empty beds, 8 patients flagged as likely to go home today, and about 5 admissions expected by 1 p.m. The expected spare beds at 1 p.m. are 1.7, and the chance someone is waiting is about 19.7%. If the huddle firms up two of the coin-flip discharges, raising each from 0.5 to 0.9 by arranging the ride, the medications and the transport the evening before, expected spare beds rise to 2.5 and the chance of a wait falls to about 11.7%.
from math import sqrt
from statistics import NormalDist
def shortfall_risk(free_now: int, p_discharge: list[float], expected_arrivals: float) -> tuple[float, float]:
"""Expected spare beds at a future hour and the chance an admitted patient is waiting.
p_discharge: each current patient's probability of leaving (bed ready) by that hour.
Arrivals are treated as Poisson; discharges as independent Bernoulli trials."""
mean = free_now + sum(p_discharge) - expected_arrivals
var = sum(p * (1 - p) for p in p_discharge) + expected_arrivals
p_short = NormalDist(mean, sqrt(var)).cdf(-0.5) # continuity correction: at least one patient short
return mean, p_short
if __name__ == "__main__":
# 30-bed medicine unit at 7 a.m.: 2 empty beds, 8 patients flagged as likely to leave today,
# about 5 admissions expected between 7 a.m. and 1 p.m.
plans = {
"as planned": [0.9, 0.8, 0.7, 0.6, 0.5, 0.5, 0.4, 0.3],
# the huddle firms up two coin-flip discharges (ride, medications, transport arranged)
"after huddle": [0.9, 0.8, 0.7, 0.6, 0.9, 0.9, 0.4, 0.3],
}
for name, p_by_1pm in plans.items():
mean, p_short = shortfall_risk(2, p_by_1pm, 5.0)
print(f"{name:13s} expected spare beds at 1 p.m. {mean:.1f}, chance someone is waiting {p_short:.1%}")This is where machine learning earns its place. The pᵢ values are exactly what a discharge prediction model produces; Episode 4 covered Hartford HealthCare’s version, associated with stays 0.67 days shorter. The arrival term is a short-horizon forecast of emergency admissions by unit and hour, a well-studied forecasting problem. Neither needs a frontier model; both can start from data already in the electronic health record and the bed management system.
The prediction alone frees no beds. The evidence on what does is mixed, and worth reading honestly. Wertheimer and colleagues at NYU raised discharges before noon on two medical units from 11% to 38%. A multicenter study by Kirubarajan and colleagues found morning discharge was not meaningfully associated with shorter emergency department stays. The simulations above suggest one reason: small shifts in the discharge clock do little, and the gains arrive when most discharges move hours earlier, or when weekend discharges catch up with weekdays. A prediction that does not change who is ready at 10 a.m., or who leaves on Saturday, changes nothing the emergency department can feel.
Where it breaks
The Erlang C figures assume random arrivals, exponentially distributed stays and units that never share beds. Real units overflow into each other, which shortens waits and moves the cost into off-service care, so read the unit-size results as a statement about direction and scale, not a forecast for any unit. Pooling also has limits: specialized units exist because their nurses are trained for those patients, and flexing beds across units only works with cross-trained staff.
The hourly simulation is a proposed toy model. It has one service, first-come first-served placement, a fixed one-hour turnaround, no staffing changes by shift and a crude weekend rule. Its results are sensitive near the cliff: at 17.5 emergency admissions a day it reads 84.0% at midnight with about 9 boarding hours a day, and at 18.5 it reads 88.3% with about 26. That sensitivity is the point of the piece, but it also means the exact percentages should not be quoted for any real hospital.
The evidence has its own gaps. The mortality figures are observational, and sicker patients may wait longer for reasons the data cannot fully separate. The midnight-versus-peak finding comes from a single children’s hospital, and adult patterns may differ. The discharge-timing studies are mostly simulations or single-site before-and-after comparisons, and the one multicenter study found little effect from morning discharge alone. The shortfall formula treats discharges as independent, when in practice they move together: one late rounding team or one closed nursing home can delay several at once, which makes the real risk higher than the formula says. Finally, the CMS measure details above come from its published specification, and specifications can change before mandatory reporting begins.
The path forward
The practical change this quarter is to stop managing to the midnight census and start managing to the number the emergency department feels. That takes four numbers, all of which most hospitals can already compute from their bed management and admission, discharge and transfer data.
The first is peak-hour occupancy by unit, measured against staffed and clean beds rather than licensed beds hospital-wide. Pull hourly census by unit for the last 90 days and plot it the way the chart above does. If the 1 p.m. line on your medicine units sits five or more points above midnight, the midnight report has been flattering you.
The second is hours per day each unit spends completely full. Occupancy averages hide this; a unit that is full three hours a day is turning away patients three hours a day, whatever its average says. Run the Erlang code on each unit’s size and peak occupancy to see which units are on the cliff and which are carrying slack the hospital could share.
The third is the discharge clock, by unit: the median time a patient physically leaves, the share who leave before noon, and the ratio of weekend to weekday discharges. These are the levers the simulation shows matter most, and unlike beds, they can move within weeks.
The fourth is the share of admitted emergency patients boarding four hours or more, broken out by the hour the admission decision was made. That is close to what CMS will start collecting voluntarily in January 2027, and tracking it by hour shows whether the problem is the afternoon peak or something else.
Then pick one medicine unit and pilot the 7 a.m. shortfall number for a month: discharge probabilities from whatever model or nursing judgment you have today, expected admissions from the last eight weeks of the same weekday and hour, and one question for the huddle, which two discharges can we firm up before 11. The next episode of the series moves from beds to readmissions, on November 5. If your team runs these numbers on its own census, I would like to hear what the 1 p.m. line looks like.
About the Author

Brian James Curry is a Kansas City AI researcher, applied scientist and data scientist working in machine learning, causal inference and healthcare intelligence. He is the founder of Vector1 Labs, an independent applied AI research lab, where his Causal Care series applies causal machine learning to health system decisions: which programs work, for whom, and what they are worth. He also founded KC AI Lab, which began in 2016 as the Kansas City Machine Learning Group and has grown to more than 1,500 members.
He has more than twenty years of experience leading analytics, data science and machine learning at Hallmark, Garmin, Koch Industries, Tractor Supply Company and Vail Resorts. His open-source research tools on GitHub include PyCausalSim (causal discovery through simulation), Papilon (marketing mix modeling and complex systems) and tincast (forecasting for AI-critical commodities), along with MeaningFlow and Daedalus. A Kansas State University alum from a small Kansas farming town, he writes about agentic AI, causal inference, healthcare AI and the economics of AI on Medium and Substack. Contact: brian@vector1.ai.
Sources
- Leuchter R, Delarmente B, Vangala S, Tsugawa Y, Sarkisian C. National projections of US hospital occupancy. JAMA Network Open, 2025. UCLA press release via Newswise
- Janke A, Burke LG, Haimovich A. Hospital boarding of patients in the emergency department increasingly common, 2017 to 2024. Health Affairs, 2025. Michigan Medicine release via Newswise
- Singer AJ, Thode HC, Viccellio P, Pines JM. The association between length of emergency department boarding and mortality. Academic Emergency Medicine, 2011. Stony Brook record
- Centers for Medicare and Medicaid Services. Upcoming Emergency Care Access and Timeliness eCQM for the Hospital OQR Program. eCQI Resource Center. eCQI
- Centers for Medicare and Medicaid Services. Emergency Care Access and Timeliness, CMS1264v1 measure specification. eCQI
- American College of Emergency Physicians. Statement on CMS 2026 OPPS final rule and new emergency department boarding measure, November 21, 2025. ACEP
- Green LV. How many hospital beds? Inquiry, 2002. Columbia Business School
- Fieldston ES, Ragavan M, Jayaraman B, Metlay J, Pati S. Traditional measures of hospital utilization may not accurately reflect dynamic patient demand: findings from a children’s hospital. PolicyLab, Children’s Hospital of Philadelphia
- Riahi V, Boyle J, Hassanzadeh H, et al. Do midnight censuses accurately portray hospital bed occupancy? Studies in Health Technology and Informatics. IOS Press
- Society of Hospital Medicine. Discharge before noon, summarizing Powell et al. (Journal of Emergency Medicine, 2012), Wertheimer et al. (Journal of Hospital Medicine, 2014) and Kirubarajan et al. (Journal of Hospital Medicine, 2021). SHM
- Khanna S, Sier D, Boyle J, Zeitz K. Discharge timeliness and its impact on hospital crowding and emergency department flow performance. Emergency Medicine Australasia, 2016. Griffith University
- Mustafa F, Gilligan P, Obu D, et al. Delayed discharges and boarders: a 2-year study of the relationship between patients experiencing delayed discharges from an acute hospital and boarding of admitted patients in a crowded ED. Emergency Medicine Journal, 2016. Journal club summary
- Irish Times. Hospitals discharge three times as many patients during week as at weekends, data shows, June 1, 2023 (HSE data). Irish Times
- Curry BJ. How AI and ML Will Save Lives in Healthcare, Episode 4. Vector1 Research


