All Projects

Medical Practice Intake Automation

Medical Practice Intake Automation

A multi-location medical practice was spending 14+ hours per week on manual patient intake: copying form submissions into the EHR, checking insurance status, manually booking slots in the scheduling system, and sending confirmation details by hand.

We replaced the entire flow with a self-hosted n8n pipeline that runs end-to-end without staff involvement.

The Workflow

Trigger: Typeform Intake Submission

The workflow starts when a new patient submits the intake form on the practice website. The Typeform webhook fires into n8n immediately.

Node 1 - Typeform Webhook Receives the intake submission. Extracts: patient name, DOB, contact info, insurance provider, insurance ID, reason for visit, preferred appointment window.


Branch A: Insurance Pre-Verification

Node 2 - HTTP Request → Availity API Submits insurance ID and provider to the Availity real-time eligibility API. Returns coverage status, copay amount, and deductible remaining.

Node 3 - IF Node: Coverage Valid?

  • If covered → continues to scheduling branch
  • If not covered / inactive → routes to manual review queue (Slack alert to front desk)

Branch B: Appointment Scheduling

Node 4 - HTTP Request → EHR Scheduling API (DrChrono) Queries available appointment slots matching the patient's preferred window and visit type. Returns a list of open slots.

Node 5 - Code Node (JavaScript) Selects the earliest available slot within the patient's preferred 3-day window. Falls back to next available if no match.

Node 6 - HTTP Request → DrChrono: Create Appointment Books the selected slot. Creates the patient record if new (checks by DOB + name match first). Returns appointment ID and confirmation details.


Branch C: EHR Record Creation

Node 7 - HTTP Request → DrChrono: Create/Update Patient Upserts the patient record with all intake form data: demographics, insurance, reason for visit, referring source.

Node 8 - HTTP Request → DrChrono: Attach Intake Form Uploads the raw form responses as a PDF attachment to the patient chart.


Confirmation & CRM

Node 9 - Twilio SMS Sends the patient a confirmation SMS: appointment date/time, location address, what to bring (insurance card, ID), and a 24-hour cancellation link.

Node 10 - Twilio SMS (48h reminder) Schedules a reminder SMS via n8n's built-in scheduler that fires 48 hours before the appointment with a one-click confirm/cancel link.

Node 11 - HubSpot: Create Contact Creates or updates the patient record in HubSpot with source = "intake-form", appointment date, insurance status, and location. Used for recall campaigns and no-show tracking.

Node 12 - Google Sheets: Log Appends a row to the practice's daily intake log: timestamp, patient name, appointment time, insurance status, slot source. Used for end-of-day reporting.


Error Handling

Node 13 - Error Trigger Catches any node failure. Routes to a Slack alert with the failed node name, error message, and the raw patient data, so staff can manually recover without losing the submission.


Results

  • 14 hrs/week of admin work eliminated
  • avg 4 min from form submission to confirmed appointment (was 2–3 business hours)
  • Zero data-entry errors into EHR (previous error rate: ~8% requiring correction)
  • Insurance pre-check catches inactive coverage before the appointment, reducing no-show-related billing issues by 60%

Stack

LayerTool
Automationn8n (self-hosted, Docker)
FormsTypeform
EHRDrChrono
InsuranceAvaility Eligibility API
SMSTwilio
CRMHubSpot
ReportingGoogle Sheets
HostingAWS EC2 (private VPC)

My Role

  • Scoped the workflow from intake to confirmation and mapped every manual step currently handled by staff
  • Built and deployed the n8n instance on a private AWS VPC (HIPAA-aligned infrastructure)
  • Integrated Availity, DrChrono, and Twilio APIs with error handling and retry logic
  • Set up the Slack error channel and daily reporting sheet
  • Ran two weeks of parallel testing before cutover with zero data loss