53 min readDeterministic automation

Implementation Guide: Auto-schedule follow-up appointments based on visit type and protocol

Step-by-step implementation guide for deploying AI to auto-schedule follow-up appointments based on visit type and protocol for Healthcare clients.

Hardware Procurement

Dell PowerEdge T150 Tower Server

Dell TechnologiesPET150_Q2FY25_T150Qty: 1

$2,224 MSP cost (via Dell Partner Direct or distribution) / $2,780–$3,100 suggested resale with 25% markup

On-premises server for practices running Dentrix, Eaglesoft, or Open Dental locally. Hosts the PMS database, handles API sync operations with the engagement platform, and provides local scheduling data for the automation workflow. Suitable for practices with 5–15 concurrent users. Includes Intel Xeon E-2300 series processor, 8 GB DDR4 ECC RAM (upgrade to 16 GB recommended), 4 drive bays for RAID storage, and iDRAC 9 for MSP remote management. Skip this item if the practice already has an adequate server or uses a cloud-based PMS.

Dell PowerEdge T350 Tower Server

Dell TechnologiesPET350_Q2FY25_T350Qty: 1

$4,500–$6,000 MSP cost configured / $5,625–$7,500 suggested resale with 25% markup

Upgraded on-premises server for larger practices with 15–50 users or multi-location hub configurations running Dentrix Enterprise, Eaglesoft, or Open Dental. Offers 8 drive bays, redundant PSU, more powerful Xeon E-2300 options, and supports up to 128 GB RAM. Only procure if the existing server is inadequate or absent. Skip for cloud PMS deployments.

Dell OptiPlex 7020 SFF Workstation

Dell TechnologiesOptiPlex 7020 SFFQty: 3

$950–$1,200 MSP cost per unit / $1,150–$1,500 suggested resale per unit

Front desk and provider workstations for accessing PMS and scheduling interface. Spec: Intel Core i5-14500 (3.0 GHz+), 16 GB DDR5 RAM, 512 GB NVMe SSD, Windows 11 Pro 64-bit. Meets or exceeds Dentrix 2026 recommended specifications. Quantity varies by practice size—typically 2–5 workstations per location. Skip if existing workstations meet the minimum specs (Core i5, 16 GB RAM, SSD, Windows 10/11 Pro 64-bit).

APC Smart-UPS 1500VA LCD

APC (Schneider Electric)SMT1500Qty: 1

$550 MSP cost / $700 suggested resale

Uninterruptible power supply for the on-premises server to prevent data corruption during power events. Critical for protecting PMS database integrity and ensuring the scheduling automation engine maintains consistent state. Skip for cloud-only deployments.

Software Procurement

NexHealth Patient Engagement Platform

NexHealth, Inc.Starter to Pro tierQty: Per location

$350–$550/month per location. MSP resale margin of $50–$150/month per location via NexHealth Partner Program.

Primary patient engagement and scheduling automation platform. Provides real-time bidirectional sync with PMS (Dentrix, Eaglesoft, Open Dental, eClinicalWorks, and 20+ systems), automated recall/follow-up scheduling based on procedure codes, patient self-scheduling portal, SMS/email appointment reminders, and RESTful API for custom workflow triggers. This is the engine that executes the auto-scheduling logic.

Contact Keragon for pricing; estimated $200–$500/month for practice-level workflows. Includes BAA on paid plans.

Optional middleware for practices requiring custom automation logic beyond what NexHealth provides natively. Use Keragon to build no-code workflows that connect PMS events (procedure completion) to custom scheduling rules, CRM updates, or multi-step patient communication sequences. Only needed if the primary engagement platform lacks a specific integration or if the practice has complex multi-provider routing rules.

Free tier: 100K API calls/month. Paid tiers: contact for pricing. Estimated $100–$300/month for active practice integration.

Optional unified REST API layer for MSPs managing multiple practices across different PMS platforms (Dentrix, Eaglesoft, Open Dental, and 27+ systems). Provides a single API interface to read/write patient, appointment, and scheduling data regardless of underlying PMS. HIPAA-compliant with real-time sync. Use when building custom integrations or managing a portfolio of practices on heterogeneous PMS platforms.

Starting at $399/month per location. MSP margin via partner/referral arrangement.

Alternative to NexHealth. Best choice when the practice also wants deep analytics on production, scheduling gaps, and revenue optimization alongside the auto-scheduling automation. Integrates with Dentrix, Eaglesoft, and Open Dental. Includes automated scheduling, patient communication, and morning huddle intelligence.

$299–$329/month for 1–3 providers; $599/month for 4–10 providers. MSP margin via referral/reseller arrangement.

SaaS - monthly subscription (tiered by provider count)

Alternative engagement platform with 400+ PMS integrations via SyncAssure. Best choice for multi-specialty practices (dental + medical + vision) or practices already using Solutionreach for reminders who want to add auto-scheduling. 23 years in market with strong onboarding support.

Starting at $249–$250/month (Pro plan). Higher tiers include VoIP phones (up to 15 on Ultimate).

Alternative for practices that want to consolidate VoIP phone, scheduling, reminders, payments, and review management into a single platform. Includes automated recall scheduling and integrates with Dentrix, Eaglesoft, Open Dental, and medical EHRs. Best when the practice also needs a phone system upgrade.

SIMBUS360 HIPAA Compliance Suite

SIMBUSSaaS – white-label resale for MSPs

MSP partner pricing varies; white-labeled at MSP-determined pricing. Typical MSP charge to client: $100–$300/month.

White-label HIPAA compliance management platform for the MSP to resell. Includes risk assessment tools, policy templates, workforce training, incident tracking, and BAA management. SIMBUS handles 100% of support. MSPs report up to 46% MRR increase. Required to address HIPAA compliance obligations for this project.

Windows Server 2022 Standard

MicrosoftWindows Server 2022 Standard

$1,069 retail (OEM); $500–$700 via distribution for MSPs. Resale bundled with server hardware.

Server operating system for on-premises PMS deployments. Required for Dentrix, Eaglesoft, and Open Dental server installations. Includes Hyper-V if virtualization is needed. Skip for cloud PMS deployments.

Prerequisites

  • A functioning Practice Management System (PMS) or EHR is installed and operational with current patient records, provider schedules, and appointment types configured. Supported systems include Dentrix, Dentrix Ascend, Eaglesoft, Open Dental, Curve Dental, CareStack, athenahealth, eClinicalWorks, DrChrono, or AdvancedMD.
  • Provider schedules (time blocks, operatories, days of week) are built out in the PMS for at least 90 days into the future. The auto-scheduler cannot book into time slots that do not exist.
  • Continuing Care / Recall types are defined in the PMS with correct procedure code triggers and interval settings (e.g., D1110 → 6-month recall, D4341 → 4-week follow-up). If these are not configured, Phase 1 of implementation will need to include this setup.
  • Operatories are properly mapped to providers and appointment types in the PMS scheduling module.
  • Internet connectivity of at least 25 Mbps download / 10 Mbps upload is available. 50/25 Mbps recommended for cloud PMS deployments or practices with 10+ workstations.
  • For on-premises PMS: Server meets minimum requirements (Intel Xeon or equivalent, 16 GB RAM, 60 GB+ free disk space, Windows Server 2019 or 2022). If not, server hardware procurement is required.
  • All workstations run Windows 10 Pro 64-bit or newer (Windows 11 Pro recommended due to Windows 10 EOL in October 2025). Minimum 16 GB RAM and SSD storage.
  • The practice has designated an Office Manager or lead front-desk staff member who can serve as the primary point of contact for configuration decisions (appointment type preferences, scheduling rules, provider availability constraints).
  • The practice has executed or is willing to execute a Business Associate Agreement (BAA) with the MSP. The MSP has its own HIPAA compliance program in place.
  • Patient consent for automated SMS/email communications has been obtained or a process exists to collect it (TCPA compliance). The practice's existing patient intake forms should include communication consent language.
  • Admin-level credentials are available for the PMS system to configure API access, continuing care rules, and scheduling parameters.
  • If using Dentrix: The practice is on a current version with API Exchange access enabled. If using Open Dental: The eServices/API module is active with a current support plan ($169/month).
  • A list of all visit/procedure types performed by the practice, along with the desired follow-up appointment type and interval for each, has been documented or will be documented during the Discovery phase.

Installation Steps

...

Step 1: Discovery & Practice Audit

