Available for work — Book a 30-minute call

Clinic Inbox Email Assistant

An assistant on a small clinic's shared inbox. Every new email is classified and routed: system mail and newsletters filed by rule, routine questions drafted from the clinic's own knowledge base for staff to send, booking requests answered with the booking link, and anything medical, a complaint or a reported reaction sent straight to the owner in Slack. Every email is categorised and logged. After it handled a cancellation correctly but missed the rest of a patient's email, automatic replies were switched off and it was kept for sorting.

Role
Designed and built
Sector
Massage therapy
Status
Ran on the clinic's inbox in June 2026; since then limited to sorting email
Stack
n8n, Microsoft Outlook (Graph API), OpenAI, Pinecone, Slack, Google Sheets, JavaScript

The problem

The clinic's shared inbox was one stream: newsletters, supplier invoices, booking-system and CRM notifications, referrals from other providers, and patients. The urgent email could sit behind the noise, and routine questions took the owner's time.

What was built

A 32-node n8n workflow on the clinic's Outlook inbox:

  • Intake: each new email is normalised and de-duplicated, so nothing is processed twice.
  • Rules before the model: known system, vendor and internal senders are filed without a model call.
  • Classification: a small model returns intent and urgency; a code router, not the model, picks the branch, the Outlook category and the folder.
  • Drafts: routine questions get a reply drafted by a larger model from the clinic's knowledge base (the same index as its SMS booking assistant), saved as a draft for staff to check and send. Booking requests get a draft with the booking link.
  • Escalation: medical questions, complaints, legal mentions, adverse reactions, provider correspondence and low-confidence classifications go to the owner in Slack, labelled by type.
  • Audit: every email is categorised in Outlook and logged to a sheet.

The hard part

A correct action on half an email. For a while the assistant also handled cancellations by email, with deliberately strict rules: it cancelled only on an explicit "cancel", treated anything ambiguous as a reschedule and drafted two open slots instead, and drafted rather than sent when more than one appointment matched. Then a patient asked, in one email, to cancel and also asked other questions. It cancelled correctly and answered nothing else, and the patient was confused. The fix was not another rule: automatic replies were switched off, cancellations went back to a person, and the assistant was kept for what it did reliably, sorting and escalating.

Rules first, model second. Most of the inbox was notifications and newsletters. Filing those by sender before classification cut model calls and kept marketing mail out of the owner's Slack.

What can be verified

  • A 32-node workflow, versioned from v1.4 to v2.1 in its own code comments
  • Senders filed by rule before any model call
  • Six labelled escalation types sent to Slack
  • Drafts grounded in the clinic's own knowledge base
  • Automatic replies switched off in June 2026 after a real failure, and the bot kept for sorting

The workflow

The n8n graph for the email assistant. An Outlook trigger feeds a loop that normalises each email, checks for duplicates and asks an AI model to classify it. A router and a switch then send it to one of several branches: knowledge-base search and an AI-drafted reply, a booking-link draft, a Slack escalation, or filing it away, with a deactivated cancel-and-reschedule branch along the top. All branches merge to apply Outlook categories and write a log row. (select to enlarge)
Thirty-two nodes. Classification in the middle, branches to the right, everything merging into categories and an audit log. The top row is the cancel-and-reschedule branch, switched off after the June incident. Select the image to enlarge it — a graph this wide is not legible on a phone.

On numbers: every figure above is an artefact count or a measured technical value. No business-outcome metric, whether time saved, revenue or conversion, was captured on these engagements, so none is claimed.

On status: reflects repository evidence and platform backups, not a live systems check.

Book a 30-min call