Phoenix Sepsis Score
- CategorySepsis
- Versionv2.2.0
- Reviewed2026-08-04
- ValidationIndependent clinical validation: pending
Total (0–13) = respiratory (0–3) + cardiovascular (0–6) + coagulation (0–2) + neurologic (0–2), each per JAMA 2024 Table 2 (PaO₂ and MAP in mmHg, FiO₂ a fraction). RESPIRATORY is cumulative and scored only when respiratory support is present. The PaO₂:FiO₂ (P/F) and SpO₂:FiO₂ (S/F) ratios are evaluated together — S/F only when SpO₂ ≤ 97% — and either can trigger a tier: 1 point for any support with P/F < 400 or S/F < 292, 1 more for invasive mechanical ventilation with P/F < 200 or S/F < 220, and 1 more for invasive ventilation with P/F < 100 or S/F < 148. Invasive ventilation can therefore reach 3 and non-invasive support cannot exceed 1. CARDIOVASCULAR sums three independent 0–2 sub-scores with no overall cap: vasoactive agents (0 → 0, 1 → 1, ≥ 2 → 2), lactate (< 5 → 0, 5 to < 11 → 1, ≥ 11 → 2 mmol/L), and age-banded MAP (2 if MAP < low, 1 if low ≤ MAP < high, 0 if MAP ≥ high, with half-open [low, high) thresholds by age band). COAGULATION adds 1 point each — platelets < 100 ×10³/µL, INR > 1.3, D-dimer > 2 mg/L FEU, fibrinogen < 100 mg/dL — capped at 2. NEUROLOGIC is hierarchical, not additive: bilaterally fixed pupils score 2 outright whatever the GCS; otherwise GCS ≤ 10 scores 1; otherwise 0. BOUNDARIES are compared continuously, matching the reference software rather than the integer bands printed for bedside use, at the four values where the two disagree: MAP 30.5 under 1 month scores 1 where the printed band reads 0; lactate 10.95 scores 1 where the printed band (5–10.9) leaves a gap; and a P/F of exactly 200 or an S/F of exactly 220 on invasive ventilation scores 1 where the printed 2-point bands (100–200, 148–220) read 2. MISSING INPUTS are each imputed at their own normal-end sentinel, independently of every other input — an uncomputable ratio as 500, GCS as 15, pupils as not fixed, ventilation and other support as absent, vasoactive agents 0, lactate 0, INR 0, D-dimer 0, platelets and fibrinogen normal — so a missing GCS never suppresses a fixed-pupils score. Sepsis is reported as 1 when infection is suspected/confirmed and total ≥ 2; septic shock as 1 when sepsis is met and the cardiovascular component ≥ 1.
Diagnostic criterion, not a graded severity ladder: sepsis = suspected/confirmed infection AND total ≥ 2; septic shock = sepsis AND cardiovascular component ≥ 1 (a cardiovascular point, not merely total ≥ 2). The vasoactive sub-score is a COUNT of distinct agents (0/1/≥2), not the VIS. NEUROLOGIC IS HIERARCHICAL, NOT ADDITIVE. Bilaterally fixed pupils score 2 outright, whatever the GCS; a GCS ≤ 10 with pupils not fixed scores 1; anything else scores 0. All four published tables print this row as three mutually exclusive columns, and the neurologic sub-score the task force selected came from PELOD-2, whose own neurologic component is a maximum-type rule over GCS and pupillary reactivity. The reference software writes the rule as an additive expression capped at 2, which is observationally identical because fixed pupils alone already saturate the cap — but an UNCAPPED sum would return 3 for fixed pupils at GCS 8 and is wrong. Until 2026-08-03 this calculator returned 1 for fixed pupils whenever the GCS was above 10 or was not entered; that was a defect, and it is the reason for the v2.0.0 bump. MISSING INPUTS ARE IMPUTED AT THEIR NORMAL END, EACH INDEPENDENTLY of every other input — the rule is per input, not 'the component scores 0'. A missing GCS imputes to 15 and missing pupil status to 'not fixed', separately, so a child with bilaterally fixed pupils and no GCS recorded still scores the full 2 neurologic points and still meets the total ≥ 2 threshold. Both JAMA tables state the general rule in their first table footnote: an unmeasured variable contributes no points. One honest qualification, so the claim is not overstated as the whole of the published method: in the derivation cohort missing values were first carried forward from physiologically appropriate earlier time windows, and only values still absent after that contributed zero. That is a property of how the development dataset was built and has no bearing on a single-timepoint bedside calculator, where only the second half applies. The consequence is that the total reflects DOCUMENTED dysfunction — a teaching UI should show a missing input as missing, not as normal. RESPIRATORY USES BOTH RATIOS. P/F and S/F are evaluated together and either can trigger a tier, exactly as the source expression writes it; a ratio that cannot be computed imputes to 500 and so triggers nothing. S/F is valid only when SpO₂ ≤ 97%. That gate has a consequence worth stating outright, because it runs against intuition: with no arterial gas, a child on invasive ventilation at FiO₂ 1.0 scores respiratory 3 at SpO₂ 97 but 0 at SpO₂ 98 — the ratio simply is not computable above 97, and the missing-input convention then contributes 0. A well-saturated child on maximal support can therefore fall below the total ≥ 2 sepsis threshold on respiratory grounds alone. Read that as ‘not measurable’, never as ‘not hypoxaemic’, and obtain a blood gas. THE SUPPORT GATE IS READ OFF THE TASK FORCE'S OWN PUBLISHED CODE, not inferred from the printed table. The published SQL builds a single flag — other respiratory support is true when FiO₂ exceeds 0.21 or the child is invasively ventilated — and then scores invasive ventilation × (the two lower-ratio tiers) plus other respiratory support × (the P/F < 400 or S/F < 292 tier). Three things follow structurally rather than by reading between the lines: a child on no support scores 0 however low the ratio goes; the 1-point tier needs only some oxygen or non-invasive support; and the 2- and 3-point tiers need invasive ventilation. pSOFA IS BUILT THE OTHER WAY UP, AND THE DIVERGENCE IS REAL. There, respiratory subscores 3 and 4 carry a support requirement and no lower band carries any, so an unsupported child is CAPPED at 2 rather than floored at 0. The same child, at the same ratio, off support, is Phoenix respiratory 0 and pSOFA respiratory 2 simultaneously — a two-point divergence produced entirely by where each table puts its support requirement, with no disagreement about the physiology. Both are correct implementations of their own instrument; neither is to be harmonised to the other. ONE OPERATIONAL DIFFERENCE FROM THAT SQL, and it is this calculator's choice. The SQL infers support from the data, counting any FiO₂ above room air as support, because it extracts from records that carry no support field. This calculator asks instead, and takes ‘no respiratory support’ at face value even when an FiO₂ above 0.21 has also been entered. That pairing is internally contradictory — a child on FiO₂ 0.5 is by definition receiving oxygen — and it is the one input combination where this score and the published extraction disagree: the extraction would award the 1-point tier, this calculator scores 0. Answer the support question from what the child is actually on, and the two agree everywhere. HIGH-FLOW NASAL CANNULA COUNTS HERE AND DOES NOT COUNT IN THE REGISTRIES. Phoenix explicitly includes high flow within other respiratory support. PICANet and ANZPIC both EXCLUDE high-flow nasal cannula from the mechanical-ventilation field they collect. So the same child on high flow is ‘supported’ for Phoenix and ‘not ventilated’ in both major paediatric registries — which matters the moment a Phoenix score is read alongside registry-derived case-mix, benchmarking or ventilation-day figures. What has NOT been retrieved, and must not be assumed: no cohort has quantified how much the CPAP-versus-high-flow choice, or counting high flow on one side and not the other, shifts the distribution of this score. The direction is obvious; the magnitude is unknown. BOUNDARY CONVENTION. The published tables are written for bedside use (integers, one-decimal lactate) while the software treats every input as continuous, and the two disagree at exactly four values. This calculator follows the software at all four, consistently: MAP 30.5 in a child under 1 month scores 1 where the printed band reads 0 (the same shape recurs at every age band's 0/1 edge); lactate 10.95 scores 1, where the printed 1-point band of 5–10.9 leaves it in a gap; P/F exactly 200 on invasive ventilation scores 1, where the printed 2-point band of 100–200 reads 2; S/F exactly 220 on invasive ventilation scores 1, where the printed 2-point band of 148–220 reads 2. There is no divergence at any coagulation or neurologic boundary, nor at P/F 100, S/F 148, MAP 17, MAP 30, lactate 5 or lactate 11. OUT-OF-RANGE INPUT IS REJECTED RATHER THAN COMPUTED, and that is the source behaviour rather than a local choice: the reference R package halts on a GCS outside 3–15 and on ventilation/support flags outside {0, 1}. The criteria exclude age 18 and over, so 216 months and above is rejected here; note that the reference R code's own `<= 216` bound admits exactly 18.0 years and diverges from the criteria it implements. The age ceiling is exclusive: every age below 216 months is accepted, including a fractional one such as 215.5, and 216.0 itself is not. SEDATION. The neurologic sub-score was pragmatically validated in sedated and non-sedated patients, with and without invasive ventilation. The derivation paper separately acknowledges that some organ-dysfunction measures may reflect iatrogenic effects or clinician choices rather than sepsis-related dysfunction, and names a reduced GCS under sedation as its example. A sedated child's neurologic point may therefore be measuring the sedation; that caveat comes from the authors, not from commentary. GENERALISABILITY. The higher-resource derivation data came exclusively from US tertiary paediatric centres. Some lower-resource sites did not record respiratory support or neurologic status even when it had been assessed, which constrained both the achievable score range and the score's measured performance at those sites. ‘REMOTE ORGAN DYSFUNCTION’ IS NOT PART OF THE CRITERIA and is deliberately not implemented: the derivation paper uses it as a descriptive subgroup (respiratory or neurologic dysfunction plus at least one point in a different organ system) to characterise a higher-mortality population, not as a diagnostic gate. Only the numeric total GCS (3–15) is consumed; the GCS response-descriptor wording is a separate instrument (Teasdale & Jennett) and is not reproduced or licensed by the Phoenix papers. The validated cohort was children < 18 years and excluded newborns during the birth hospitalization and infants < 37 weeks post-conceptional age — applying the score to those groups is outside the validated population, and age in months is not adjusted for prematurity. The 8-organ research extension Phoenix-8 is research-only, is not the diagnostic criterion and is out of scope. The MAP age bands are implemented as half-open [low, high) intervals (matching the reference package) so non-integer MAP scores exactly. PLAUSIBILITY BOUNDS ARE NO LONGER ALL OURS. Until this version every min/max on this score was labelled a guardrail of this platform's own invention. The Phoenix implementation notes publish a reasonable-value table covering these inputs, and five of the bounds declared here are identical to it: age months [0, 216) with an exclusive ceiling — the same half-open domain, which independently corroborates the exclusive-ceiling work done here before that table was read; FiO₂ 0.21–1.00; GCS 3–15; the vasoactive count as an integer 0–6; and SpO₂'s ceiling of 100 together with the published statement that a value above 97 is unusable for SpO₂:FiO₂, which is the gate applied in the calculation. Narrower here than published, and unchanged: PaO₂ 20–700 against a published range open above with a floor of 0; MAP 10–200 against 1–300; lactate 0.3–30 against 0–50; D-dimer 0.1–50 against 0–500; and platelets 5–1000, INR 0.8–10 and fibrinogen 30–800 against published ranges that set no upper bound at all. NO BOUND ON THIS SCORE MOVED in light of the published table, and none should: a form field refusing a typo is doing a different job from a data pipeline's outlier filter, and widening to match would only admit values no bedside entry should contain. The published table also bounds analytes this four-organ score does not consume (creatinine 0–50 mg/dL, total bilirubin 0–100 mg/dL, ALT, glucose 5–2000 mg/dL — the research extension's inputs) and gives systolic and diastolic pressures for sites deriving MAP from a cuff, which this calculator takes directly instead. One arithmetic check falls out of it: the published SpO₂:FiO₂ ceiling of about 461.9 is 97 ÷ 0.21, exactly what the ≤ 97% usability rule and the room-air FiO₂ floor entail together. WHAT AN OUT-OF-RANGE VALUE DOES THERE IS NOT UNIFORMLY WHAT IT DOES HERE, and the two halves of the reference behaviour differ from each other. The R package's own argument checks HALT — on a GCS outside 3–15 and on ventilation or support flags outside {0, 1} — which is where the rejection behaviour stated above comes from and is not a local choice. The reasonable-value table is the other half: it is data-preparation guidance for the analytes, where a value outside its range is set to null, and a null scores zero with no imputation. This calculator rejects in both cases, so it is the stricter of the two for every analyte, deliberately — a silently nulled lactate reads exactly like a normal one, which is the failure this platform's missing-data caution exists to prevent. Provenance, stated so it is not overclaimed: the reasonable-value table was read from the reference package's implementation-notes documentation; the machine-readable units file that page refers to could not be retrieved, so nothing here is cited to that file. A second published comparator from a different tradition, tighter than both: the PICANet Admission Dataset Definitions Manual v5.4 (November 2020) publishes collection ranges including PaO₂ 3–60 kPa (22–450 mmHg), lactate 0.2–15.0 mmol/L, systolic pressure 20–180 with a check above 200, and base excess −30 to +20. No newer PICANet manual exists — confirmed, not merely unlocated. AND THE SILENCE ELSEWHERE IS ITSELF THE FINDING: VPS, PC4 and PHIS publish NO public numeric plausibility or edit-check bounds. Confirmed negative — theirs sit behind login as proprietary data-quality rules, so there is nothing to go and find. That is the reason independent implementations of the same score diverge on what they will accept: for most inputs there is no public standard to converge on, and any two implementations' guardrails are their own until someone publishes.
| Result | Interpretation |
|---|---|
| < 2 | 0–1 — Below the Phoenix threshold: in a child with suspected infection this does not meet the Phoenix criterion for sepsis. Interpret in the full clinical context. |
| ≥ 2 | ≥ 2 — In a child with suspected/confirmed infection, meets the Phoenix criterion for sepsis. Reported in-hospital mortality in the derivation/validation cohorts was ~7.1% (higher-resource) and ~28.5% (lower-resource); with ≥ 1 cardiovascular point the septic-shock criterion is also met (~10.8% / ~33.5%). These are population associations, not individual predictions. |
References
- Sanchez-Pinto LN, Bennett TD, DeWitt PE, et al; SCCM Pediatric Sepsis Definition Task Force. Development and Validation of the Phoenix Criteria for Pediatric Sepsis and Septic Shock. JAMA. 2024;331(8):675–686.Primary derivation/validation; Table 2 is the score.PMID 38245897DOI 10.1001/jama.2024.0196
- Schlapbach LJ, Watson RS, Sorce LR, et al; SCCM Pediatric Sepsis Definition Task Force. International Consensus Criteria for Pediatric Sepsis and Septic Shock. JAMA. 2024;331(8):665–674.Companion consensus definition (sepsis = suspected infection + Phoenix ≥ 2; septic shock).PMID 38245889DOI 10.1001/jama.2024.0179
- DeWitt PE, Russell S, Rebull MN, Sanchez-Pinto LN, Bennett TD. phoenix: an R package and Python module for calculating the Phoenix pediatric sepsis score and criteria. JAMIA Open. 2024;7(3):ooae066.Reference implementation by task-force members; source of the worked vignettes and the half-open MAP interval detail. Its implementation-notes documentation additionally publishes the reasonable-value table this score's input bounds are compared against, and the SQL from which the respiratory support gate is read (other respiratory support = FiO₂ > 0.21 OR invasive ventilation). The machine-readable units file that page refers to could not be retrieved; nothing here is cited to it.DOI 10.1093/jamiaopen/ooae066
Reproduction rights
Freely reproducible.Threshold/branch-rule clinical score — cutoffs, arithmetic, and age bands are facts/procedures, not copyrightable expression. The authors additionally released an open-source reference implementation (CRAN/PyPI) and open-access papers. Only the numeric total GCS is consumed; no GCS response-descriptor item wording is reproduced (phoenix.md IP status).
Independent clinical validation: pending
Two independent clinical validators will be named here once review is complete.
- 2026-07-25v1.0.0Initial releaseInitial release: four-organ Phoenix Sepsis Score with age-banded MAP, sepsis and septic-shock flags.
- 2026-08-01v1.1.0ClarificationLimitations now state the SpO₂ 97/98 discontinuity outright: with no arterial gas, a child on invasive ventilation at FiO₂ 1.0 scores respiratory 3 at SpO₂ 97 but 0 at SpO₂ 98, because S/F is undefined above 97 and the missing-input convention then contributes 0 — so a well-saturated child on maximal support can fall below the total ≥ 2 sepsis threshold on respiratory grounds alone. Both halves are per the paper and neither was stated; a reader could have taken the 0 for reassurance. The four component maxima (respiratory 0–3, cardiovascular 0–6, coagulation 0–2, neurologic 0–2) are now declared for the result panel, and the inputs carry organ-system group headings. No threshold or computed value changed.
- 2026-08-03v2.0.0Formula correctionTWO COMPUTED RESULTS CHANGE, both in the direction of a HIGHER score — a patient may now meet the Phoenix sepsis threshold who did not before, and no patient scores lower than before. (1) NEUROLOGIC. Bilaterally fixed pupils now score the full 2 points outright, whatever the GCS. The rule was implemented as GCS ≤ 10 (+1) plus fixed pupils (+1) capped at 2, which returned 1 for fixed pupils with a GCS above 10 and 1 for fixed pupils with no GCS entered. All four published tables print the neurologic row as three mutually exclusive columns, and the task force's own reference software returns 2 for fixed pupils at GCS 15, at GCS 8, and with GCS missing. The missing case is the consequential one: a missing GCS is imputed to 15 INDEPENDENTLY of pupil status, so a child with bilaterally fixed pupils and no GCS recorded scored 1 here — below the threshold — and now scores 2, which meets it. (2) RESPIRATORY. The PaO₂:FiO₂ and SpO₂:FiO₂ ratios are now evaluated together as the source expression writes them, either one able to trigger a tier, rather than the arterial ratio being used alone whenever a blood gas was present. Where the two disagree — non-simultaneous sampling being the usual reason — the respiratory component can only rise. Missing inputs are now imputed at their documented normal-end sentinels (unusable ratio 500, GCS 15, pupils not fixed, no ventilation, no other support, 0 vasoactive agents, lactate 0, INR 0, D-dimer 0, platelets and fibrinogen normal), each independently of the others. Also, without changing any number: the continuous-comparison convention is now stated for the four boundaries where the published integer bands and the reference software disagree (MAP 30.5 under 1 month, lactate 10.95, and P/F exactly 200 or S/F exactly 220 on invasive ventilation); a missing-data caution renders beside the result, because a half-entered Phoenix reads falsely low by design and a total below 2 on an incomplete entry is not evidence against sepsis; the age bound is documented as excluding 216 months (18.0 years) and over; and the limitations add the authors' own sedation caveat and the derivation-cohort generalisability caveat.
- 2026-08-03v2.1.0Formula correctionThe age field stops rejecting the last month of eligibility. An age above 215 and below 216 months — 215.5, say, for a child a fortnight short of 18 — was rejected as out of range, though the criteria (children under 18 years) plainly admit it. The cause was the input declaration, not the score: the shared numeric type could only state an INCLUSIVE maximum, and the closest whole-month expression of 'under 216' was 215. An exclusive ceiling of 216 months is now declared, so every age below 216 is accepted and 216.0 itself — exactly 18.0 years, which the criteria exclude — is still rejected. NO POINT VALUE, THRESHOLD, AGE BAND OR TOTAL CHANGED, and no age that was accepted before is rejected now; the only difference is that fractional ages in the final month are computed rather than refused. Whole months remain the entry convention, matching the published MAP bands. The out-of-range message for an ineligible age now reads 'must be at least 0 and less than 216 months' rather than naming 215 as the last acceptable value.
- 2026-08-04v2.2.0New referenceNO NUMBER MOVED — no threshold, age band, point value, bound or total changed, and no input that computed before is rejected now. What changed is where three things are sourced from, and one new finding is added. (1) PLAUSIBILITY BOUNDS ARE NO LONGER ALL OURS. Every min/max on this score was labelled a guardrail of this platform's own invention; the Phoenix implementation notes publish a reasonable-value table, and five bounds declared here are identical to it — age [0, 216) months with an exclusive ceiling, FiO₂ 0.21–1.00, GCS 3–15, the vasoactive count as an integer 0–6, and SpO₂'s ceiling of 100 with the >97 unusable-for-S/F rule. The age match independently corroborates the exclusive-ceiling work of v2.1.0, which was argued from the criteria alone. Seven bounds are narrower here than published (PaO₂, MAP, lactate, D-dimer, platelets, INR, fibrinogen) and are DELIBERATELY KEPT rather than widened: a form field refusing a typo is not a pipeline's outlier filter. PICANet's Admission Dataset Definitions Manual v5.4 is recorded as a second, tighter published comparator, and the divergent out-of-range behaviour is now stated — the reference nulls an implausible analyte and a null scores zero, while this calculator rejects it outright, which is the stricter and the safer of the two. (2) VPS, PC4 AND PHIS PUBLISH NO PUBLIC PLAUSIBILITY BOUNDS AT ALL — a confirmed negative, not an unfinished search, and worth stating because it explains why independent implementations of one score disagree about what they will accept. (3) THE RESPIRATORY SUPPORT GATE IS NOW SOURCED FROM THE TASK FORCE'S PUBLISHED SQL rather than inferred from the printed table: the SQL derives one flag (FiO₂ above 0.21 or invasive ventilation) and multiplies by it, which is why no support scores 0 at any ratio, the 1-point tier needs only oxygen or non-invasive support, and 2 and 3 need invasive ventilation. The contrast with pSOFA — which caps an unsupported child at 2 instead of flooring them at 0 — was already stated as a structural inference and is now stated with the mechanism. Disclosed with it: that SQL infers support from an FiO₂ above room air because it extracts from records with no support field, so entering an FiO₂ above 0.21 alongside 'no respiratory support' is the one input combination where this calculator and the published extraction disagree, and this calculator takes the clinician's explicit answer. (4) NEW, AND USER-VISIBLE: high-flow nasal cannula counts as respiratory support here, because Phoenix includes it explicitly, while PICANet and ANZPIC both exclude high flow from the ventilation field they collect — so the same child reads as supported on this score and as not ventilated in either registry. The non-invasive option now names high flow, and the support field's help text says so. Recorded as unretrieved and not to be assumed: no cohort has quantified how much the CPAP-versus-high-flow choice shifts this score's distribution.