Abnormal lab result routing

Agents (Early Access) · Use case

An agent that reads each new lab result the moment it lands, decides how serious it is, then handles it one of three ways: it texts the patient a fixed follow-up message when the result is a bit off, escalates to a clinician when it's urgent, or sends a quiet "all clear" text when it's normal. The patient text never shows the actual result — the agent sorts and routes, it doesn't explain.

i

Beta note: This article covers the Keragon Agents early-access release. Behaviour, limits, and UI may change during the early access period; this page is updated on a rolling basis as we learn from early adopters.

Who it's for Clinical and front-desk teams who read every incoming lab result and decide who hears about it, how, and how fast.
Apps it uses An EHR (like Athena Health), text messaging (like Twilio), and a clinical channel (like Slack).
What fires it A new lab result in your EHR.

The scenario

When a lab result lands, someone has to read it and decide what happens next — by hand:

  • Open the result and read the value against its normal range.
  • Check the abnormal flag (H, L, HH, LL — or none).
  • Decide: normal, a bit off, or urgent?
  • Pull up the patient's phone number.
  • Either text them a follow-up, or stop and get a clinician.

Take Priya — a potassium result lands flagged HH (a dangerous high) while the inbox is already backed up. If that urgent result sits unread, or a cheerful "your results are in" text goes out before anyone has looked at it, the real danger isn't a typo — it's the serious result that quietly slips through.

How it works

The agent runs once for each new lab result. It makes one call — how serious is this, and so who hears about it and how — then takes exactly one path. The patient text is always a fixed message with no medical detail in it; that separation is what keeps it safe.

🔍

Read the result and sort it. Read the value, the normal range, and the flag, then settle on one of three labels: normal, a bit off, or urgent. This decision is the agent's own thinking, not a separate app.

Send the all-clear. Text the patient a fixed "your results are in, nothing to do" message when the result is in range and unflagged. No value, no range.

✉️

Ask them to book a follow-up. Text the patient a fixed "we'd like to see you for a follow-up" message when the result is out of range but not urgent, and post a short note to your clinical channel.

🚩

Escalate to a clinician. Skip the patient text entirely when the result is urgent, and post to the clinical channel tagging the on-call clinician with the flagged value.

The adaptable agent

This is an example lab-routing agent — a ready-to-use starting point. Use it as-is to see how it works, then change the highlighted fields so it matches how your practice runs day to day.

It's made of two kinds of pieces:

  • Fixed pieces hold the agent's judgement and the safety rules that keep it reliable. Leave these as they are.
  • Fillable pieces (shown in [BRACKETS]) are the details you swap for your own apps, channel, and contact details.

Trigger

What starts the agent.

Trigger When it runs
New lab result in your EHR Once for each result, the moment it lands.

Instructions

Paste this into your agent. Change the highlighted [BRACKETED] fields to match your practice; leave the rest as it is.

Full instructions — paste into the agent
WHEN THIS RUNS
You run once for each new lab result. The result that just landed gives you a
patient id and a lab result id — nothing else. You look up the rest yourself.

STEPS
1. Get the full lab result from [EHR_APP] using the lab result id — the test
   name, value, normal range, flag, and status.
2. Get the patient from [EHR_APP] using the patient id — their first name and
   mobile number.
3. Decide how serious the result is, on your own (this is your judgement, not
   a separate app). Settle on exactly one label:
   • URGENT — a dangerous value, a result flagged HH or LL, or anything marked
     urgent or critical.
   • A BIT OFF — out of the normal range or flagged H, L, or A, but not urgent.
   • NORMAL — in range and not flagged.
   If there's no flag AND no readable range, or the details don't agree, treat
   it as URGENT and send it to a person. Round up when you're unsure — never
   assume a result is normal. A serious result slipping through is the
   dangerous mistake here.
4. Take exactly one path, based on the label:
   • NORMAL    - send the patient ONE text via [SMS_APP] using the fixed
                 "all clear" message below. No value, no range. Post a short
                 run summary to [CLINICAL_CHANNEL]. Stop.
   • A BIT OFF - send the patient ONE text via [SMS_APP] using the fixed
                 "book a follow-up" message below (never put the result in it).
                 Post a follow-up note to [CLINICAL_CHANNEL] (patient name,
                 patient id, lab result id, "follow-up requested"). Post a run
                 summary. Stop.
   • URGENT    - do NOT text the patient. Post to [CLINICAL_CHANNEL] tagging
                 [ON_CALL_TAG] with the patient name, patient id, lab result
                 id, and the flagged value. Post a run summary. Stop.

WHEN SOMETHING'S UNCLEAR
- No mobile number on file - skip the text, note it in the summary, and on the
  normal / a-bit-off paths post to [CLINICAL_CHANNEL] so a person can reach the
  patient another way.
- More than one patient matches - don't text anyone. Post the patient id and
  lab result id to [CLINICAL_CHANNEL] for someone to check, and stop.
- A step fails - try it up to 3 times; if it still fails, post a note to
  [CLINICAL_CHANNEL] and stop.

WHEN YOU'RE DONE
- The result ended up with exactly one label and exactly one path ran.
- Any patient text used the fixed message only — no value, no range, no
  explanation.
- A run summary was posted to [CLINICAL_CHANNEL].

