GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!
Watch the launch videoWatchMedical Appointment Priority System
Scheduling system that prioritizes patients by clinical severity, risk factors, and wait times to optimize care and resource allocation.
Solution
This medical appointment prioritization system ensures patients receive timely care based on clinical need. The solution evaluates multiple patient factors to determine scheduling urgency, assigning a comprehensive priority score that guides clinical staff. It analyzes condition severity from mild to critical, factoring in whether appointments are follow-ups to ongoing treatment plans.
The system incorporates key patient risk factors including age over 65, chronic conditions, immunocompromised status, and recent hospitalizations. Wait time analysis prevents patients from falling through the cracks by escalating priority for those waiting longer than standard timeframes. Based on the calculated score, patients receive one of five priority levels (Low to Urgent) with specific scheduling recommendations, ensuring the most vulnerable and acute patients receive prompt care while maintaining efficient clinic operations.
How it works
The appointment prioritization system follows a systematic evaluation process:
- Risk Factor Assessment: Evaluates patient demographics and medical history including age, chronic conditions, immune status, and recent hospitalizations.
- Condition Severity Analysis: Determines clinical urgency based on reported severity (mild to critical) and whether the appointment is a follow-up.
- Wait Time Evaluation: Calculates additional priority points based on how long the patient has been waiting for an appointment.
- Priority Score Calculation: Combines all factors into a comprehensive numerical score.
- Priority Assignment: Translates the numerical score into actionable priority levels (Urgent, High, Medium, Standard, Low) with specific scheduling timeframe recommendations.
Where teams use it
- Primary care practice appointment scheduling
- Specialist referral prioritization
- Emergency department triage support
- Post-discharge follow-up management
- Chronic disease management scheduling
- Limited resource allocation in healthcare settings
Inside the decision model
Medical Appointment Priority System ships as a JDM decision graph with 7 nodes, 4 decision tables and 20 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.
Request
inputAppointment requests split into two schema-validated objects: patient carries age plus three booleans (hasChronicCondition, immunocompromised, recentHospitalization), and appointment carries conditionSeverity constrained to mild through critical, daysWaiting, and isFollowUp.
Sample requestJSON
{
"patient": {
"age": 72,
"hasChronicCondition": true,
"immunocompromised": false,
"recentHospitalization": true
},
"appointment": {
"conditionSeverity": "moderate",
"daysWaiting": 12,
"isFollowUp": true
}
}Calculate Risk Factor Score
tableEvery true condition counts here because the hit policy is collect: patient.age > 65 contributes 10 points as 'Age over 65', a chronic condition 15, immunocompromised status 20, and a recent hospitalization 15, each row emitting a score and message pair into the riskFactors array via the outputPath. A 72-year-old with a chronic condition and recent discharge therefore banks three separate rows, not just the largest one.
Weighting immunocompromised patients heaviest is clinically sound, since delayed care carries infection risk they cannot absorb, and scoring recent hospitalization reflects the care-management norm that timely post-discharge follow-up reduces readmissions. Age 65 is the conventional geriatric line; the 10/15/20 point values themselves are calibration choices for this scheduler.
| Condition | Scorescore | Reasonmessage |
|---|---|---|
| patient.age > 65 | 10 | 'Age over 65' |
| patient.hasChronicCondition | 15 | 'Chronic condition' |
| patient.immunocompromised | 20 | 'Immunocompromised' |
| patient.recentHospitalization | 15 | 'Recent hospitalization' |
Risk Factor Summary
expressionCollected rows get rolled up next: scores.riskFactors takes sum(map(riskFactors, #.score)), reasons.riskFactors keeps the messages with map(riskFactors, #.message), and the raw riskFactors array is nulled out. That puts the risk contribution into the same scores and reasons shape the severity and wait-time tables write into, so the final sum can treat all three alike.
sum(map(riskFactors, #.score))map(riskFactors, #.message)nullEvaluate Condition Severity
tableSeverity anchors the score: 'critical' is worth 50 and 'severe' 30 regardless of appointment.isFollowUp, while 'moderate' splits 20/15 and 'mild' splits 10/5 depending on whether the visit is a follow-up. First hit keeps the pairs unambiguous, and each row writes both scores.conditionSeverity and a plain-language reason.
Making the top severity worth 50, more than double the largest risk-factor row, keeps clinical acuity the primary driver of scheduling rather than demographics. The follow-up bump for moderate and mild cases reflects continuity-of-care practice, where a lapsed follow-up after active treatment risks quiet deterioration; the exact point spread is a business calibration.
| Condition Severityappointment.conditionSeverity | Is Follow Upappointment.isFollowUp | Scorescores.conditionSeverity | Reasonreasons.conditionSeverity |
|---|---|---|---|
| 'critical' | - | 50 | 'Critical condition' |
| 'severe' | - | 30 | 'Severe condition' |
| 'moderate' | true | 20 | 'Moderate condition with follow-up' |
| 'moderate' | false | 15 | 'Moderate condition' |
| 'mild' | true | 10 | 'Mild condition with follow-up' |
| 'mild' | false | 5 | 'Mild condition' |
Calculate Wait Time Score
tableWaiting days convert to escalation points in descending bands: appointment.daysWaiting above 30 adds 25 as 'Excessive wait time (> 30 days)', above 14 adds 15, above 7 adds 10, above 3 adds 5, and the blank row scores 0 for 'Minimal wait time (0-3 days)'. Ordering from the largest threshold down is what makes the first hit policy pick the correct band.
Aging-based escalation is the standard anti-starvation mechanism in access management: publicly funded systems publish maximum wait-time targets, and ratcheting priority with days waited is how schedulers keep low-acuity patients from being deferred indefinitely. The 3/7/14/30 breakpoints are operational choices that map naturally onto scheduling horizons of days, a week, a fortnight, and a month.
| Days Waitingappointment.daysWaiting | Scorescores.waitTime | Reasonreasons.waitTime |
|---|---|---|
| > 30 | 25 | 'Excessive wait time (> 30 days)' |
| > 14 | 15 | 'Long wait time (15-30 days)' |
| > 7 | 10 | 'Moderate wait time (8-14 days)' |
| > 3 | 5 | 'Short wait time (4-7 days)' |
| - | 0 | 'Minimal wait time (0-3 days)' |
Calculate Total Priority Score
expressionAggregation is a single sum(values(scores)) into totalScore, with priorityFactors flattening the reasons lists into one audit trail. The reasons, patient, and appointment keys are then set to null, so what reaches priority assignment is just the number and the explanations that produced it.
sum(values(scores))flatten(values(reasons))nullnullnullAssign Priority Level
tableFive bands translate totalScore into action: 85 or more is 'URGENT' with 'Schedule immediately', 60 or more 'HIGH' within 24-48 hours, 40 or more 'MEDIUM' within 1 week, 20 or more 'STANDARD' within 2 weeks, and anything below falls to 'LOW', scheduled as available. Both result.priority and result.recommendation come out of the same row, so the label and the timeframe can never disagree.
The bands are sized against the upstream weights: a 'critical' condition alone (50 points) lands in MEDIUM, reaches HIGH with modest risk factors, and only hits URGENT when vulnerability or accumulated wait stacks on top, which keeps the top tier scarce enough to mean something. Fixed scheduling windows per tier match how clinics actually operationalize prioritization, though the specific cutoffs are program choices rather than mandated standards.
| Total ScoretotalScore | Priorityresult.priority | Recommendationresult.recommendation |
|---|---|---|
| >= 85 | 'URGENT' | 'Schedule immediately' |
| >= 60 | 'HIGH' | 'Schedule within 24-48 hours' |
| >= 40 | 'MEDIUM' | 'Schedule within 1 week' |
| >= 20 | 'STANDARD' | 'Schedule within 2 weeks' |
| - | 'LOW' | 'Schedule as available' |
Other Healthcare templates
View all templatesPatient Triage System
Rules-based medical triage system that prioritizes patients in emergency departments based on vital signs, symptoms, and chief complaints.
HealthcareClinical Pathway Selection
Decision system that determines optimal treatment pathways based on diagnosis severity, comorbidities, and patient characteristics for personalized care plans.
HealthcareMedication Dosage Calculator
Clinical decision system that calculates precise medication dosages based on patient weight, age, and organ function to maximize safety and efficacy.
Make this template
your own.
Load Medical Appointment Priority System into GoRules, adjust the rules to your policy, and ship it behind your own API.