Urgent Care Staffing: Forecast Volume and Build Rotas With AI

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Urgent Care Staffing: Forecast Volume and Build Rotas With AI.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Urgent Care Staffing: Forecast Volume and Build Rotas With AI.

Export twelve to twenty-four months of arrivals as a count per date and hour, ask AI to find the day-of-week and seasonal pattern, then divide each hour's expected patients by how many one clinician can see. That gives hourly cover for a draft rota, which a manager adjusts for leave, skills and rest rules before publishing.

The AI is doing counting and pattern-spotting here, not clinical judgement, so the data you give it can be completely anonymous: a date, an hour and a number. The real risk is false confidence, which is why the plan below includes a back-test against recent weeks before any rota is built from the forecast.

Follow me on Instagram@sagnikteaches

What to export, and what to leave behind

Your check-in or practice management system almost certainly has a report of arrivals. You want one row per hour per day, or a raw list of check-in timestamps that you can count yourself. Nothing else is needed. The fewer columns you export, the less there is to leak and the fewer ways the AI can wander off topic.

Connect on LinkedInSagnik Bhattacharya
FieldKeep it?Why
Date and hour of arrivalYesThe whole forecast is built on this.
Visit count per hourYesThe number you are predicting.
Walk-in or booked flagYes, if you have itBooked slots are known in advance; walk-ins are what you forecast.
Visit type, in broad groups onlyOptionalHelps if injuries and illness peak at different times.
Patient name, date of birth, record numberNoNot needed, and a risk.
Complaint text, notes, diagnosesNoNot needed for volume; free text can identify people.
Provider nameNoStaff availability belongs in the rota step, not the forecast.

If your system only exports patient-level rows, do the stripping in a spreadsheet before anything goes near an AI tool: keep the timestamp column, delete the rest, then use a pivot table to count arrivals per date and hour. The ChatGPT and Excel guide covers pivot tables if you have not built one.

Subscribe on YouTube@sagnikteaches

Clean the counts before asking for patterns

Forecasts fail on dull data problems far more often than on clever modelling. Spend twenty minutes on these four before you run anything.

  • Zero versus missing. A closed day should be blank or marked closed, not zero. Otherwise the AI averages in a "quiet day" that never happened. A Christmas closure dragging down a Thursday average is the classic case.
  • Clock changes. On the day clocks move, one hour is missing or doubled. Mark those dates and either drop them or fix the hour.
  • System outages. If check-in was down for three hours and staff used paper, the counts for those hours are wrong. Mark them as unreliable.
  • Changed opening hours. If you moved from 8:00-20:00 to 9:00-21:00 in March, say so. Otherwise the AI will read the new 20:00 hour as growth.

A short note column ("closed", "clocks changed", "system down", "new hours from this date") is enough. You will paste the rule list into the prompt, so the AI treats those rows properly.

The Complete Excel Course with AI Integration thumbnail

The Complete Excel Course with AI Integration

From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.

By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner

Buy now

A prompt that finds the weekly and seasonal shape

Use a tool your organisation has approved for operational data. A paid business plan that does not train on your content by default is the sensible floor; check the plan's data settings rather than assuming. Paste the aggregated table, or upload the file, and ask for patterns first and forecasts second. Seeing the pattern in words lets you spot nonsense early.

I run an urgent care clinic. The attached table has one row per date and hour with the number of walk-in arrivals, for the last 24 months. Rows marked "closed", "system down" or "clocks changed" must be excluded from averages.

1. Show average daily arrivals by day of week, with the lowest and highest week for each.
2. Show the average share of a day's arrivals that falls in each hour, separately for weekdays and weekends.
3. Compare month averages across the two years and say whether the seasonal swing is the same in both.
4. Flag any weeks that look like outliers and say what in the data made you flag them.
Do not forecast yet. Say what you are unsure about.

