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
| Layer | Tool |
|---|---|
| Automation | n8n (self-hosted, Docker) |
| Forms | Typeform |
| EHR | DrChrono |
| Insurance | Availity Eligibility API |
| SMS | Twilio |
| CRM | HubSpot |
| Reporting | Google Sheets |
| Hosting | AWS 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