GUARDRAILS
- Try a failed step up to 3 times before stopping.
- Send at most one text per run, and never send any text on the URGENT path.
- Never put the result value, the range, or any explanation in a patient text
  — use the fixed messages exactly as written.
- When the run is finished, stop.

FIXED PATIENT TEXTS (fill the [BRACKETS], keep the rest as it is)
NORMAL:
  Hi [first_name], your recent lab results are now available through your
  patient portal. No action is needed on your part. If anything needs
  follow-up, your care team will reach out. Questions? Call us at
  [PRACTICE_PHONE].
A BIT OFF:
  Hi [first_name], your care team has reviewed your recent labs and would
  like to see you for a follow-up. Please book a time here: [SCHEDULING_LINK]
  or call [PRACTICE_PHONE].

Tools to select

Tools are the actions you let your agent take inside your apps.

Role What we used here What it's for
Trigger New lab result in the EHR Starts the agent each time a result lands.
EHR / practice system Athena Health — get lab result, get patient Where the agent reads the result and the patient's details.
Text messaging Twilio — send SMS Sends the patient the all-clear or the follow-up message.
Clinical channel Slack — send message Where the escalation, the follow-up note, and the run summary go.

Swap any of these for the equivalent tool your practice already uses. There's no separate "AI" tool to add — deciding how serious the result is happens in the agent's own thinking.

What to fill in

These are the only things you change so the agent fits your practice. Everything else stays the same.

Field What to put Example
[EHR_APP] The EHR or practice system you use Athena Health
[SMS_APP] The text-messaging tool you use Twilio
[CLINICAL_CHANNEL] Your care team's channel Slack · #clinical
[ON_CALL_TAG] The handle or group to tag for urgent results @oncall
[PRACTICE_PHONE] Your front-desk number (415) 555-0100
[SCHEDULING_LINK] Your booking link yourclinic.com/book

What it produces

Every time it runs, the agent sorts each result into one of three outcomes, based on how serious it is:

Outcome What the result showed What the agent did Why
A bit off HbA1c 7.8% (normal range 4.0–5.6), flagged H — Dana's result. Sent Dana one text asking her to book a follow-up, with no result value in it, and posted a follow-up note plus a run summary to the clinical channel. When a result is out of range but not urgent, the patient just needs to come in — so the agent invites them to book, and keeps the actual numbers with the care team.
Urgent Potassium 6.9 mmol/L (normal range 3.5–5.1), flagged HH — Priya's result. Sent no text. Tagged the on-call clinician in the clinical channel with the flagged value, and posted a run summary. A dangerous value is a clinician's to act on, not something a patient should read in a text — so the agent skips the patient message entirely and gets a person on it right away.
Urgent (needs a person) A microbiology culture marked "See comment", with no flag and no readable range — Sam's result. Sent no text. Escalated it as needing a person to look, and posted a run summary. When the result is missing the signals the agent needs, it treats that as a risk, not as "probably fine" — so it sends it to a person instead of texting a reassuring "all clear" on something nobody has checked.
A bit off — patient text (verbatim)

Patient text (verbatim)

Hi Dana, your care team has reviewed your recent labs and would like to see you for a follow-up. Please book a time here: {scheduling_link} or call {practice_phone}.

The clinical channel got: name Dana, patient id A-51877, lab result id LR-99014, label=ABNORMAL, follow-up requested.

Urgent — clinician escalation (verbatim)

Clinical channel (verbatim)

@oncall name Priya, patient id A-60233, lab result id LR-99027, label=CRITICAL, flagged value: Potassium 6.9 mmol/L (HH).

No text was sent. The flagged value is carried through exactly so the on-call clinician acts on the real number.

Urgent (needs a person) — escalation (verbatim)

Clinical channel (verbatim)

name Sam, patient id A-71004, lab result id LR-99040, label=CRITICAL (needs-review: no flag / unreadable range).

A preliminary result with no flag and no readable range is exactly the case where an "all clear" text would be wrong — so it goes to a person instead.

Try a variation

  • "On the a-bit-off path, book the follow-up directly instead of sending a link." (add your EHR's open-slots and book-appointment actions to that path)
  • "Send urgent results to a dedicated on-call channel, separate from routine follow-up notes." (split [CLINICAL_CHANNEL] into two)
  • "Send the run summary to a second channel so team leads can see how many of each type come through." (list both channels in the summary step)

Make it yours

  • Change the highlighted fields, not the rest. The three labels, the round-up rule, and the fixed patient texts are what keep the agent safe — leave those as they are.
  • Match your own apps. Swap Athena Health, Twilio, and Slack for the EHR, texting tool, and care-team channel your practice already uses (a clinical inbox or Teams works too).
  • The decision lives in one place. The agent settles on one label, then sends a fixed message — that one separation is what stops it from ever explaining a result to a patient.
  • Round up when it's unsure — on purpose. A missing flag or an unreadable range goes to a clinician, never to a cheerful "all clear" text. A serious result slipping through is the danger with labs.
  • Let it ask for help. The agent sorts and routes; it never diagnoses, never prescribes, and never tells a patient what a result means. A person owns every clinical conversation.

Helpful articles

Was this article helpful?
0 out of 0 found this helpful

Articles in this section