AI Adoption GuideHealthcareAccess
No-show demand forecasting
Predictive model scores no-show probability per appointment slot and triggers overbooking or waitlist fill to minimize idle capacity.
Healthcare processAccessIntakeAssessDiagnoseTreatDischargeBillFollowup
By Don, DoneThat’s AI coach · updated
A cited score, not a fill rate
A usable no-show forecast for an ambulatory slot is a probability attached to that slot, with a history vintage and a named factor. It is not a clinic-wide percent you paste into the template. It is not a roster. Empty stays empty when the slot has no history you can cite.
Operations managers need that distinction because idle capacity and double-booking both have costs. Overbooking a slot that was never going to go empty wastes staff time and patient goodwill. The model can flag which slots look fragile. It cannot decide who sits in the chair.
The quality bar is simple. If you cannot point to the slot, the vintage of the history used, and the factor that moved the score, you do not have a forecast you can act on. Numbers without cites get treated as policy, and policy written from an unexplained score is how clinics invent a no-show rate for a service that never ran.
Scheduling platforms in this class (Epic, athenahealth, Microsoft, Oracle Health) already hold the series, the slot grid, and the arrival history. The forecast sits on top of that record. It does not replace the record.
Lock the appointment series before scoring
Score nothing until the appointment series is locked. A series that is still being edited (provider swap, duration change, location move, template rewrite) will attach yesterday's history to tomorrow's grid. The cite then lies even if the math is honest.
Locking means the operations manager freezes provider, location, visit type, duration, and open or closed status for the window you intend to forecast. After that freeze, extract the series as it will actually run. If a Thursday 2:00 p.m. new-patient slot is 40 minutes with Dr. Hale at the west clinic, that is the object you score. If someone later splits it into two 20-minute returns, throw the old scores out. Do not remap them.
Adjacent access work can contaminate the series. A conversational scheduling agent that still has permission to rewrite slots will keep moving the grid under the forecast. Pause agent writes for the locked window, or treat every agent edit as a reason to rescore. Smart referral matching can change visit type or duration when a referral lands; those changes reopen the lock.
Eligibility is not a no-show factor until it is a kept or broken appointment. Run real-time eligibility verification as its own check. Do not fold an unverified coverage flag into the no-show cite.
Score with vintage and factor, or leave the slot blank
For each locked slot, the model returns one of two things: a score with cites, or a blank.
A scored slot names three things. The slot identity: date, time, provider, location, visit type. The history vintage: the date range and the population the history came from (same provider and visit type, same weekday and time band, same site). The factor that actually moved this slot: first visit, long lead time, Monday after a holiday, a late-cancel pattern on this template. If any of those three is missing, the output is not a quality score. Treat it as blank.
A blank slot is not a zero, a clinic average, or last year's enterprise no-show percent. It is an admission that this slot has no history you are willing to cite. New templates, new providers, new sites, and visit types that just opened should stay blank until they accumulate their own series.
West clinic opens a Saturday morning sports-physical block that has never run before. The weekday afternoon grid has a long, dated history for the same providers and visit types. Scoring Saturday from weekday afternoon history would produce a number. It would not produce a cite that matches the slot. Leave Saturday blank. The scheduler can still open a short waitlist for those hours as a staffing decision, not as a model output.
When history exists, keep the vintage visible next to the score. A factor that was true in a winter respiratory surge is not automatically true in July. If the vintage is stale relative to the schedule you are filling, blank the score and rescore after you refresh history. A score with no vintage is a failure mode, not a convenience.
Do not invent a rate for a new clinic. A satellite that just opened does not inherit the flagship's no-show behavior just because they share an EHR. Shared software is not shared history.
The scheduler still overbooks or fills the waitlist
The forecast does not fill the chair. A scheduler still overbooks or pulls from the waitlist.
For scored slots, the operations play stays human. Fragile, well-cited slots go to a waitlist fill or a limited overbook under local policy: same visit type, same duration, same provider when possible, and a named backup if the original patient arrives. Blank slots do not get an overbook justified by the model. If you overbook a blank slot, you are guessing, and you should label it as a guess in the day's notes.
Treating the score as the roster is a failure mode. A probability is not a patient name. Do not auto-cancel the original appointment because the score is high. Do not auto-place a waitlist patient into the chair because the score is high. Confirmations, reminders, and day-of arrival still belong to the desk. The score only marks which hours need extra attention.
Write the overbook rules: extra patients per session, which visit types may share a slot, who may exceed the cap, and what happens if both patients arrive. None of that is the model's job. If a scheduling screen can show the score next to the slot, use the display. Do not wire it to an automatic fill.
Acuity belongs in a different stream. Acuity risk stratification at intake may tell you who should not wait. It does not tell you who will not show. Mixing those two scores produces a roster that looks optimized and is clinically unsafe.
Failure modes that look like a forecast
A score with no vintage. Someone published a probability and skipped the date range and the population. Staff will treat it as current. It may be last year's flu season, a different site, or a different visit type. Require vintage on the same row as the score. If vintage is absent, the cell is blank, even if a number was generated.
Treating the score as the roster. The grid starts to fill itself. Original patients get quiet cancellations; waitlist patients get auto-booked. When the original patient arrives, there is no chair and no script. Keep the original appointment until a human releases it. Keep the waitlist as a list until a human places someone.
Inventing a rate for a new clinic. The new site has empty history. Someone copies a percent from the flagship or from a vendor dashboard that rolled up the whole enterprise. That percent then becomes the overbook rule. Stop. Report that the site has no citable history. Use a manual waitlist only until the series has its own vintage.
If the series lock broke after scoring, the cites are void. Rescore or blank. Do not keep yesterday's vintage on today's rewritten grid.
Where this score stops
No-show forecasting is an access tool for idle capacity. It does not schedule conversations, match referrals, verify coverage, or triage acuity. Those workflows can feed a cleaner series, which makes history more trustworthy. They are not substitutes for a cited slot score.
The desk rule is one paragraph: lock the series, score with slot plus vintage plus factor, leave blanks empty, and let a scheduler overbook or fill the waitlist. If a vendor screen cannot show those three cites, do not use that screen as the daily board, whether the logo is Epic, athenahealth, Microsoft, or Oracle Health.
The outcome you want is quality of the score. Empty chairs still get filled by people who can see the original patient, the waitlist, and the room.
Is this worth automating for you?
Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.
DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.
Measure the baseline first