DEV Community

Alex Kane
Alex Kane

Posted on

n8n for Healthcare: 5 Automations for Clinics, Practices, and Health Tech Teams (Free Workflow JSON)

Running a clinic or health-tech team means juggling patient communication, staff coordination, billing, and compliance — all at once. Manual follow-ups slip through the cracks, staff waste hours on phone tag, and admin teams drown in spreadsheets.

n8n can automate the repetitive layer without touching your EHR core. Here are 5 workflows that real practices can run today.

Note on HIPAA: For workflows that touch Protected Health Information (PHI), use self-hosted n8n and keep patient data in your own infrastructure. Never route PHI through untrusted third-party services. The workflows below are designed to work with internal databases and your own credentials.


1. Patient Appointment Reminder Sequence

Pain point: No-shows cost the average clinic $200+ per slot. Phone-tag reminders eat 1-2 hours of front-desk time per day.

Workflow: Webhook from your scheduling system (or a Google Sheets trigger) fires 48 hours and 2 hours before each appointment. Sends a personalized email and optional SMS via Twilio.

{
  "nodes": [
    {
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": { "interval": [{ "field": "hours", "hoursInterval": 1 }] }
      }
    },
    {
      "name": "Read Appointments",
      "type": "n8n-nodes-base.googleSheets",
      "parameters": {
        "operation": "readRows",
        "sheetId": "YOUR_SHEET_ID",
        "range": "Appointments!A:F"
      }
    },
    {
      "name": "Filter Upcoming",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "const now = new Date();\nreturn $input.all().filter(item => {\n  const appt = new Date(item.json.appointment_datetime);\n  const hoursAway = (appt - now) / 3600000;\n  return (hoursAway >= 47 && hoursAway <= 49) || (hoursAway >= 1.5 && hoursAway <= 2.5);\n});"
      }
    },
    {
      "name": "Send Reminder Email",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{ $json.patient_email }}",
        "subject": "Reminder: Your appointment on {{ $json.appointment_datetime }}",
        "message": "Hi {{ $json.patient_name }},\n\nThis is a reminder for your appointment on {{ $json.appointment_datetime }} with Dr. {{ $json.provider }}.\n\nLocation: {{ $json.location }}\n\nIf you need to reschedule, please call us at {{ $json.clinic_phone }}.\n\nSee you soon!"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Result: No-show rate drops 25-40% (industry average for automated reminders). Front desk reclaims ~1.5h/day.


2. Lab Result Ready Notification

Pain point: Patients wait anxiously for results. Staff spend hours fielding "are my results in?" calls.

Workflow: Your lab system or EHR fires a webhook when results are ready. n8n sends the patient an email notification and alerts the ordering provider via Slack.