Conduct a comprehensive audit of the practice's current PMS setup, scheduling workflows, and follow-up protocols. This step produces the Protocol Mapping Document that drives the entire automation configuration. Meet with the Office Manager, lead dentist/physician, and front-desk staff to understand current follow-up scheduling workflows, pain points, and exceptions. Document all procedure codes performed at the practice, current continuing care/recall type configurations, provider scheduling templates, operatory assignments, and appointment type definitions. Identify the gap: how many patients are leaving without a follow-up scheduled, what the recall list backlog looks like, and where revenue is being lost.

Open Dental MySQL queries for recall types and overdue patients; Dentrix API reference for continuing care data
sql
# For Open Dental: Query current recall types and intervals
# Connect to MySQL database (Open Dental)
mysql -u root -p opendental
SELECT RecallTypeNum, Description, DefaultInterval, TimePattern FROM recalltype;
# Query patients overdue for recall
SELECT p.PatNum, p.LName, p.FName, r.DateDue, rt.Description FROM recall r INNER JOIN patient p ON r.PatNum = p.PatNum INNER JOIN recalltype rt ON r.RecallTypeNum = rt.RecallTypeNum WHERE r.DateDue < CURDATE() AND r.IsDisabled = 0 ORDER BY r.DateDue ASC LIMIT 100;
# For Dentrix: Use Dentrix API Exchange to pull continuing care data
# Endpoint: GET /v1/continuingcare?patientId={id}
# Requires Dentrix Developer API key - obtain from Henry Schein One partner portal
Note

This is the most critical step. The quality of the Protocol Mapping Document directly determines the accuracy of the auto-scheduling rules. Expect 4–8 hours of combined meeting time and documentation work. For dental practices, common protocol mappings include: D0120 (periodic exam) → 6 months, D1110 (adult prophylaxis) → 6 months, D4341 (SRP) → 4–6 weeks post-op then 3-month perio maintenance, D2740 (crown) → 2-week seat check. For medical practices: 99213/99214 (E/M visit) → varies by condition protocol, post-surgical → 2-week wound check, chronic disease management → quarterly follow-up.

Step 2: Platform Selection & Contracting

Based on the Discovery findings, select the optimal patient engagement/automation platform. The primary recommendation is NexHealth for most practices due to its universal PMS integration, real-time scheduling sync, and strong MSP partner program. Present the client with a recommendation document comparing 2–3 options with pricing, features, and integration compatibility. Execute all vendor contracts, BAAs, and MSP partner agreements.

1
Submit NexHealth Partner Program application at https://www.nexhealth.com/partners
2
Request BAA from selected engagement platform vendor
3
Execute BAA between MSP and practice client
4
Execute BAA between MSP and engagement platform vendor
5
If using SIMBUS360 for HIPAA compliance, register as MSP partner at https://www.simbus360.com
6
Document all BAA execution dates and store copies securely
Note

BAA execution is NON-NEGOTIABLE before any PHI is transmitted. Confirm the engagement platform vendor provides a signed BAA—NexHealth, Dental Intelligence, Solutionreach, and Weave all sign BAAs. Do NOT use Zapier or Make.com for any workflow involving PHI as they do not sign BAAs and are not HIPAA-compliant. If the practice uses an uncommon PMS, verify integration compatibility before signing contracts. NexHealth supports 20+ systems; Solutionreach supports 400+ via SyncAssure.

Step 3: Server & Infrastructure Preparation

Prepare the on-premises server infrastructure (if applicable) or validate cloud connectivity. For on-premises PMS: verify server meets requirements, apply Windows updates, configure remote management, and set up backup. For cloud PMS: validate internet bandwidth, configure firewall rules, and ensure workstations meet requirements. In both cases, set up the MSP's remote monitoring and management (RMM) agent.

shell
# For on-premises server - verify specs
systeminfo | findstr /C:"Total Physical Memory" /C:"OS Name" /C:"System Type"
wmic cpu get Name, NumberOfCores, MaxClockSpeed
wmic diskdrive get Size, Model

# Check available disk space
wmic logicaldisk get Caption, FreeSpace, Size

# Verify Windows Server version
winver

# Apply all pending Windows Updates
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -AutoReboot

# Configure Windows Firewall - allow outbound HTTPS for SaaS platforms
New-NetFirewallRule -DisplayName "Allow HTTPS Outbound" -Direction Outbound -Protocol TCP -RemotePort 443 -Action Allow

# Verify DNS resolution to engagement platform
nslookup api.nexhealth.com
nslookup app.nexhealth.com

# Test internet bandwidth (from server)
# Use speedtest-cli or browser-based test - minimum 25/10 Mbps

# Install MSP RMM agent (example: ConnectWise Automate)
# Download agent from MSP's RMM portal and run installer
msiexec /i "Agent_Install.msi" /quiet SERVERADDRESS=rmm.yourmsp.com

# Configure UPS monitoring (if APC Smart-UPS installed)
# Install PowerChute Business Edition on server
# Set graceful shutdown threshold to 5 minutes remaining battery
Note

For cloud PMS (Dentrix Ascend, Curve Dental, CareStack): skip server provisioning. Focus on validating that all workstations can reach the PMS and engagement platform URLs without latency. Consider implementing a secondary ISP or 4G/5G failover for practices where internet downtime means complete scheduling system failure. For Open Dental server: ensure MySQL is running on the default port 3306 and is accessible from the workstation network. For Dentrix: the database runs on a proprietary engine—do not attempt direct SQL access; use the API Exchange only.

Step 4: PMS Continuing Care & Recall Configuration

Configure or validate the continuing care / recall type settings in the PMS based on the Protocol Mapping Document from Step 1. This is the foundation of the auto-scheduling logic—each procedure code must be correctly mapped to a recall type with the proper interval. Create any missing recall types, correct any misconfigured intervals, and ensure procedure code triggers are accurate.

Open Dental, Dentrix, and Eaglesoft recall type configuration — SQL verification query and GUI navigation paths
sql
# OPEN DENTAL: Configure Recall Types via MySQL (or use GUI: Setup > Appointments > Recall Types)
# Example: Ensure D1110 (Adult Prophy) triggers 6-month recall
# In Open Dental GUI: Setup > Appointments > Recall Types > Prophy
# Set Interval to 6 months, Trigger Procedures to D1110
# Set Appointment Type to 'Prophy/Recall'

# Verify recall types via SQL:
SELECT rt.RecallTypeNum, rt.Description, rt.DefaultInterval, 
       GROUP_CONCAT(rtt.CodeNum) AS TriggerCodes
FROM recalltype rt
LEFT JOIN recalltrigger rtt ON rt.RecallTypeNum = rtt.RecallTypeNum
GROUP BY rt.RecallTypeNum;

# OPEN DENTAL: Configure Perio Maintenance recall
# Trigger procedure: D4341 (SRP), D4342 (SRP 1-3 teeth)
# Interval: 3 months (after initial 4-6 week post-op)
# In GUI: Setup > Appointments > Recall Types > Add New
# Description: 'Perio Maintenance'
# Default Interval: 3 months
# Trigger Procedures: D4341, D4342

# DENTRIX: Configure Continuing Care
# Navigate to: Office Manager > Maintenance > Practice Setup > Continuing Care Types
# For each visit type, set:
#   - Type name (e.g., 'Prophy Recall')
#   - Interval (e.g., 6 months)
#   - Attached procedure codes
#   - Auto-generate preference: ON

# EAGLESOFT: Configure Recall
# Navigate to: Activities > Recall Setup
# Define recall types with procedure codes and intervals

# Document all configurations in the Protocol Mapping spreadsheet
# Template columns: Procedure_Code | Description | Follow_Up_Type | Interval_Days | Provider_Constraint | Operatory_Constraint | Time_Block_Preference
Note

This step requires clinical input—the dentist or physician must approve all follow-up intervals. Common dental protocols: D0120 periodic exam → 6 months, D1110 adult prophy → 6 months, D1120 child prophy → 6 months, D4341 SRP → 4-6 weeks post-op then 3-month perio maintenance, D2750/D2740 crown prep → 2-3 weeks for seat, D3310-D3330 root canal → 2-4 weeks for post-op check, D7210 surgical extraction → 1 week post-op. Common medical protocols vary by specialty—document these carefully with the provider. Incorrect intervals are the #1 source of scheduling errors in this type of automation.

Step 5: Provider Schedule Template Configuration

