Post-discharge follow-up

A follow-up call for every patient who goes home.

Discharge starts a loop. It calls the patient, asks the questions your team would ask, checks their own words against a fixed red-flag list, and gets the urgent ones to a person straight away.
The problem

Why follow-up calls get missed

“Calls happen when a nurse is free.”

On a busy ward, that can mean days later, or never.

“We hear about problems at readmission.”

A question nobody asked at home turns into a visit back.

“Notes from the call never reach the file.”

What the patient said lives in someone’s notebook.
How the loop works

How the follow-up loop runs

  1. Discharge starts it. Your patient system starts the loop with the patient, the reason for the stay and the time to call.
  2. A call that asks the right questions. A voice loop calls the patient and asks the questions your team scripts for that kind of stay.
  3. Red flags by rule. The patient’s own words are checked against a fixed red-flag list. Urgency is decided by rules, not by a model’s reading.
  4. Urgent answers reach a person. When a flag fires, the loop returns the right emergency number for the country and alerts your team.
  5. A summary on file. Every call ends with a transcript and a summary, sent to the patient’s file.
discharge-call.tsTypeScript
interface Discharge {
  patientId: string;
  phone: string;
  stay: string;
  country: string;
}

export class HealthLoop extends Workflow {
  async run(event: HealthEvent<Discharge>, step: HealthStep) {
    const { patientId, phone, stay, country } = event.body;

    const { sessionId } = await step.do("Follow-up call", ({ ctx }) =>
      ctx.startVoice({ loopId: "discharge-call", to: phone, body: { stay } }),
    );
    const call = await step.waitForVoiceComplete({
      sessionId,
      timeout: "1 hour",
    });

    const words = call.transcript
      .filter((t) => t.role === "user")
      .map((t) => t.content)
      .join(" ");
    const check = await step.do("Check red flags", ({ ctx }) =>
      ctx.HEALTH_CALCULATOR.symptomRedFlags({
        symptom: `recovery after ${stay}`,
        memberWords: words,
      }),
    );

    if (check.frame === "urgent") {
      const routing = await step.do("Emergency routing", ({ ctx }) =>
        ctx.HEALTH_CALCULATOR.emergencyRouting({
          country,
          concern: "medical_emergency",
        }),
      );
      await step.do("Alert the ward", async () => {
        await fetch(`${this.env.WARD_API}/alerts`, {
          method: "POST",
          body: JSON.stringify({ patientId, flags: check.redFlags, routing }),
        });
      });
    }

    await step.do("File summary", async () => {
      await fetch(`${this.env.WARD_API}/patients/${patientId}/notes`, {
        method: "POST",
        body: JSON.stringify({ summary: call.summary, frame: check.frame }),
      });
    });
  }
}
Channels and integrations

What the loop works with

Phone calls. Outbound calls to a phone number, or a browser call from your app. Each call ends with a transcript and a summary.
Health reference tools. Published adult reference ranges, public medicine label data, plain-language health topics, packaged-food lookups and nearby care.
SMS. One message or up to 500 at once, with opt-out checks and timed delivery.
Your own systems. Loops call your endpoints to read data and send results back. Your systems start loops with one authenticated API call.
Data and compliance

How data is handled

Wellness, not diagnosis. Ollie is a wellness product, not a medical device. Loops do not diagnose, and scan readings are wellness readings, not clinical results.
Rules, not guesses. Red flags come from a fixed list that matches the patient’s own words. The check can say a symptom shouldn’t wait. It never says what the cause is.
A record of every run. The trigger, each step and its result, every tool call, every log line and every error are kept for your team to review.
FAQ

Questions

What is a post-discharge follow-up loop?

It is a Health Loop that calls a patient after they go home, asks the questions your team scripts, checks their answers against a fixed red-flag list, alerts your team when a flag fires and files a summary of the call.

Does the loop give medical advice?

No. It asks your questions, records the answers and routes urgent ones to people. When a red flag fires, it gives the country’s emergency number and alerts your team.

What if the patient doesn’t answer?

The call ends with a summary that says so, and the loop decides what comes next, such as a text or a second call started by your system.

See this loop run on your own journey.