{
  "nodes": [
    {
      "name": "Lab Webhook",
      "type": "n8n-nodes-base.webhook",
      "parameters": { "path": "lab-result-ready", "httpMethod": "POST" }
    },
    {
      "name": "Notify Patient",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{ $json.patient_email }}",
        "subject": "Your lab results are ready — {{ $json.test_name }}",
        "message": "Hi {{ $json.patient_name }},\n\nYour {{ $json.test_name }} results from {{ $json.collection_date }} are now available.\n\nPlease log in to your patient portal or call our office to review them with your provider.\n\nIf you have urgent concerns, please call {{ $json.provider_phone }}."
      }
    },
    {
      "name": "Alert Provider",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#lab-results",
        "text": "Lab ready: *{{ $json.patient_name }}* — {{ $json.test_name }} ({{ $json.result_flag }}). Review before patient portal release. [Order: {{ $json.order_id }}]"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Result: Patient satisfaction scores rise. Staff field 30-50% fewer inbound calls about results status.


3. Staff Schedule Change Alert

Pain point: Last-minute shift changes cause coverage gaps. Staff find out about changes too late.

Workflow: Monitors your scheduling spreadsheet (or a Google Sheets trigger on edits). When a shift is modified or added, sends instant Slack messages and emails to affected staff.

{
  "nodes": [
    {
      "name": "Schedule Sheet Trigger",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "parameters": {
        "sheetId": "YOUR_SCHEDULE_SHEET_ID",
        "range": "Schedule!A:H",
        "event": "rowAdded"
      }
    },
    {
      "name": "Parse Change",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "return [{ json: {\n  staff_name: $json['Staff Name'],\n  shift_date: $json['Date'],\n  shift_start: $json['Start Time'],\n  shift_end: $json['End Time'],\n  department: $json['Department'],\n  staff_email: $json['Email'],\n  change_type: $json['Change Type'] || 'Updated'\n}}];"
      }
    },
    {
      "name": "Slack Alert",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#staff-scheduling",
        "text": "📋 Schedule {{ $json.change_type }}: *{{ $json.staff_name }}* — {{ $json.shift_date }}, {{ $json.shift_start }}–{{ $json.shift_end }} ({{ $json.department }})"
      }
    },
    {
      "name": "Email Staff Member",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{ $json.staff_email }}",
        "subject": "Schedule {{ $json.change_type }}: {{ $json.shift_date }}",
        "message": "Hi {{ $json.staff_name }},\n\nYour schedule has been updated:\n\nDate: {{ $json.shift_date }}\nShift: {{ $json.shift_start }} – {{ $json.shift_end }}\nDepartment: {{ $json.department }}\n\nPlease confirm receipt by replying to this email."
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Result: Coverage gaps caught early. Staff respond faster. Scheduling managers save 30-45 min/day on manual communication.


4. Insurance Eligibility Flag & Daily Briefing

Pain point: Billing denials from eligibility lapses cost clinics thousands per month. Front desk discovers issues at check-in — too late.

Workflow: Runs each morning. Pulls tomorrow's appointments from Sheets, checks each patient's insurance status via your clearinghouse API, flags issues in a dedicated Slack channel, and emails the billing team a summary.

{
  "nodes": [
    {
      "name": "Daily 7AM Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": { "interval": [{ "field": "cronExpression", "expression": "0 7 * * *" }] }
      }
    },
    {
      "name": "Get Tomorrow Appointments",
      "type": "n8n-nodes-base.googleSheets",
      "parameters": {
        "operation": "readRows",
        "sheetId": "YOUR_SHEET_ID",
        "range": "Appointments!A:G",
        "filters": { "conditions": [{ "field": "date", "value": "=TOMORROW()" }] }
      }
    },
    {
      "name": "Check Eligibility API",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "method": "POST",
        "url": "https://api.yourclearinghouse.com/eligibility",
        "headers": { "Authorization": "Bearer YOUR_CLEARINGHOUSE_TOKEN" },
        "body": {
          "patient_id": "={{ $json.patient_id }}",
          "insurance_id": "={{ $json.insurance_id }}",
          "service_date": "={{ $json.appointment_date }}"
        }
      }
    },
    {
      "name": "Flag Issues",
      "type": "n8n-nodes-base.if",
      "parameters": {
        "conditions": {
          "string": [{ "value1": "={{ $json.eligibility_status }}", "operation": "notEqual", "value2": "active" }]
        }
      }
    },
    {
      "name": "Alert Billing Slack",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#billing-alerts",
        "text": "⚠️ Eligibility issue: *{{ $json.patient_name }}* (appt {{ $json.appointment_datetime }}) — status: {{ $json.eligibility_status }}. Insurance: {{ $json.insurance_name }}. Resolve before check-in."
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Result: Billing denials from eligibility issues drop 60-80%. Front desk resolves problems the day before, not at check-in.


5. Weekly Clinic Performance Dashboard

Pain point: Administrators lack a quick view of key metrics. Pulling reports from the EHR takes 30+ minutes every Monday.

Workflow: Every Monday at 8 AM, pulls last week's appointment data from Sheets (or your EHR API), calculates KPIs, and emails a formatted HTML dashboard to admin and providers.

{
  "nodes": [
    {
      "name": "Monday 8AM Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": { "interval": [{ "field": "cronExpression", "expression": "0 8 * * 1" }] }
      }
    },
    {
      "name": "Pull Last Week Data",
      "type": "n8n-nodes-base.googleSheets",
      "parameters": {
        "operation": "readRows",
        "sheetId": "YOUR_SHEET_ID",
        "range": "Appointments!A:K"
      }
    },
    {
      "name": "Calculate KPIs",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "const rows = $input.all().map(r => r.json);\nconst total = rows.length;\nconst noShows = rows.filter(r => r.status === 'no_show').length;\nconst cancelled = rows.filter(r => r.status === 'cancelled').length;\nconst completed = rows.filter(r => r.status === 'completed').length;\nconst revenue = rows.reduce((sum, r) => sum + (parseFloat(r.billed_amount) || 0), 0);\nreturn [{ json: {\n  total, noShows, cancelled, completed, revenue: revenue.toFixed(2),\n  noShowRate: ((noShows / total) * 100).toFixed(1),\n  utilizationRate: ((completed / total) * 100).toFixed(1)\n}}];"
      }
    },
    {
      "name": "Send Dashboard Email",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "admin@yourclinic.com",
        "subject": "Weekly Clinic Performance — Week ending {{ $now.format('MMM DD, YYYY') }}",
        "message": "<h2>Weekly Performance Dashboard</h2><table border='1' cellpadding='8'><tr><th>Metric</th><th>Value</th></tr><tr><td>Total Appointments</td><td>{{ $json.total }}</td></tr><tr><td>Completed</td><td>{{ $json.completed }}</td></tr><tr><td>No-Shows</td><td>{{ $json.noShows }} ({{ $json.noShowRate }}%)</td></tr><tr><td>Cancellations</td><td>{{ $json.cancelled }}</td></tr><tr><td>Utilization Rate</td><td>{{ $json.utilizationRate }}%</td></tr><tr><td>Total Billed</td><td>${{ $json.revenue }}</td></tr></table>",
        "isHtml": true
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Result: Monday morning briefing lands in inboxes automatically. Admin team saves 30+ minutes per week. Administrators and providers start each week with clear data.


Putting It Together

These 5 workflows address the highest-friction points in clinic operations:

Workflow Time Saved Who Benefits
Appointment Reminders 1.5h/day Front desk
Lab Notifications 45 min/day Nursing, front desk
Schedule Alerts 30 min/day Scheduling managers
Eligibility Checks $500-2000/month in denials avoided Billing team
Weekly Dashboard 30 min/week Administrators

Getting started: Pick the one that hurts most right now. Install n8n (self-hosted for PHI workflows, n8n.io cloud for non-PHI). Adapt the JSON to your data sources.

If you want a pre-built, ready-to-import version of the core workflows (Email Auto-Responder, Lead Capture, Daily Report, Invoice Generator, AI Support Bot), grab them at stripeai.gumroad.com — they drop straight into any n8n instance.


What automations are you running in your healthcare or health-tech context? Drop a comment below — I read every one.

Top comments (0)