Ensure provider schedules are built out in the PMS for at least 90–180 days into the future. The auto-scheduler can only book into time slots that exist. Configure schedule templates with appropriate time blocks for recall/follow-up appointment types, and map operatories to providers and visit types.

Open Dental SQL queries to verify schedule coverage, operatory configuration, and appointment types
sql
# OPEN DENTAL: Verify schedule exists for future dates
SELECT ScheduleDate, ProvNum, StartTime, StopTime, SchedType
FROM schedule
WHERE ScheduleDate > CURDATE()
AND ScheduleDate < DATE_ADD(CURDATE(), INTERVAL 180 DAY)
ORDER BY ScheduleDate, ProvNum
LIMIT 50;

# Check for gaps in provider schedules
SELECT DISTINCT ScheduleDate FROM schedule
WHERE ScheduleDate > CURDATE()
AND ScheduleDate < DATE_ADD(CURDATE(), INTERVAL 90 DAY)
AND ProvNum = [PROVIDER_NUM]
ORDER BY ScheduleDate;

# OPEN DENTAL: Verify operatory configuration
SELECT OperatoryNum, OpName, ProvDentist, ProvHygienist, IsHygiene
FROM operatory
WHERE IsHidden = 0;

# Verify appointment type durations are correctly set
# OPEN DENTAL: Setup > Appointments > Appointment Types
SELECT AppointmentTypeNum, AppointmentTypeName, CodeStr, Pattern
FROM appointmenttype;
  • DENTRIX: Schedule templates are configured in the Appointment Book — Navigate to: Appointment Book > Setup > Provider Setup
  • Ensure each provider has a repeating schedule template
  • Assign operatories and time block types (Recall, New Patient, Treatment, etc.)
Note

Practices commonly have provider schedules only built 30–60 days out. Work with the Office Manager to extend templates to 180 days. This is critical—if the auto-scheduler cannot find an available slot within the desired window, it will either fail silently or book too far in the future. Set up a recurring quarterly task for the MSP to verify schedule templates are extended. For multi-provider practices, ensure hygienist schedules (for prophy recall) and doctor schedules (for treatment follow-ups) are both configured with appropriate time blocks.

Step 6: Engagement Platform Account Setup & PMS Integration

Create the engagement platform account (NexHealth recommended), configure the integration with the practice's PMS, and verify bidirectional data sync. This connects the automation engine to the scheduling backbone.

1
Create practice account at https://app.nexhealth.com
2
Select PMS type during onboarding
3
Install NexHealth Synchronizer on the PMS server (for on-prem systems): Download installer from NexHealth dashboard, run as administrator on the server hosting the PMS database, follow prompts to connect to Dentrix/Eaglesoft/Open Dental
4
For Open Dental specifically — Enable API in Open Dental: Setup > Advanced Setup > API
5
Generate API credentials
6
Enter credentials in NexHealth dashboard
7
Verify sync is working: Check NexHealth dashboard for 'Sync Status: Active', verify patient count matches between PMS and NexHealth, create a test appointment in PMS and verify it appears in NexHealth within 60 seconds, create a test appointment in NexHealth and verify it appears in PMS within 60 seconds
NexHealth API verification calls for MSPs integrating directly via API
bash
# NexHealth API verification (for MSPs using the API directly):
curl -X GET 'https://nexhealth.com/api/v1/appointments?location_id={location_id}&start_date=2025-01-01&end_date=2025-12-31' \
  -H 'Authorization: Bearer {api_key}' \
  -H 'Accept: application/json'

# Verify patient data sync:
curl -X GET 'https://nexhealth.com/api/v1/patients?location_id={location_id}&page=1&per_page=10' \
  -H 'Authorization: Bearer {api_key}' \
  -H 'Accept: application/json'
Note

The NexHealth Synchronizer install typically takes 15–30 minutes and requires admin access to the PMS server. The initial data sync may take 1–4 hours depending on database size (patient count). During initial sync, do not make configuration changes. For Dentrix: the Synchronizer connects through the Dentrix API Exchange—ensure the practice has an active Dentrix subscription with API access. For Eaglesoft: Patterson must authorize the integration—contact Patterson support to enable third-party API access if not already active. For cloud PMS (Dentrix Ascend, Curve, CareStack): no server-side installation needed; integration is configured via cloud API credentials in the NexHealth dashboard.

Step 7: Configure Auto-Scheduling Rules in Engagement Platform

This is the core of the project. Configure the follow-up scheduling rules in the engagement platform based on the Protocol Mapping Document. Each rule defines: (1) the trigger event (procedure completed), (2) the follow-up appointment type, (3) the scheduling interval, (4) provider/operatory/time constraints, and (5) the patient notification method (auto-book vs. self-schedule link).

  • NexHealth: Configure Recall Automation Rules — Navigate to: Dashboard > Automations > Recalls
  • Rule 1: Adult Prophylaxis Recall — Trigger: Procedure D1110 set to 'Complete' | Action: Schedule 'Prophy/Recall' appointment | Interval: 6 months from procedure date | Provider: Same hygienist or any available hygienist | Time preference: Patient's same day-of-week/time-of-day as completed visit | Notification: Send SMS with self-schedule link 5 months after procedure | Reminder sequence: 5 months, 5.5 months, 6 months (if not yet scheduled)
  • Rule 2: Periodontal Maintenance — Trigger: Procedure D4910 set to 'Complete' | Action: Schedule 'Perio Maintenance' appointment | Interval: 3 months from procedure date | Provider: Same hygienist | Notification: Send SMS with self-schedule link 2.5 months after procedure
  • Rule 3: Crown Seat Follow-up — Trigger: Procedure D2740 or D2750 set to 'Complete' (crown prep) | Action: Schedule 'Crown Seat' appointment | Interval: 14–21 days from procedure date | Provider: Same treating dentist | Notification: Auto-book preferred; send confirmation SMS immediately
  • Rule 4: Post-Surgical Follow-up — Trigger: Procedure D7210 or D7220 set to 'Complete' (surgical extraction) | Action: Schedule 'Post-Op Check' appointment | Interval: 7 days from procedure date | Provider: Same treating dentist | Time: 15-minute appointment block | Notification: Auto-book; send confirmation SMS immediately
  • For Medical Practices (configure via EHR-specific rules): Post-Visit Follow-up (Chronic Disease) — Trigger: E/M code 99214 with ICD-10 E11.x (Type 2 Diabetes) | Action: Schedule 'Follow-Up Visit' appointment | Interval: 90 days | Provider: Same PCP | Notification: Send patient portal message + SMS with scheduling link
Note

The exact configuration interface varies by platform. NexHealth, Dental Intelligence, and Solutionreach all provide GUI-based rule builders—no coding required. Key decision point: AUTO-BOOK vs. SELF-SCHEDULE LINK. Auto-booking is best for short-interval mandatory follow-ups (post-op checks, crown seats) where the practice wants to guarantee the slot. Self-schedule links are better for long-interval recalls (6-month prophy) where patient preference matters more. Configure escalation rules: if a patient doesn't self-schedule within 2 weeks of receiving the link, trigger a phone call task for the front desk. Some platforms (Dental Intelligence) can also factor in insurance eligibility dates to avoid scheduling before benefits reset.

Step 8: Configure Patient Communication Templates

Set up the SMS, email, and (optional) voice notification templates that patients receive when a follow-up is auto-scheduled or when they receive a self-scheduling link. All communications must include the practice name, appointment details, confirmation/reschedule options, and opt-out language (TCPA compliance).

  • NexHealth: Navigate to Dashboard > Communications > Templates
  • SMS Template: Auto-Booked Follow-Up Confirmation — Hi {patient_first_name}, your next appointment at {practice_name} has been scheduled for {appointment_date} at {appointment_time} with {provider_name}. Reply C to confirm, R to reschedule, or call us at {practice_phone}. Reply STOP to opt out.
  • SMS Template: Self-Schedule Recall Reminder — Hi {patient_first_name}, it's time for your {appointment_type} at {practice_name}! Book your preferred time here: {scheduling_link} or call {practice_phone}. Reply STOP to opt out.
  • Email Template: Follow-Up Scheduling Reminder — Subject: Time to schedule your {appointment_type} at {practice_name}. Body: Include practice logo, appointment type description, prominent 'Book Now' button linking to self-schedule portal, practice contact info, and unsubscribe link.
  • Configure reminder sequence for self-schedule recalls: Reminder 1: 4 weeks before due date (email), Reminder 2: 2 weeks before due date (SMS), Reminder 3: On due date (SMS), Reminder 4: 2 weeks past due (SMS + email), Reminder 5: 4 weeks past due (phone call task created for front desk)
