Check-in and care-gap outreach

Reach everyone who is due, not just the ones who reply.

Your system knows who is due a check-in, an annual screening or a programme step. A loop works through that list: a scan link first, a call when nobody responds, and the outcome back in your system.
The problem

Why outreach falls short

“The list is longer than the team.”

Outreach stops when the call centre runs out of hours.

“One text, then silence.”

Campaigns send a message and never follow up with the people who didn’t respond.

“We can’t tell who was actually reached.”

Sent is not the same as spoken to.
How the loop works

How the outreach loop runs

  1. Your system picks who is due. It starts one run per member with the reason for the check-in. Gaps are defined by your rules, not guessed by the loop.
  2. A scan link first. The member gets a wellness scan link and a snapshot when they finish.
  3. A call when nobody responds. If no scan arrives in time, the loop places a short check-in call instead of sending another text.
  4. The outcome goes back. Scanned, called or unreachable, with a report link or call summary, sent to your system.
check-in.tsTypeScript
interface Due { memberId: string; phone: string; reason: string }

export class HealthLoop extends Workflow {
  async run(event: HealthEvent<Due>, step: HealthStep) {
    const { memberId, phone, reason } = event.body;

    // The trigger response carries the scan link for your message.
    await step.do("Open scan", async ({ ctx }) => {
      const member = await ctx.USER.getUser({ id: memberId });
      await ctx.FACIAL_SCAN.create({ user: member, metadata: { reason } });
    });

    try {
      const scan = await step.waitForScan({ timeout: "2 days" });
      const report = await step.do("Report link", () => scan.pdfUrl());
      return { outcome: "scanned", report };
    } catch {
      // No scan in two days: a short call instead of another text.
      const { sessionId } = await step.do("Check-in call", ({ ctx }) =>
        ctx.startVoice({
          loopId: "check-in-call",
          to: phone,
          body: { reason },
        }),
      );
      const call = await step.waitForVoiceComplete({
        sessionId,
        timeout: "1 hour",
      });
      return { outcome: "called", summary: call.summary };
    }
  }
}
Channels and integrations

What the loop works with

Wellness scans. A phone-camera scan behind a consent screen, with a hosted PDF report. The scan link works from your app, a text message or WhatsApp.
Phone calls. Outbound calls to a phone number, or a browser call from your app. Each call ends with a transcript and a summary.
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

Your own data plane. Each organisation’s loops, runs, members and keys live in that organisation’s own store, apart from every other customer.
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.
Your rules decide who is due. The loop works from the list your system sends. It does not decide on its own who needs care.
FAQ

Questions

What is care-gap outreach with Health Loops?

Your system marks who is due a check-in, screening or programme step, and a Health Loop contacts each person: a wellness scan link first, a call if they don’t respond, and the outcome sent back to your system.

Does the loop decide who has a care gap?

No. Who is due comes from your own rules and data. The loop handles the contact and records what happened.

Can the loop remind people to book a screening?

Yes. It can text or call to remind someone a screening is due and point them to where to book. It does not carry out or interpret screenings.

How many members can it reach at once?

Each member is a separate run, so your system can start as many as your list holds. A single text step can also send up to 500 messages at once.

See this loop run on your own journey.