Here is the kind of answer you should get back (illustrative figures for one clinic open 8:00-20:00, seven days a week):

Monday is the busiest weekday at an average of 78 arrivals, then Sunday at 74, Saturday at 71, Friday 66, Tuesday 64, Thursday 62 and Wednesday 61. December to February run about 22% above the annual average in both years; July and August run about 15% below. Weeks 51 and 52 of year one look unusual (two closure days). Week 10 of year two is 31% above its neighbours; I cannot tell why from this data.

That last line is the honest kind of output. Week 10 is not a pattern, it is a question for you: was there an outbreak, a school event, a competitor closing? If you know, add a note and re-run. If nobody can say, leave it out of the averages and write down that you did.

Main example: one clinic, one Monday in January

Take that clinic. A Monday averages 78 arrivals across the year, and winter months run about 22% higher. For a Monday in January the day total is 78 x 1.22, which is about 95 arrivals. The hourly shape for weekdays came back as this share of the day (illustrative):

HourShare of dayExpected arrivals (of 95)Clinicians needed at 3 patients an hour
8-96%5.71.9
9-109%8.62.9
10-1111%10.53.5
11-1211%10.53.5
12-1310%9.53.2
13-148%7.62.5
14-157%6.72.2
15-168%7.62.5
16-179%8.62.9
17-1811%10.53.5
18-197%6.72.2
19-203%2.91.0

The "3 patients an hour" figure is a placeholder; yours comes from your own throughput, covered in the next section. With it, the Monday needs three clinicians through most of the day and a fourth around 10:00 to 12:00 and again 17:00 to 18:00 if you want no queue to build. Rather than book four full shifts, the draft rota uses three clinicians all day plus one flex clinician on a four-hour 10:00-14:00 shift, and the manager decides on the evening peak separately, because 3.5 at 17:00 is a half-person gap that a flex call-in can cover.

Working out how many patients one clinician really handles

The divisor decides everything, so measure it. Do not take the figure from a brochure or another clinic. Use your own timestamps: from check-in to discharge for last month, how many patients did each clinician see per hour on busy days when there was a queue? Those queue-heavy hours are your real capacity, because nobody was waiting for work.

Ask the AI to compute it, with the same anonymised export plus a column for clinician code ("Clinician A", "B" rather than names):

Using the attached rows (date, hour, clinician code, patients seen), calculate the median patients seen per clinician-hour for hours where the waiting-room count was 4 or more at the start of the hour. Show the 25th and 75th percentile as well. Exclude hours where a clinician worked less than 40 minutes.

If the answer is a median of 2.8 with a range of 2.3 to 3.4, plan on 2.8, not 3. Plan low and add a flex shift rather than planning at the best-day rate. Then add support roles using a fixed ratio your clinic already uses, for example one medical assistant per clinician, one front-desk person while the day is under 8 arrivals an hour and two above it, and an imaging technician on a separate rule. Put those ratios in a small table in the prompt so the AI applies them consistently rather than inventing its own.

Turning forecast hours into a draft rota

Once you have a clinician count per hour, the next step is shift building. The AI is useful here as a first-draft generator with your rules written out. It is not allowed to decide the rules.

Here is the required clinician count per hour for each day next week [table]. Build a draft rota using only these shift types: Early 8:00-16:30, Mid 10:00-18:30, Late 11:30-20:00, Flex 10:00-14:00. Each shift includes a 30-minute unpaid break. Rules: nobody works more than 5 days; minimum 11 hours between shifts; Clinician C and D cannot work the same Late shift (training pairing); Clinician B is on leave Tuesday and Wednesday. Show, per hour, how many clinicians are on and where that is below the requirement. Do not invent staff or shift types.

Check the output the way you would check a junior's work. Say the draft for Monday lists Early x2, Mid x1, Late x1 and Flex x1. Count the overlap yourself for two or three hours. If 16:00-17:00 is reported as four clinicians but the shifts listed only overlap to three, the AI has miscounted. That is a regular failure, which is why the prompt asks for per-hour totals you can verify.