Note

All templates must be reviewed and approved by the practice before activation. Ensure TCPA compliance: patients must have opted in to receive automated messages, and every message must include opt-out instructions. Do not include specific clinical details in SMS messages (e.g., 'your periodontal treatment follow-up')—instead use generic terms like 'your follow-up appointment' to minimize PHI exposure in text messages. Email templates should use TLS encryption. Verify the practice's SMS sender number is registered with The Campaign Registry (TCR) for 10DLC compliance to avoid carrier filtering.

Step 9: Configure Patient Self-Scheduling Portal

Set up and customize the patient-facing online scheduling portal that allows patients to select their preferred appointment time from available slots. This portal is embedded on the practice website and linked from SMS/email communications.

1
Navigate to Dashboard > Online Booking > Settings in NexHealth
2
Select appointment types available for self-scheduling: Prophy/Recall: YES, Perio Maintenance: YES, Post-Op Check: NO (auto-book only), Crown Seat: NO (auto-book only), New Patient: YES (separate flow)
3
Set scheduling rules: Minimum advance booking: 24 hours, Maximum advance booking: 180 days, Buffer time between appointments: per practice preference, Show provider preference: YES, Allow operatory selection: NO (handled by PMS rules)
4
Customize branding: Upload practice logo, set brand colors, add practice-specific messaging
5
Generate embed code for practice website and install on scheduling page
6
Add 'Book Now' button to homepage linking to booking URL
7
Verify mobile responsiveness
Iframe embed code for practice website scheduling page
html
<iframe src='https://booking.nexhealth.com/{practice_slug}'
  width='100%' height='700' frameborder='0'></iframe>
Direct booking link for use in SMS/email communications
text
https://booking.nexhealth.com/{practice_slug}?appointment_type={type_id}
Note

The self-scheduling portal must be ADA/WCAG 2.1 AA accessible. Test with screen readers and keyboard-only navigation. Ensure the portal only shows appointment types that match the patient's recall needs (NexHealth can personalize this based on patient records). Set scheduling guardrails: don't allow patients to book appointments they're not due for, and enforce minimum/maximum lead times. The practice website CMS (WordPress, Squarespace, Wix, etc.) must support iframe embeds or JavaScript widget installation.

Step 10: Integration Testing & Validation

Perform comprehensive end-to-end testing of the auto-scheduling workflow using test patients. Validate every protocol mapping, confirm bidirectional PMS sync, verify patient notifications, and test edge cases. Document all test results.

bash
# Create test patients in PMS (use clearly marked test names)
# OPEN DENTAL: Add test patients via GUI or API
curl -X POST 'https://api.opendental.com/api/v1/patients' \
  -H 'Authorization: ODSESSIONID={session_id}' \
  -H 'Content-Type: application/json' \
  -d '{
    "LName": "TESTPATIENT",
    "FName": "AutoScheduleTest",
    "Birthdate": "1990-01-01",
    "Gender": 1
  }'

# Test Scenario 1: Prophy Recall Auto-Schedule
# 1. Set procedure D1110 to 'Complete' for test patient
# 2. Verify recall due date calculated (should be +6 months)
# 3. Verify NexHealth received the trigger event
# 4. Verify patient received SMS/email notification
# 5. Click self-schedule link - verify available slots shown
# 6. Book appointment via portal
# 7. Verify appointment appears in PMS within 60 seconds

# Test Scenario 2: Post-Op Auto-Book
# 1. Set procedure D7210 to 'Complete' for test patient
# 2. Verify post-op appointment auto-created in PMS (+7 days)
# 3. Verify confirmation SMS sent to test phone number
# 4. Verify appointment details correct (provider, duration, type)

# Test Scenario 3: Edge Cases
# 1. Complete a procedure when no provider slots available in the interval window
#    - Expected: System queues the request and alerts front desk
# 2. Complete a procedure for patient who already has a future appointment of that type
#    - Expected: System does not create duplicate; logs the skip
# 3. Patient reschedules via SMS reply
#    - Expected: Original slot freed, new slot booked, PMS updated
# 4. Patient opts out of SMS
#    - Expected: No further automated messages; front desk alerted for manual follow-up

# Verify all test results and document in Testing Log spreadsheet
Note

Use real phone numbers (MSP technician or Office Manager) for SMS testing—do not skip communication verification. Run tests during business hours when the PMS is under normal load. Test with at least one patient per protocol mapping (typically 4–8 test scenarios for a dental practice). Allow 48 hours for the full test cycle to verify delayed triggers (e.g., recall reminders sent weeks before due date can be tested by temporarily adjusting dates). After testing, delete or deactivate all test patients to avoid cluttering the PMS. Document every test result with screenshots in the Testing Log.

Step 11: Staff Training & Go-Live Preparation

Train front desk staff, office manager, and providers on the new auto-scheduling system. Cover daily workflows, exception handling, override procedures, and how to monitor the system. Prepare go-live checklist and schedule the cutover.

1
System Overview (15 min): What auto-scheduling does and doesn't do; which appointment types are auto-scheduled vs. manual; how patients experience the self-scheduling portal
2
Daily Workflow Changes (30 min): Reviewing auto-booked appointments in the PMS each morning; handling patient reschedule requests; managing the 'unscheduled follow-up' exception queue; verifying insurance eligibility for auto-booked appointments
3
Override & Exception Procedures (30 min): How to manually override an auto-scheduled appointment; what to do when a patient calls to reschedule; handling provider schedule changes that affect booked follow-ups; managing patients who opt out of automated communications
4
Monitoring & Reporting (20 min): NexHealth dashboard: daily/weekly scheduling reports; key metrics: fill rate, self-schedule conversion, recall compliance; how to escalate issues to the MSP
5
Hands-On Practice (25 min): Walk through real scenarios in the live system; practice using the engagement platform dashboard; review patient-facing booking portal

Go-Live Checklist

Note

Schedule training for a half-day when the practice can reduce patient volume. Provide printed quick-reference cards for the front desk showing the most common override scenarios. Record the training session (with permission) for future staff onboarding. Plan for a 'soft launch' period of 1–2 weeks where the MSP monitors the system closely and is available for same-day support calls. During soft launch, have the front desk manually verify every auto-scheduled appointment before confirming it to the patient.

Step 12: Go-Live & Post-Launch Monitoring

Activate the auto-scheduling system for all patients and begin the 30-day intensive monitoring period. The MSP monitors system performance daily for the first week, then weekly for the remaining three weeks. Optimize rules based on real-world data.

  • Activate auto-scheduling rules in engagement platform — NexHealth: Dashboard > Automations > Toggle all rules to 'Active'
  • Set up MSP monitoring alerts: Configure email/SMS alerts for sync failures
  • Set up daily digest of auto-scheduled appointments
  • Monitor error logs in engagement platform
  • Appointments auto-scheduled: count per week
  • Self-schedule link conversion rate: % of links clicked that result in bookings
  • Recall compliance rate: % of due patients who have scheduled follow-ups
  • Patient no-show rate for auto-scheduled vs. manually scheduled appointments
  • Front desk override rate: % of auto-scheduled appointments manually changed
  • SMS opt-out rate: should remain <2%
NexHealth API — pull scheduling analytics
bash
curl -X GET 'https://nexhealth.com/api/v1/analytics/appointments?location_id={location_id}&start_date={start}&end_date={end}' \
  -H 'Authorization: Bearer {api_key}' \
  -H 'Accept: application/json'
Open Dental
sql
-- query auto-created appointments from the last 7 days

SELECT a.AptNum, a.AptDateTime, a.AptStatus, p.LName, p.FName, a.Note
FROM appointment a
INNER JOIN patient p ON a.PatNum = p.PatNum
WHERE a.DateTStamp > DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND a.Note LIKE '%auto%'
ORDER BY a.AptDateTime DESC;
Note

The first 30 days are critical. Expect to make 3–5 rule adjustments based on real-world feedback (e.g., adjusting time preferences, changing from auto-book to self-schedule for certain appointment types, tweaking reminder intervals). Common issues in the first week: duplicate appointments if PMS recall system and engagement platform both trigger, provider schedule gaps causing booking failures, patients confused by self-scheduling portal. Have the Office Manager maintain a daily log of any issues or patient feedback during the first two weeks. Schedule a Week 1 and Week 4 review meeting with the practice to assess performance and make adjustments.

