A recall loop that logs every message and hears who came back
Four Make scenarios recall patients who are due a check-up: eligibility is decided in Airtable, a daily scenario sends the message, logs it and tags the contact, and a webhook records who replied or booked.
Where this applies
Clinics, dentists, vets, gyms and any service that brings repeat customers back on a cycle and wants to see who responded.
- scenarios, two switched on
- 4
- patients per run at most
- 100
The problem
A recall is only as good as its follow-through. Someone has to decide who is due, send the right message, make sure nobody is messaged twice, and then find out who replied or booked. Otherwise it is a broadcast, not a loop.
The rules about who is due change, and they should be changeable by the people who understand them, not by whoever maintains the automation.
What we built
Eligibility lives in the base, not in Make
Whether a patient is due is a formula field in Airtable. The scenario searches a view for rows where 'recall eligible' is true and reads nothing else, so staff change the rule by editing a formula, never a scenario. Two batch scenarios help the formula: one flags records whose medication courses run 60 or 90 days using an aggregate-then-test pattern and a blank-flag work queue, the other links those medications onto the patient by position.
Message content in data
The template id is stored on the patient row by condition, so the wording changes without editing Make. The message carries the patient's first name, title-cased, with a generic fallback.
Send, log, mark, tag
A daily scenario, capped at 100 patients a run as a limit on rate and blast radius, sends the template, writes a log row (send time, days since the last visit, condition, template, mode, status, replied and booked both No) and stamps the patient's last-recall date, which flips the eligibility formula off so nobody is messaged twice. It then merges a recall tag onto the contact's existing tags rather than replacing them.
A failed send stays eligible
If the send fails, the run stops before the log and the stamp, so the patient is still eligible and is retried the next day.
Closing the loop with a webhook
When the messaging system reports that a recalled patient replied or booked, a webhook finds the log row by phone number and sets Patient Replied or Appointment Booked to Yes, with the date. Staff can then see, per recall, who came back.
The outcome
The live recall has 30 runs and 180 operations in Make's counters, with no errors. Most days it costs one operation because nobody is due; on five days it messaged patients, about one or two each.
The reply webhook has run once so far, at two operations.
The two batch scenarios that prepare the medication data are built and switched off and have no run history.
Where it stops
The recall is small so far. The scenarios do not themselves check consent or opt-out, and have no error routes. The reply webhook matches by phone number and updates every matching log row, including older ones, and the phone format has to match exactly between the messaging system and the log. A status it does not recognise is accepted and ignored. The medication scenarios match values by position across comma-separated lists and overwrite rather than merge, and a text match on '60' would also match '160'.
Built with
- Make.com
- Airtable
- Webhooks
- HTTP API
Patterns used
- Eligibility as a formula
- Template id in data
- Stamp flips the formula off
- Webhook closes the loop
Page copy drafted with AI assistance. Skofi is accountable for it. Editorial policy
Have something shaped like this?
If any part of the above resembles a problem you are living with, a short call is the fastest way to find out whether it is the same problem underneath.
What happens on the call
- 15 minutes, no deck
- We map the process on the call
- A written scope, or an honest no