A before and after shows the gain. Before: a manager rebuilds the same pattern from last week's rota every Thursday, taking about 90 minutes, and Monday is short in January because "it was fine last winter". After: the forecast gives the requirement by hour, the draft takes ten minutes to generate, and the manager spends about 40 minutes on the part that needs a human, which is swaps, preferences and skills mix.

Back-test the forecast before you trust it

A forecast you have not tested is a guess in a nicer font. Hold back the last four weeks of data, build the forecast from everything before them, and compare. The sum is simple (illustrative figures).

Held-back weekForecast arrivalsActual arrivalsMiss
Week 153856123
Week 254151229
Week 353654913
Week 454459046
Total2,1592,212111

The misses add up to 111 on 2,212 actual arrivals, about 5%. That is usable for rota planning. Day-level and hour-level misses will be larger, so also check the busiest hours. If you are within 10% at weekly level but 25% out on Mondays, the weekday split is wrong, not the total. Week 4 was the worst; in this illustration the manager found that a nearby school had sent home a class with a stomach bug that week. A one-off like that should be logged, not chased.

Set a rule in advance: if the weekly miss is under 8% for four straight weeks, rely on the forecast; if it goes over 12% in any week, look for a cause before the next rota. Write it in the clinic's planning note so it is not argued afresh each time.

Events that the history cannot know about

History predicts a normal week. Several things are not normal, and you tell the AI about them as adjustments in plain numbers you choose.

  • School holidays and term starts. Injuries may rise in holidays and illness can climb after term starts. If your data shows it, put term dates in the table as a flag column.
  • Public holidays. Treat them as their own day type, not as a Sunday. A holiday may behave like a Sunday with a larger morning peak, or like neither; your data will tell you.
  • A competitor closing or opening. Add a note and a manual uplift or drop, say plus 10% for six weeks, then review.
  • Local events. A marathon or festival affects injuries and heat illness. Use a flag and a modest manual adjustment.
  • Your own changes. If you launch online check-in or wait-time texts, arrival timing shifts. Re-run the hourly shape afterwards.

A sample instruction for the AI: "For the week starting 6 January, apply +8% to all days for the school return and show the result separately so I can compare it with the unadjusted forecast." Keeping both versions side by side protects you from stacking unreasoned uplifts.

The manager's check before the rota is published

This is the step that cannot be handed over. Here is a filled-in version of the checklist for one imagined week:

  1. Cover meets the requirement in every hour. Counted by hand for the three peak hours. Result: yes, except Wednesday 17:00 is one under; swap approved.
  2. Skills mix. At least one clinician on every shift can suture and one can read X-rays. Result: Saturday Late has neither; move Clinician A from Mid.
  3. Rest and hours rules. Checked against contract terms and employment rules, which the AI does not know. Result: two eleven-hour gaps broken; fixed.
  4. Leave and sickness already known. Result: one new request arrived after the draft; handled.
  5. Fairness. No one has more than two weekend Lates in a row. Result: pass.
  6. Contingency. Who is on call if the flex shift is needed, and the trigger. Result: Clinician E, triggered when the wait is over 60 minutes at two consecutive hourly checks.

To see how this plays against your waiting-time targets, track outcomes with the approach in Urgent Care KPI Dashboard: Wait Times and Visits per Hour With AI, and if the wait runs long anyway, wait-time texts keep people informed.

A weekend example: when the Saturday shape differs

Weekends rarely follow the weekday curve, and a forecast that applies one hourly shape to every day will staff Saturday badly. Say the pattern step shows Saturday arrivals peaking at 11:00-14:00 because primary care offices are shut and sports injuries arrive after morning fixtures, with only 4% of the day's volume after 18:00. Saturday averages 71 arrivals, so a winter Saturday is about 87. If 13% of the day lands in each of the three peak hours, that is about 11 arrivals an hour, or 4.0 clinicians at 2.8 patients each. The weekday Late shift ending at 20:00 would be wasted; a Saturday Late should end at 18:30 instead, and the saved hours move to the Early shift.