Custom AI Components

Protocol Mapping Engine

Type: workflow A deterministic rules engine that maps completed procedure codes to follow-up appointment protocols. This is the core logic component that translates clinical events into scheduling actions. It reads procedure completion events from the PMS, looks up the corresponding follow-up protocol (appointment type, interval, provider constraints, operatory requirements), and generates a scheduling request for the engagement platform. This is NOT machine learning—it is a configurable lookup table with deterministic rules.

Implementation:

Protocol Mapping Engine
json
# Configuration Specification. Implemented as a configuration within the
# engagement platform (NexHealth/Dental Intelligence) or as a Keragon
# workflow for custom requirements.

{
  "protocol_version": "1.0",
  "practice_id": "{PRACTICE_ID}",
  "effective_date": "2025-01-01",
  "protocols": [
    {
      "protocol_id": "PROPHY_RECALL_6MO",
      "trigger_codes": ["D1110", "D1120"],
      "trigger_event": "procedure_completed",
      "follow_up": {
        "appointment_type": "Prophy/Recall",
        "interval_days": 180,
        "interval_tolerance_days": 14,
        "duration_minutes": 60,
        "provider_rule": "same_hygienist_or_any_hygienist",
        "operatory_rule": "hygiene_operatory",
        "time_preference": "same_day_and_time",
        "scheduling_method": "self_schedule_link",
        "auto_book_if_no_response_days": 30
      },
      "communication": {
        "initial_notification_days_before_due": 30,
        "reminder_sequence": [30, 14, 0, -14, -28],
        "channels": ["sms", "email"],
        "escalate_to_phone_after_days": 28
      }
    },
    {
      "protocol_id": "PERIO_MAINTENANCE_3MO",
      "trigger_codes": ["D4910"],
      "trigger_event": "procedure_completed",
      "follow_up": {
        "appointment_type": "Perio Maintenance",
        "interval_days": 90,
        "interval_tolerance_days": 7,
        "duration_minutes": 60,
        "provider_rule": "same_hygienist",
        "operatory_rule": "hygiene_operatory",
        "time_preference": "same_day_and_time",
        "scheduling_method": "self_schedule_link",
        "auto_book_if_no_response_days": 14
      },
      "communication": {
        "initial_notification_days_before_due": 21,
        "reminder_sequence": [21, 7, 0, -7],
        "channels": ["sms", "email"],
        "escalate_to_phone_after_days": 14
      }
    },
    {
      "protocol_id": "SRP_POSTOP_4WK",
      "trigger_codes": ["D4341", "D4342"],
      "trigger_event": "procedure_completed",
      "follow_up": {
        "appointment_type": "SRP Post-Op Evaluation",
        "interval_days": 28,
        "interval_tolerance_days": 7,
        "duration_minutes": 30,
        "provider_rule": "same_provider",
        "operatory_rule": "any_available",
        "time_preference": "morning_preferred",
        "scheduling_method": "auto_book",
        "auto_book_if_no_response_days": null
      },
      "communication": {
        "initial_notification_days_before_due": 0,
        "reminder_sequence": [0, -3, -1],
        "channels": ["sms"],
        "escalate_to_phone_after_days": null
      }
    },
    {
      "protocol_id": "CROWN_SEAT_3WK",
      "trigger_codes": ["D2740", "D2750", "D2751", "D2752"],
      "trigger_event": "procedure_completed",
      "follow_up": {
        "appointment_type": "Crown/Bridge Seat",
        "interval_days": 21,
        "interval_tolerance_days": 7,
        "duration_minutes": 45,
        "provider_rule": "same_provider",
        "operatory_rule": "doctor_operatory",
        "time_preference": "any_available",
        "scheduling_method": "auto_book",
        "auto_book_if_no_response_days": null
      },
      "communication": {
        "initial_notification_days_before_due": 0,
        "reminder_sequence": [0, -3, -1],
        "channels": ["sms", "email"],
        "escalate_to_phone_after_days": null
      }
    },
    {
      "protocol_id": "EXTRACTION_POSTOP_1WK",
      "trigger_codes": ["D7210", "D7220", "D7230", "D7240"],
      "trigger_event": "procedure_completed",
      "follow_up": {
        "appointment_type": "Post-Op Check",
        "interval_days": 7,
        "interval_tolerance_days": 2,
        "duration_minutes": 15,
        "provider_rule": "same_provider",
        "operatory_rule": "any_available",
        "time_preference": "first_available",
        "scheduling_method": "auto_book",
        "auto_book_if_no_response_days": null
      },
      "communication": {
        "initial_notification_days_before_due": 0,
        "reminder_sequence": [0, -1],
        "channels": ["sms"],
        "escalate_to_phone_after_days": null
      }
    },
    {
      "protocol_id": "MEDICAL_CHRONIC_DISEASE_QUARTERLY",
      "trigger_codes": ["99213", "99214"],
      "trigger_event": "procedure_completed",
      "condition_filter": {
        "icd10_codes": ["E11.*", "I10", "J45.*"],
        "description": "Diabetes, Hypertension, Asthma"
      },
      "follow_up": {
        "appointment_type": "Chronic Disease Follow-Up",
        "interval_days": 90,
        "interval_tolerance_days": 14,
        "duration_minutes": 30,
        "provider_rule": "same_provider",
        "operatory_rule": "any_exam_room",
        "time_preference": "same_day_and_time",
        "scheduling_method": "self_schedule_link",
        "auto_book_if_no_response_days": 21
      },
      "communication": {
        "initial_notification_days_before_due": 21,
        "reminder_sequence": [21, 7, 0, -7, -14],
        "channels": ["sms", "email", "patient_portal"],
        "escalate_to_phone_after_days": 21
      }
    }
  ],
  "global_rules": {
    "duplicate_prevention": true,
    "duplicate_window_days": 30,
    "max_future_booking_days": 365,
    "business_hours_only": true,
    "respect_patient_preferred_time": true,
    "respect_patient_opt_out": true,
    "insurance_eligibility_check": false,
    "holiday_exclusions": ["2025-01-01", "2025-07-04", "2025-11-27", "2025-12-25"],
    "error_handling": {
      "no_available_slot": "queue_for_front_desk",
      "patient_already_scheduled": "skip_and_log",
      "sync_failure": "retry_3x_then_alert_msp",
      "provider_not_found": "assign_any_available_same_type"
    }
  }
}
1
To implement in Keragon (if custom middleware needed): Create a Keragon workflow triggered by webhook from PMS
2
Webhook payload contains: patient_id, procedure_code, completion_date, provider_id
3
Workflow step 1: Look up procedure_code in protocol table
4
Workflow step 2: Calculate target_date = completion_date + interval_days
5
Workflow step 3: Call engagement platform API to search available slots
6
Workflow step 4: If scheduling_method = 'auto_book', create appointment via API
7
Workflow step 5: If scheduling_method = 'self_schedule_link', trigger SMS with link
8
Workflow step 6: Log action to audit trail
9
Error handler: If any step fails, send alert to MSP and create front-desk task

Slot Finder Logic

Type: workflow A deterministic slot-finding algorithm that searches the PMS schedule for the optimal available appointment slot based on the protocol's constraints (interval, provider, operatory, time preference, duration). This logic is typically handled natively by the engagement platform (NexHealth, Dental Intelligence) but is documented here for MSPs building custom integrations or using Keragon. Implementation:

Slot Finder Algorithm
python
# pseudocode implementation for engagement platforms and custom Keragon
# integrations

# Slot Finder Algorithm - Pseudocode Implementation
# This runs within the engagement platform or as a Keragon workflow step.

import datetime
from typing import List, Optional, Dict

