GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!
Watch the launch videoWatchPatient Triage System
Rules-based medical triage system that prioritizes patients in emergency departments based on vital signs, symptoms, and chief complaints.
Solution
This triage system quickly identifies the appropriate care priority for patients in emergency departments. Using medical best practices, it evaluates vital signs including temperature, heart rate, respiratory rate, blood pressure, and oxygen saturation. The system analyzes reported symptoms, assigning higher scores for severe conditions like chest pain or difficulty breathing, while giving lower scores to mild symptoms like coughs or minor injuries.
Chief complaints are categorized by severity, with life-threatening conditions like stroke or cardiac arrest receiving immediate attention. The system calculates a comprehensive priority score by combining vital signs, symptoms, and complaint assessments. Each patient is then assigned a specific priority level from 1 (Immediate) to 5 (Non-Urgent), with recommended maximum wait times ranging from immediate treatment to 120 minutes based on medical urgency.
How it works
The decision graph evaluates patients through four distinct assessment phases:
Vital Signs Assessment: Analyzes key physiological indicators including temperature, heart rate, respiratory rate, blood pressure, and oxygen saturation, assigning scores and flags based on deviation from normal ranges.
Symptom Evaluation: Reviews reported symptoms, categorizing them into severity levels from severe (red flag) to minor (green flag) with corresponding scores.
Chief Complaint Analysis: Assesses the patient's primary complaint, with life-threatening conditions receiving highest priority scores.
Priority Calculation: Combines all assessment scores and flags to determine final priority level (1-5), establishing maximum wait times and identifying the highest risk factors.
Where teams use it
- Hospital emergency departments
- Urgent care centers
- Disaster response triage
- Military field hospitals
- Telehealth initial assessment
- Mass casualty incident management
Inside the decision model
Patient Triage System ships as a JDM decision graph with 5 nodes, 4 decision tables and 21 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.
Request
inputEvery downstream table reads from three top-level request fields: a vitals object carrying the five measured signs, a symptoms array of reported complaints, and a chiefComplaint string naming the presenting problem.
Sample requestJSON
{
"vitals": {
"temperature": 38.7,
"heartRate": 115,
"respiratoryRate": 24,
"systolicBP": 165,
"oxygenSaturation": 94
},
"symptoms": [
"moderate pain",
"fever",
"dizziness"
],
"chiefComplaint": "fracture"
}Vital Signs Assessment
tableFive vital-sign columns are checked worst-first under a first hit policy. The red row requires a temperature above 39.5 together with heart rate outside 40 to 160, respiratory rate outside 8 to 30, systolic pressure outside 80 to 200, and oxygen saturation below 90, writing 30 to scores.vitalScore and 'red' to flags.vitalFlag. The orange and yellow rows repeat the pattern with tighter bands, fever above 38.5 or 38.0 and saturation below 93 or 95, scoring 20 and 10, and the empty catch-all row scores 0 with a 'green' flag.
The bands track standard adult reference ranges: saturation under 90 percent signals hypoxemia needing prompt attention, 95 percent sits at the lower edge of normal, and the fever gradations separate high-grade from low-grade pyrexia. The red-to-green flag ladder mirrors the color coding of five-level triage scales such as the Manchester Triage System, so later steps can combine the flag and the score without re-reading raw vitals.
| Temperature (°C)vitals.temperature | Heart Rate (bpm)vitals.heartRate | Respiratory Rate (bpm)vitals.respiratoryRate | Systolic BP (mmHg)vitals.systolicBP | O2 Saturation (%)vitals.oxygenSaturation | Scorescores.vitalScore | Flagflags.vitalFlag |
|---|---|---|---|---|---|---|
| > 39.5 | )40..160( | )8..30( | )80..200( | < 90 | 30 | 'red' |
| > 38.5 | )50..150( | )10..25( | )90..180( | < 93 | 20 | 'orange' |
| > 38.0 | )55..140( | )12..22( | )100..170( | < 95 | 10 | 'yellow' |
| - | - | - | - | - | 0 | 'green' |
Symptom Assessment
tableReported complaints are matched with some(symptoms, # in [...]) expressions rather than a single field, so one hit anywhere in the list is enough to fire a row. Severe findings such as chest pain, difficulty breathing, unconscious, and active bleeding score 30 with a 'red' flag, the moderate list (vomiting, dehydration, fever, head injury) scores 20 with 'orange', minor items like rash and cough score 10 with 'yellow', and the first hit policy guarantees the most severe matching tier wins before the empty fallback row scores 0 as 'green'.
Grouping symptoms into red, orange, and yellow tiers reflects how nurse triage protocols separate immediately life-threatening presentations, chiefly airway, breathing, and circulation problems, from complaints that can safely wait. The 30/20/10 weights are a business calibration chosen so that a single severe symptom outweighs any combination of minor ones in the final sum.
| Expression | Scorescores.symptomScore | Flagflags.symptomFlag |
|---|---|---|
| some(symptoms, # in ["severe pain", "chest pain", "difficulty breathing", "unconscious", "unresponsive", "active bleeding"]) | 30 | 'red' |
| some(symptoms, # in ["moderate pain", "vomiting", "dehydration", "fever", "dizziness", "head injury"]) | 20 | 'orange' |
| some(symptoms, # in ["mild pain", "nausea", "minor injury", "rash", "cough"]) | 10 | 'yellow' |
| - | 0 | 'green' |
Chief Complaint Assessment
tableA single chiefComplaint field drives this table, each row listing its accepted matches. Life-threatening presentations (stroke, heart attack, cardiac arrest, trauma, anaphylaxis, overdose, seizure) score 40, the highest single score in the graph, with a 'red' flag. Urgent but stable complaints such as fracture, deep cut, burn, and pregnancy complication score 20 with 'orange', routine ones like sprain, cold, flu, and medication refill score 10 with 'yellow', and an unrecognized complaint falls through to 0 with 'green'.
Weighting this tier at 40 instead of 30 means a stated stroke or cardiac arrest alone can push the total into Level 2 territory even with unremarkable vitals, which matches emergency practice: outcomes for stroke and cardiac events are strongly time-dependent, so triage errs toward over-prioritizing the stated complaint before vitals confirm it. The middle and lower lists are sensible operational groupings rather than a regulated taxonomy.
| Chief ComplaintchiefComplaint | Scorescores.complaintScore | Flagflags.complaintFlag |
|---|---|---|
| "stroke", "heart attack", "cardiac arrest", "trauma", "anaphylaxis", "overdose", "seizure" | 40 | 'red' |
| "fracture", "deep cut", "burn", "allergic reaction", "infection", "pregnancy complication" | 20 | 'orange' |
| "sprain", "minor cut", "cold", "flu", "ear pain", "medication refill" | 10 | 'yellow' |
| - | 0 | 'green' |
Calculate Priority Level
tableBoth inputs here are derived: values(flags) collects the three color flags and the second column sums scores.vitalScore + scores.symptomScore + scores.complaintScore. Under the first hit policy, a 'red' flag with a total of at least 60 yields 'Level 1 - Immediate' and a 0-minute wait, red or orange with at least 40 yields 'Level 2 - Very Urgent' at 10 minutes, totals of 20 or more map to 'Level 3 - Urgent' at 30 minutes, 10 or more to 'Level 4 - Standard' at 60 minutes, and the final empty row assigns 'Level 5 - Non-Urgent' with a 120-minute maximum wait.
A five-level output with explicit maximum wait times follows the structure of established ED acuity scales such as the Emergency Severity Index and the Manchester Triage System, which likewise run from immediate to non-urgent. Requiring both a red flag and a score of 60 for Level 1 stops one noisy input from consuming resuscitation resources, while the paired flag-plus-threshold rows (contains($, 'red') alongside the score cut) let either strong signal escalate a borderline patient one level.
| All flagsvalues(flags) | Total Scorescores.vitalScore + scores.symptomScore + scores.complaintScore | Priority LevelpriorityLevel | Max Wait Time (minutes)maxWaitTimeMinutes | Highest FlaghighestFlag |
|---|---|---|---|---|
| contains($, 'red') | >= 60 | 'Level 1 - Immediate' | 0 | 'red' |
| contains($, 'red') | >= 40 | 'Level 2 - Very Urgent' | 10 | 'red' |
| contains($, 'orange') | >= 40 | 'Level 2 - Very Urgent' | 10 | 'orange' |
| - | >= 40 | 'Level 2 - Very Urgent' | 10 | 'orange' |
| contains($, 'orange') | >= 20 | 'Level 3 - Urgent' | 30 | 'orange' |
| - | >= 20 | 'Level 3 - Urgent' | 30 | 'yellow' |
+3 more rows in the downloadable template
Other Healthcare templates
View all templatesClinical 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.
HealthcareInsurance Prior Authorization
Automated system that evaluates insurance requirements for medical services based on carrier rules, diagnosis codes, and service details.
Make this template
your own.
Load Patient Triage System into GoRules, adjust the rules to your policy, and ship it behind your own API.