The prompt change is small: ask for the hourly share separately for each day of the week, not for weekdays and weekends as two blocks, and let the numbers show whether Friday looks more like Thursday or more like Saturday. Friday evening often turns out to be its own pattern.

Where the forecast goes wrong in practice

Three failures turn up repeatedly. First, the AI treats a gap as a quiet day. A week when check-in was misconfigured and half the arrivals went unrecorded looks like a slump, and the next forecast lowballs. Fix: the notes column, and an eyeball of any week more than 25% below its neighbours.

Second, the AI overfits a single strong year. If last winter had an unusually bad respiratory season, a forecast built on one year will staff for it again. Fix: use two years and ask for the range, not just the average, then plan to the middle with a flex shift for the top end.

Third, the clinic changes its own pattern. Say you add a nurse-led minor injury stream, so the same arrivals now need a different clinician mix. The patient count forecast is fine; the "one clinician per three patients" divisor is stale. Fix: re-measure throughput each quarter and whenever the model of care changes.

A weekly routine that takes under an hour

  1. Friday morning: export last week's counts, add notes, append to the master table (10 minutes).
  2. Run the saved prompt for the next three weeks; add event adjustments (10 minutes).
  3. Generate the draft rota with the saved rule prompt (10 minutes).
  4. Manager check, swaps and sign-off (20 minutes).
  5. Record last week's miss in a one-line log: forecast, actual, reason (2 minutes).

Save both prompts in a project or note so they are not retyped. After eight weeks, the log of misses tells you more about your clinic than the first forecast did, and it is what you would bring to a decision about adopting scheduling software with its own forecasting. For where this sits among other clinic AI spending, see Medical Practice AI Budget: What to Fund First and What It Costs, and for the same method in another shift business, How to Build a Restaurant Staff Rota With AI Demand Forecasts.

Keeping clinicians on side

Rotas touch people's lives, so say plainly what the AI does and does not do. It suggests how many people are needed each hour; it does not choose who. Swaps and preferences are handled by the manager as before. Share the forecast table, not just the result, so that a nurse who says "Mondays are always worse than this" can be checked against the numbers rather than ignored. Where the forecast is wrong in a way staff predicted, say so and fix it. Trust in the rota is worth more than the last five percent of forecast accuracy.

Questions managers ask before trusting a forecast

How much visit history does the forecast need?

Twelve months is the minimum, because it covers every season once. Twenty-four months is better, since you can see whether a busy winter was normal or a one-off. Less than six months will only show the weekly shape, not seasonal swings, so treat the output as a rough guide.

Can I do this without putting patient data into ChatGPT?

Yes. The forecast needs only a date, an hour and a count of arrivals. Strip names, dates of birth, record numbers and complaint text from the export, or build the count table from your system's own report. Nothing about an individual patient is needed to predict volume.

Does AI replace the rota software I already use?

No. AI drafts the numbers and a first-pass pattern. Your scheduling software still holds availability, leave, contracts and publishing. The useful split is AI for the forecast and the draft, software for the rules, and a manager for the final decision.

What if visits are very different from the forecast?

Keep a flex shift you can call in or release, and write down the trigger, such as a waiting time over a set number of minutes at two checks in a row. Then log the miss. Large misses usually point to an event or closure that was not in the data.

Further reads

Sources: the staffing ratios and volumes in this tutorial are illustrative figures for one imagined clinic, not benchmarks; check your own throughput data.

Want your rota forecast set up properly?

On a 1:1 call we'll look at the visit data you can already export, decide what the forecast should cover, and check whether your current scheduling tool can use it.

Book a 1:1 call with me