def find_optimal_slot(
    patient_id: str,
    protocol: Dict,
    pms_api_client,  # NexHealth API or CRMBridge.ai or Open Dental API
    completion_date: datetime.date
) -> Optional[Dict]:
    """
    Find the optimal appointment slot based on protocol rules.
    Returns slot details or None if no slot found.
    """
    follow_up = protocol['follow_up']
    
    # Calculate target date range
    target_date = completion_date + datetime.timedelta(days=follow_up['interval_days'])
    earliest_date = target_date - datetime.timedelta(days=follow_up['interval_tolerance_days'])
    latest_date = target_date + datetime.timedelta(days=follow_up['interval_tolerance_days'])
    
    # Check for duplicate prevention
    if protocol.get('global_rules', {}).get('duplicate_prevention', True):
        existing = pms_api_client.get_future_appointments(
            patient_id=patient_id,
            appointment_type=follow_up['appointment_type'],
            date_range=(earliest_date, latest_date + datetime.timedelta(days=30))
        )
        if existing:
            return {'status': 'skip', 'reason': 'patient_already_scheduled', 'existing_apt': existing[0]}
    
    # Determine provider constraint
    provider_ids = resolve_provider_rule(
        rule=follow_up['provider_rule'],
        original_provider_id=protocol.get('original_provider_id'),
        pms_api_client=pms_api_client
    )
    
    # Determine time preference
    preferred_time = resolve_time_preference(
        preference=follow_up['time_preference'],
        patient_id=patient_id,
        pms_api_client=pms_api_client
    )
    
    # Search for available slots
    available_slots = pms_api_client.get_available_slots(
        start_date=earliest_date,
        end_date=latest_date,
        provider_ids=provider_ids,
        operatory_type=follow_up['operatory_rule'],
        duration_minutes=follow_up['duration_minutes'],
        exclude_holidays=protocol.get('global_rules', {}).get('holiday_exclusions', [])
    )
    
    if not available_slots:
        # Expand search window by 2x tolerance
        extended_latest = latest_date + datetime.timedelta(days=follow_up['interval_tolerance_days'])
        available_slots = pms_api_client.get_available_slots(
            start_date=earliest_date,
            end_date=extended_latest,
            provider_ids=provider_ids,
            operatory_type=follow_up['operatory_rule'],
            duration_minutes=follow_up['duration_minutes']
        )
    
    if not available_slots:
        return {'status': 'no_slot', 'reason': 'no_availability', 'action': 'queue_for_front_desk'}
    
    # Score and rank slots by preference
    scored_slots = []
    for slot in available_slots:
        score = 0
        # Prefer target date (highest score)
        days_from_target = abs((slot['date'] - target_date).days)
        score += max(0, 100 - (days_from_target * 5))  # Closer to target = higher score
        
        # Prefer patient's usual time
        if preferred_time and slot['time'].hour == preferred_time.hour:
            score += 50
        
        # Prefer same day of week as original appointment
        if slot['date'].weekday() == completion_date.weekday():
            score += 25
        
        # Prefer original provider
        if slot['provider_id'] == protocol.get('original_provider_id'):
            score += 30
        
        scored_slots.append({'slot': slot, 'score': score})
    
    # Sort by score descending
    scored_slots.sort(key=lambda x: x['score'], reverse=True)
    best_slot = scored_slots[0]['slot']
    
    return {
        'status': 'found',
        'slot': best_slot,
        'score': scored_slots[0]['score'],
        'scheduling_method': follow_up['scheduling_method']
    }


def resolve_provider_rule(rule: str, original_provider_id: str, pms_api_client) -> List[str]:
    """Resolve provider rule to list of acceptable provider IDs."""
    if rule == 'same_provider':
        return [original_provider_id]
    elif rule == 'same_hygienist_or_any_hygienist':
        hygienists = pms_api_client.get_providers(provider_type='hygienist')
        # Put original first for preference scoring
        ids = [original_provider_id] + [h['id'] for h in hygienists if h['id'] != original_provider_id]
        return ids
    elif rule == 'same_hygienist':
        return [original_provider_id]
    elif rule == 'any_available_same_type':
        provider = pms_api_client.get_provider(original_provider_id)
        all_same_type = pms_api_client.get_providers(provider_type=provider['type'])
        return [p['id'] for p in all_same_type]
    else:
        return [original_provider_id]


def resolve_time_preference(preference: str, patient_id: str, pms_api_client) -> Optional[datetime.time]:
    """Resolve time preference to a target time."""
    if preference == 'same_day_and_time':
        last_apt = pms_api_client.get_last_appointment(patient_id)
        if last_apt:
            return last_apt['time']
    elif preference == 'morning_preferred':
        return datetime.time(9, 0)
    elif preference == 'first_available':
        return None  # No time preference, take first
    return None

# NexHealth API implementation for slot search:
# GET /api/v1/availabilities
# Parameters: location_id, provider_id, start_date, end_date, appointment_type_id
# Returns available time slots matching criteria

# Open Dental API implementation for slot search:
# GET /api/v1/appointments?AptStatus=0 (open timeslots)
# Filter by ProvNum, Op, AptDateTime range
# Or use the built-in recall system which handles this natively

Duplicate Prevention Guard

Type: integration A safeguard component that prevents the auto-scheduling system from creating duplicate follow-up appointments. This is critical because both the PMS's native recall system and the engagement platform may attempt to schedule the same follow-up. The guard checks for existing future appointments of the same type before creating new ones.

Implementation:

  • Implementation in NexHealth: Configure in automation rules — Setting: 'Skip if patient has existing appointment of same type within [X] days' | Recommended window: 30 days before and after the target date
Implementation in Open Dental — SQL check before API booking
sql
-- Check if patient already has a future appointment of the specified type
-- Run this BEFORE creating a new auto-scheduled appointment

SELECT COUNT(*) AS existing_count
FROM appointment a
INNER JOIN appointmenttype at ON a.AppointmentTypeNum = at.AppointmentTypeNum
WHERE a.PatNum = @PatientNum
  AND at.AppointmentTypeName = @AppointmentType
  AND a.AptDateTime >= @EarliestDate
  AND a.AptDateTime <= @LatestDate
  AND a.AptStatus IN (1, 4)  -- 1=Scheduled, 4=ASAP
;

-- If existing_count > 0, DO NOT create new appointment
-- Log: 'Duplicate prevented for PatNum {X}, existing apt on {date}'
1
Implementation in Keragon workflow — Step: 'Check Existing Appointments'
2
Action: HTTP GET to PMS API for patient's future appointments
3
Condition: If response contains appointment of matching type within date window
4
True path: Skip scheduling, log event
5
False path: Proceed with slot finder and booking
Critical

Also disable the PMS's native auto-recall-scheduling if the engagement platform is handling it, to prevent both systems from creating appointments. - In Open Dental: Setup > Appointments > Recall > Uncheck 'Auto schedule recall' - In Dentrix: Office Manager > Continuing Care > Uncheck 'Auto-generate appointments' This prevents the double-booking scenario where PMS creates one recall and NexHealth creates another.

Exception Queue Handler

Type: workflow Manages cases where the auto-scheduler cannot complete its task: no available slots, provider not found, sync failure, or patient opt-out. Creates actionable tasks for the front desk team and sends alerts to the MSP for system-level issues. This ensures no follow-up falls through the cracks.

Implementation:

Exception Queue Handler
json
# Keragon Workflow or Platform-Native Configuration

{
  "exception_handlers": [
    {
      "exception_type": "no_available_slot",
      "severity": "medium",
      "actions": [
        {
          "action": "create_front_desk_task",
          "task_title": "Manual scheduling needed: {patient_name} - {appointment_type}",
          "task_description": "Auto-scheduler could not find an available slot for {patient_name}'s {appointment_type} follow-up (target date: {target_date}). Please schedule manually or extend provider schedule.",
          "task_due_date": "target_date - 7 days",
          "task_assignee": "front_desk_lead"
        },
        {
          "action": "log_event",
          "log_level": "warning",
          "message": "No slot found for patient {patient_id}, protocol {protocol_id}, target {target_date}"
        }
      ]
    },
    {
      "exception_type": "patient_already_scheduled",
      "severity": "low",
      "actions": [
        {
          "action": "log_event",
          "log_level": "info",
          "message": "Duplicate prevented: patient {patient_id} already has {appointment_type} on {existing_date}"
        }
      ]
    },
    {
      "exception_type": "sync_failure",
      "severity": "high",
      "actions": [
        {
          "action": "retry",
          "max_retries": 3,
          "retry_interval_minutes": 5
        },
        {
          "action": "alert_msp",
          "method": "email_and_sms",
          "recipient": "msp_oncall@yourmsp.com",
          "message": "ALERT: PMS sync failure at {practice_name}. Auto-scheduling paused. Error: {error_message}"
        },
        {
          "action": "create_front_desk_task",
          "task_title": "SYSTEM ALERT: Auto-scheduling temporarily unavailable",
          "task_description": "The auto-scheduling system has encountered a sync error. Your MSP has been notified and is investigating. Please schedule follow-ups manually until resolved.",
          "task_assignee": "office_manager"
        }
      ]
    },
    {
      "exception_type": "patient_opted_out",
      "severity": "low",
      "actions": [
        {
          "action": "create_front_desk_task",
          "task_title": "Manual follow-up needed: {patient_name} (opted out of auto-messages)",
          "task_description": "Patient {patient_name} has opted out of automated communications. Please call to schedule their {appointment_type} follow-up (due: {target_date}).",
          "task_due_date": "target_date - 14 days",
          "task_assignee": "front_desk"
        },
        {
          "action": "log_event",
          "log_level": "info",
          "message": "Opt-out patient {patient_id} routed to manual follow-up queue"
        }
      ]
    },
    {
      "exception_type": "provider_schedule_not_found",
      "severity": "medium",
      "actions": [
        {
          "action": "try_alternative_provider",
          "fallback_rule": "any_available_same_type"
        },
        {
          "action": "alert_msp",
          "method": "email",
          "message": "Provider schedule not built for {provider_name} beyond {last_scheduled_date}. Practice needs to extend schedule templates."
        }
      ]
    }
  ],
  "daily_exception_report": {
    "enabled": true,
    "send_time": "07:00",
    "recipients": ["office_manager@practice.com", "msp_team@yourmsp.com"],
    "include": ["unresolved_tasks", "sync_status", "scheduling_stats"]
  }
}
  • Implementation in NexHealth: Navigate to Dashboard > Automations > Notifications
  • Set up alert rules for failed scheduling attempts
  • Configure daily summary email to Office Manager
Implementation in Open Dental: Use the Task system to create automated tasks
sql
INSERT INTO task (TaskListNum, DateTask, Descript, TaskStatus, UserNum)
VALUES (@FrontDeskTaskList, @DueDate, @TaskDescription, 0, @OfficeManagerUserNum);
Note

For MSP alerting: Configure webhook in engagement platform to POST to MSP's alerting system (PagerDuty, ConnectWise Manage, Autotask, or email) on critical errors.

Scheduling Analytics Dashboard

Type: integration A monitoring and reporting component that tracks key performance indicators for the auto-scheduling system. Provides the MSP and practice with visibility into scheduling automation performance, patient engagement rates, and revenue impact. Uses data from both the engagement platform and PMS.

Implementation:

  • KPI 1: Auto-Schedule Rate — % of completed procedures that result in a follow-up being auto-scheduled. Target: >85% within 60 days of go-live. Data source: Engagement platform automation logs.
  • KPI 2: Self-Schedule Conversion Rate — % of self-schedule links sent that result in a booked appointment. Target: >40% (industry benchmark for dental recall). Data source: Engagement platform click-through and booking analytics.
  • KPI 3: Recall Compliance Rate — % of patients due for recall who have a scheduled future appointment. Target: >70% (up from typical 40-50% baseline). Data source: PMS recall/continuing care module.
  • KPI 4: No-Show Rate (Auto-Scheduled vs. Manual) — Compare no-show rates between auto-scheduled and manually scheduled appointments. Target: Auto-scheduled no-show rate should be equal to or lower than manual. Data source: PMS appointment status data.
  • KPI 5: Revenue Impact — Incremental revenue from improved follow-up compliance. Calculation: (New recall compliance rate - Baseline rate) × Average recall visit revenue × Patient count. Data source: PMS production reports.
Open Dental SQL Queries for KPI Tracking
sql
-- KPI 1: Recall compliance rate (current month)
SELECT 
  COUNT(CASE WHEN a.AptNum IS NOT NULL THEN 1 END) AS scheduled_count,
  COUNT(*) AS total_due,
  ROUND(COUNT(CASE WHEN a.AptNum IS NOT NULL THEN 1 END) / COUNT(*) * 100, 1) AS compliance_pct
FROM recall r
INNER JOIN patient p ON r.PatNum = p.PatNum
LEFT JOIN appointment a ON r.PatNum = a.PatNum 
  AND a.AptDateTime >= CURDATE()
  AND a.AptStatus IN (1, 4)
INNER JOIN recalltype rt ON r.RecallTypeNum = rt.RecallTypeNum
WHERE r.DateDue BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') 
  AND LAST_DAY(CURDATE())
AND r.IsDisabled = 0
AND p.PatStatus = 0;

-- KPI 4: No-show rate comparison (last 90 days)
SELECT 
  CASE WHEN a.Note LIKE '%auto%' OR a.Note LIKE '%nexhealth%' THEN 'Auto-Scheduled' ELSE 'Manual' END AS booking_method,
  COUNT(*) AS total_appointments,
  COUNT(CASE WHEN a.AptStatus = 5 THEN 1 END) AS broken_appointments,
  ROUND(COUNT(CASE WHEN a.AptStatus = 5 THEN 1 END) / COUNT(*) * 100, 1) AS noshow_pct
FROM appointment a
WHERE a.AptDateTime >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)
AND a.AptDateTime < CURDATE()
GROUP BY booking_method;

-- Monthly scheduling volume trend
SELECT 
  DATE_FORMAT(a.AptDateTime, '%Y-%m') AS month,
  COUNT(*) AS total_recall_apts,
  COUNT(CASE WHEN a.Note LIKE '%auto%' THEN 1 END) AS auto_scheduled
FROM appointment a
INNER JOIN appointmenttype at ON a.AppointmentTypeNum = at.AppointmentTypeNum
WHERE at.AppointmentTypeName IN ('Prophy/Recall', 'Perio Maintenance', 'Post-Op Check')
AND a.AptDateTime >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY DATE_FORMAT(a.AptDateTime, '%Y-%m')
ORDER BY month;
NexHealth API endpoints for appointment volume/status, message delivery/response rates, and self-schedule conversion rates
http
GET /api/v1/analytics/appointments
GET /api/v1/analytics/communications
GET /api/v1/analytics/online_booking
1
Total appointments auto-scheduled this month
2
Self-schedule link conversion rate
3
Recall compliance rate trend (monthly)
4
Estimated revenue recovered vs. baseline
5
Exception queue summary (issues resolved vs. pending)
Note

Create a monthly PDF report for the practice using the items above and deliver it in the monthly MSP service review meeting.

Testing & Validation

  • TEST 1 - Prophy Recall Trigger: Complete procedure D1110 for a test patient in the PMS. Verify within 5 minutes that (a) the engagement platform registers the completion event, (b) a recall due date of +180 days is calculated, and (c) the patient's recall status updates in both PMS and engagement platform. Expected: All three conditions pass.
  • TEST 2 - Auto-Book Post-Op: Complete procedure D7210 (surgical extraction) for a test patient. Verify within 5 minutes that a Post-Op Check appointment is automatically created in the PMS schedule for +7 days with the correct provider, 15-minute duration, and correct operatory type. Expected: Appointment visible in PMS appointment book with correct details.
  • TEST 3 - SMS Confirmation Delivery: After an auto-booked appointment is created (Test 2), verify that the test patient's phone number receives an SMS confirmation within 2 minutes containing the practice name, appointment date/time, provider name, and opt-out instructions. Expected: SMS received with all required elements.
  • TEST 4 - Self-Schedule Link Functionality: After a prophy recall is triggered (Test 1), fast-forward the reminder timeline (or manually trigger the recall notification) and verify the patient receives an SMS with a self-schedule link. Click the link and confirm: (a) it opens the practice's branded scheduling portal, (b) only appropriate appointment types are shown, (c) available slots match the PMS schedule, (d) booking a slot creates an appointment in the PMS within 60 seconds. Expected: End-to-end booking completes successfully.
  • TEST 5 - Duplicate Prevention: Complete procedure D1110 for a test patient who already has a future Prophy/Recall appointment scheduled. Verify that the system does NOT create a second appointment and logs a 'duplicate prevented' event. Expected: No duplicate created; log entry confirms skip.
  • TEST 6 - No Available Slot Handling: Complete a procedure for a test patient where the target follow-up date falls in a period with no provider availability (e.g., provider on vacation with no schedule). Verify that (a) the system does not create an appointment, (b) a front desk task is created with the patient name, appointment type, and target date, and (c) the MSP receives an alert if configured. Expected: Task created; no orphaned appointment.
  • TEST 7 - Bidirectional Sync Verification: Create an appointment directly in the PMS (not through the engagement platform). Verify it appears in the engagement platform within 2 minutes. Then create an appointment in the engagement platform and verify it appears in the PMS within 2 minutes. Expected: Both directions sync within 2 minutes.
  • TEST 8 - Patient Reschedule via SMS: Reply to a confirmation SMS with 'R' (or the configured reschedule keyword). Verify that the system either provides reschedule options or routes the request to the front desk. Expected: Reschedule workflow activates; no appointment is lost.
  • TEST 9 - Opt-Out Handling: Reply STOP to an automated SMS. Verify that (a) no further automated messages are sent to that number, (b) a front desk task is created for manual follow-up scheduling, and (c) the patient's communication preferences are updated in the engagement platform. Expected: All three conditions pass.
  • TEST 10 - Multi-Protocol Same Patient: Complete both D1110 (prophy) and D4341 (SRP) for the same test patient on the same day. Verify that two distinct follow-up protocols are triggered: a 6-month prophy recall AND a 4-week SRP post-op. Expected: Two separate follow-up scheduling actions are initiated without conflict.
  • TEST 11 - End-to-End Volume Test: Process 10 test patients through various protocol triggers simultaneously. Verify all 10 result in correct scheduling actions within 15 minutes with no errors, duplicates, or missed patients. Expected: 100% accuracy across all 10 test cases.
  • TEST 12 - HIPAA Communication Audit: Review all SMS and email templates sent during testing. Verify that no messages contain specific clinical details (procedure names, diagnosis codes) and that all messages include opt-out instructions. Verify that all data in transit uses TLS 1.2+. Expected: All communications pass HIPAA minimum necessary review.

Client Handoff

The client handoff meeting should be scheduled for 60–90 minutes with the Office Manager, lead front-desk staff, and at least one provider present. Cover the following topics in order:

1
System Overview & Architecture (10 min): Explain what was installed, how the PMS connects to the engagement platform, and the flow from procedure completion to auto-scheduled appointment. Use a simple diagram.
2
Protocol Review (15 min): Walk through the complete Protocol Mapping Document showing every procedure code, its follow-up type, interval, and scheduling method (auto-book vs. self-schedule). Get written sign-off that all protocols are clinically accurate.
3
Daily Workflow Demonstration (20 min): Show the front desk team their morning routine—how to review auto-scheduled appointments, handle the exception queue, process reschedule requests, and verify insurance eligibility for auto-booked appointments. Demonstrate in the live PMS and engagement platform.
4
Override & Exception Procedures (15 min): Walk through every exception scenario: patient opted out, no slot available, provider schedule change, patient requests different provider or time. Provide the printed Quick Reference Card with step-by-step instructions for each scenario.
5
Reporting & KPIs (10 min): Show the practice how to access scheduling reports in the engagement platform dashboard. Review the baseline KPIs captured before go-live and explain the target metrics. Explain the monthly MSP performance report they will receive.
6
Support & Escalation (10 min): Provide the escalation contact card with: (a) front-desk self-service troubleshooting guide, (b) MSP help desk number/email for system issues, (c) engagement platform vendor support contact for platform-specific questions, (d) expected response times per severity level.

Documentation to Leave Behind

  • Protocol Mapping Document (printed and digital)
  • Front Desk Quick Reference Card (laminated, posted at each workstation)
  • System Architecture Diagram
  • Vendor Contact & BAA Summary Sheet
  • Training Recording (if session was recorded)
  • MSP Support & Escalation Contact Card
  • Monthly KPI Report Template
  • Patient Self-Scheduling Portal URL and embed code documentation

Success Criteria to Review Together

Maintenance

Ongoing MSP Responsibilities:

Weekly (first 60 days, then monthly):

  • Monitor PMS-to-engagement-platform sync status; verify last successful sync timestamp
  • Review exception queue for unresolved items; escalate patterns to practice
  • Check SMS delivery rates and bounce rates; investigate any rate above 5%
  • Verify patient self-scheduling portal uptime and responsiveness
  • Review auto-scheduling error logs for recurring issues

Monthly:

  • Generate and deliver the Monthly Scheduling Performance Report to the practice (recall compliance rate, auto-schedule volume, self-schedule conversion rate, no-show comparison, revenue impact estimate)
  • Verify provider schedules are built out at least 90 days into the future; alert Office Manager if schedules need extending
  • Review and update protocol mappings if the practice has added new procedure codes or changed clinical protocols
  • Apply engagement platform updates/patches as released by vendor
  • Review communication templates for accuracy and compliance
  • Check for PMS software updates that may affect API integrations (especially Dentrix and Eaglesoft updates which can break third-party sync)

Quarterly:

  • Conduct a mini HIPAA security review: verify BAAs are current, access controls are appropriate, audit logs are intact
  • Review and optimize scheduling rules based on 90 days of performance data (adjust intervals, change auto-book vs. self-schedule decisions, tune reminder sequences)
  • Extend provider schedule templates for the next 180 days
  • Verify Windows updates and server patches are current (for on-premises deployments)
  • Test disaster recovery: verify PMS backup integrity and engagement platform data export
  • Review engagement platform contract terms and pricing; renegotiate if needed

Annually:

  • Full HIPAA Security Risk Assessment (required by regulation; use SIMBUS360 or equivalent tool)
  • Comprehensive protocol review with clinical staff—update all procedure-to-follow-up mappings based on changed clinical guidelines
  • Engagement platform contract renewal review
  • Server hardware lifecycle assessment (for on-premises; plan refresh at 5 years)
  • Staff retraining for any new hires or workflow changes
  • Review 12-month KPI trends and present ROI analysis to practice owner/partners

SLA Considerations:

  • Sync failure response: MSP acknowledges within 1 hour during business hours; resolution target within 4 hours
  • Scheduling rule misconfiguration: MSP acknowledges within 2 hours; resolution within 1 business day
  • Platform outage (vendor-side): MSP communicates status to practice within 30 minutes; coordinates with vendor
  • HIPAA incident/breach: Immediate response per incident response plan; notify practice within 1 hour; follow breach notification timeline (60 days to HHS if 500+ individuals affected)

Escalation Path:

1
Front desk self-service (Quick Reference Card)
2
MSP help desk (Tier 1)
3
MSP senior technician (Tier 2, PMS/API expertise)
4
Engagement platform vendor support
5
PMS vendor support (Henry Schein One, Patterson, Open Dental)
Note

Note on Updates: This is a deterministic automation system—there is no AI model to retrain. However, the protocol rules should be reviewed whenever the practice changes clinical protocols, adds new providers, changes operatory configurations, or updates their PMS software version. PMS updates (especially Dentrix major version upgrades) are the highest-risk maintenance event and should be tested in a staging environment before production deployment.

Alternatives

PMS-Native Recall System Only (No Third-Party Engagement Platform)

Adit All-in-One Platform (Replaces Multiple Point Solutions)

Instead of NexHealth + separate VoIP + separate review management, deploy Adit as a comprehensive all-in-one platform that includes AI-powered call tracking, automated scheduling, patient reminders, VoIP phone system, payment processing, online reviews, and digital forms. Adit integrates with Dentrix, Eaglesoft, and Open Dental and replaces 5–7 separate tools that most practices currently use.

Dental Intelligence (Analytics-First Approach)

Deploy Dental Intelligence as the primary platform, which combines practice analytics, scheduling automation, morning huddle intelligence, patient engagement, and revenue gap identification. Unlike NexHealth which is scheduling-first, Dental Intelligence is analytics-first—it identifies which patients need to be scheduled and why, then automates the outreach.

Custom API Integration via CRMBridge.ai + Keragon

Build a fully custom auto-scheduling solution using CRMBridge.ai as the unified PMS API layer and Keragon as the HIPAA-compliant workflow automation engine. This approach gives the MSP complete control over the scheduling logic, communication workflows, and data flows without depending on a turnkey engagement platform.

Note

RECOMMENDATION: Only for MSPs with in-house development capabilities who manage 10+ dental/medical practices and want to build a proprietary solution. The upfront investment is justified at scale but not for a single-practice engagement. Ensure the MSP has the technical bench strength to maintain custom integrations long-term.

Weave Phone-First Approach

Deploy Weave as the primary platform, anchored by its integrated VoIP phone system with call intelligence. Weave provides automated recall scheduling, missed call text-back, appointment reminders, online scheduling, payment processing, and review management—all built around the phone system as the central hub.

Want early access to the full toolkit?