Total Configs
0
Active Syncs
0
Scheduled Jobs
0
Recent Syncs
0
appointment(s) need to be added to Jane App.
Pending Jane Entries
Appointments booked in Evergreen that need to be added to Jane App
No pending entries. All caught up!
Healthcare Practices
Configure HighLevel locations for your practices
No practices configured yet.
Add a practice to store your HighLevel location credentials.
Providers
Configure Jane-to-HighLevel calendar sync for each practitioner
No providers found.
First, add a Practice in the Practices tab.
Location:
Sync every minutes
Last sync:
Sync Logs
No sync logs yet.
| Time | Config | Status | Appointments | Created | Updated | Deleted | Errors |
|---|---|---|---|---|---|---|---|
Scheduled Jobs
No scheduled jobs.
Next run:
Jane App Automation
Automatically create Jane appointments from HighLevel bookings
Jane Session Expired
The session for has expired. Error:
Automation Settings by Configuration
Voice AI Services
Manage services available for voice-based phone booking
Select a practice to manage services
No services found for this practice
Click "Import from History" to auto-detect services from synced appointments
| Name | Display Name | Duration | Practitioners | Voice Bookable | Actions |
|---|---|---|---|---|---|
| min | Yes No |
|
Service Lookup
Test how spoken service names are matched
Availability Check
Test slot availability for a service
Patient Lookup
Browse synced patients and their appointment history
Select a patient to view their appointments
EverSync Help Center
Guides for onboarding, troubleshooting, and Voice AI configuration
New Practice Onboarding
Follow these 6 phases to fully onboard a new practice. The whole process takes about 45-60 minutes for a 3-practitioner clinic.
HighLevel credentials + Jane subdomain
Save Jane credentials or cookies
One per practitioner with ICS feeds
Sync Jane appointments to HighLevel
Import services + map practitioners
Configure Custom Actions in HighLevel
Prerequisites
Gather these before starting:
- HighLevel sub-account created for the practice
- HighLevel Location ID (Settings > Business Profile)
- HighLevel API Key with Calendars, Users, Contacts, Conversations scopes
- Jane App admin access (for ICS feed URLs)
- Jane staff login credentials (for browser automation)
- List of practitioners who need calendar sync
1 Create the Practice
-
1
Go to Practices tab > Add Practice
Fill in: practice name, HighLevel Location ID, API Key, Jane subdomain, and timezone.
-
2
Test the HighLevel connection
Click the plug icon on the practice card to verify the API key works.
2 Set Up Jane Automation
This enables EverSync to create appointments in Jane when patients book through HighLevel.
-
1
Open Automation Settings
Go to Providers tab, find the practice row, click the gear icon.
-
2
Save Jane credentials
Enter Jane subdomain, staff email, and password. Click Save Credentials.
-
3
Test the login
Click Test Login. If it fails due to CAPTCHA, use the Session Cookies import method instead.
3 Add Providers (One per Practitioner)
-
1
Get Jane ICS Feed URLs
In Jane App: Settings > Calendar Integrations for each practitioner. Copy the Appointments feed URL (and optionally the Shifts URL).
https://[clinic].janeapp.com/feeds/XXXXX/appointments.ics
https://[clinic].janeapp.com/feeds/XXXXX/shifts.ics -
2
Create Sync Config
Go to Providers tab > Add Provider:
- Select the practice from dropdown
- Enter practitioner name (e.g., "Dr. Lindsay Bourque")
- Paste the Appointments feed URL
- Paste the Shifts feed URL (optional)
- Set Sync Shifts to OFF for concurrent booking
Auto-created: A HighLevel calendar named "[Practitioner] - Availability" is automatically created. -
3
Repeat for every practitioner
Each practitioner who needs calendar sync gets their own config (chiropractors, massage therapists, physiotherapists, etc.).
4 Run Initial Sync & Configure HighLevel
-
1
Trigger sync for each provider
Click the sync icon on each provider card. Check Sync Logs for results.
-
2
Configure concurrent slots in HighLevel
In HighLevel, open each auto-created calendar and set:
- Appointments Per Slot: Match practitioner capacity (e.g., 5)
- Slot Interval: 5 minutes
- Slot Duration: 5 minutes
- Open Hours: Match working schedule or set to 24/7
-
3
Verify in HighLevel
Confirm Jane appointments appear and available slot counts are correct.
5 Set Up Voice AI Services
-
1
Import services from appointment history
Go to Services tab, select the practice, click Import from History. Services are extracted from synced appointments with real durations.
-
2
Review and clean up
Edit services to set Display Names (voice-friendly), verify durations, toggle Voice Bookable off for non-phone services, and add Keywords for better matching.
-
3
Map practitioners to services
Click the practitioners badge on each service (e.g., "0 mapped") and add every practitioner who offers that service.
-
4
Test with the Voice AI panel
Expand the Voice AI Test Panel and type service names as callers would say them (e.g., "massage", "adjustment"). Verify high confidence matches and check availability.
6 Connect HighLevel Voice AI Agent
Connect HighLevel Phone AI via MCP Server. One URL, one tool — no custom actions or variable wiring needed.
MCP Server — Two Tools: find_availability + confirm_booking
find_availability handles service matching + slot lookup. confirm_booking creates the appointment after caller confirms. Click the Setup Guide button on each practice card for the copy-paste MCP URL.
AI Employee → Phone AI → MCP Servers → Add Server
Onboarding Checklist
| Step | Action | Where |
|---|---|---|
| 1 | Create practice with HL credentials | Practices tab |
| 2 | Test HL connection | Practices tab (plug icon) |
| 3 | Save Jane credentials | Providers tab (gear icon) |
| 4 | Test Jane login | Automation modal |
| 5 | Add sync config per practitioner | Providers tab (Add Provider) |
| 6 | Run initial sync | Provider card (sync icon) |
| 7 | Configure HL calendar concurrency | HighLevel UI |
| 8 | Import services | Services tab |
| 9 | Map practitioners to services | Services tab |
| 10 | Add MCP Server to Phone AI agent | HighLevel AI Employee → MCP Servers |
Sync Issues
| Problem | Fix |
|---|---|
| Appointments at wrong times | Timezone mismatch — practice timezone must exactly match Jane clinic timezone (Settings > Clinic > Timezone) |
| Sync shows 0 appointments | ICS feed URL may be expired — regenerate in Jane: Settings > Calendar Integrations. Also check sync_appointments is enabled. |
| "Calendar is not an event calendar" | HighLevel calendar type must be "Event" (not Service/Personal). Delete and recreate the sync config. |
| 401 Unauthorized errors | HL API key expired or wrong — regenerate in HighLevel > Settings > API Keys |
| ICS feed returns 404 | Feed URL was regenerated in Jane — update the provider's feed URL |
| Duplicate appointments | Practitioner has multiple sync configs — delete duplicates (one config per practitioner) |
| Past appointments failing | Normal — HighLevel rejects past appointments. Only future/current ones sync reliably. |
Connection & Credential Issues
| Problem | Fix |
|---|---|
| HL connection test fails | Verify Location ID and API key. Ensure API key has Calendars, Users, Contacts, Conversations scopes. |
| Automation modal shows blank | Password fields are blank for security. Check for the green "Credentials saved" banner. Only fill in to update. |
| Timezone confusion | Common values: America/New_York (Eastern), America/Chicago (Central), America/Denver (Mountain), America/Los_Angeles (Pacific), Canada/Saskatchewan (no DST) |
Jane Automation Issues
| Problem | Fix |
|---|---|
| Jane login fails / CAPTCHA | Import session cookies instead: log into Jane in Chrome, export cookies with "Cookie Editor" extension, paste into Automation Settings > Session Cookies |
| Session expired (amber warning) | Re-import fresh session cookies (they expire every ~24 hours) |
| Queue items stuck in "processing" | Cancel stuck items, restart the service, then retry. Check Automation tab for queue management. |
| Automation screenshots | Failed operations save screenshots for debugging. Check the Automation tab or server screenshots directory. |
Voice AI Issues
| Problem | Fix |
|---|---|
| Service lookup returns no matches | Import services first (Services tab > Import from History). Must have synced appointments first. |
| Low confidence scores | Add more keywords to the service and set a Display Name matching how callers say it. |
| No availability returned | Check: (1) practitioners mapped to service, (2) HL calendar has open hours, (3) slots aren't all booked. |
| Wrong service durations | Edit the service and correct the duration. Durations are auto-calculated from Jane appointment data. |
| Garbage service names | ICS parsing artifact — delete the bad service. Future imports filter these automatically. |
| Practitioner mapping dropdown empty | Practitioners must belong to the same HL location as the practice. |
Dashboard UI Issues
| Problem | Fix |
|---|---|
| Tab content not loading | Hard-refresh the page (Ctrl+Shift+R). Check browser console (F12) for JavaScript errors. |
| Data looks stale | Switch away from the tab and back, or refresh the page. Most tabs reload data when activated. |
| Modal shows wrong data | Close the modal, refresh the page, and try again. |
Diagnostic Commands (Server Admin)
Check service status
sudo systemctl status eversyncView recent logs
sudo journalctl -u eversync -n 50 --no-pagerFollow logs in real-time
sudo journalctl -u eversync -fRestart everything
sudo systemctl restart eversync && sleep 3 && curl -s http://localhost:8000/api/v1/healthAPI health check
curl -s http://localhost:8000/api/v1/health | python3 -m json.toolHighLevel Voice AI Integration
Connect EverSync to HighLevel's Phone AI agent so callers can book appointments by voice. The flow uses two Custom Actions:
Practice IDs (for Custom Action config)
Use the practice ID in the request body of your Custom Actions:
| Practice | ID | Jane Subdomain |
|---|---|---|
1 Custom Action: Look Up Service
Matches what the caller said to your service catalog using fuzzy text matching.
Action Settings
| Name | Look Up Service |
| Method | POST |
| Headers | Content-Type: application/json |
URL
https://YOUR_DOMAIN/api/v1/voice/services/lookup
Request Body
{
"practice_id": PRACTICE_ID_NUMBER,
"spoken_service": ""
}
Replace PRACTICE_ID_NUMBER with the actual practice ID from the table above.
Response Fields to Extract
| Variable | JSON Path | Description |
|---|---|---|
| service_id | $.best_match.service_id | ID of matched service |
| service_name | $.best_match.name | Service name |
| service_duration | $.best_match.duration_minutes | Duration in minutes |
| voice_prompt | $.voice_prompt | What the agent should say |
| requires_clarification | $.requires_clarification | Whether caller needs to choose |
2 Custom Action: Check Availability
Finds available appointment slots for the selected service. Supports filtering by practitioner or checking all.
Action Settings
| Name | Check Availability |
| Method | POST |
| Headers | Content-Type: application/json |
URL
https://YOUR_DOMAIN/api/v1/voice/availability
Request Body (any practitioner)
{
"practice_id": PRACTICE_ID_NUMBER,
"service_id": ,
"any_practitioner": true,
"date_range_days": 7
}
Request Body (specific practitioner)
{
"practice_id": PRACTICE_ID_NUMBER,
"service_id": ,
"practitioner_name": "",
"date_range_days": 7
}
Response Fields to Extract
| Variable | JSON Path | Description |
|---|---|---|
| has_availability | $.has_availability | true/false |
| voice_prompt | $.voice_prompt | Slots formatted for speech |
| slot_id | $.next_available_slot.slot_id | Unique slot ID for booking |
| start_time | $.next_available_slot.start_time | ISO datetime of slot |
| calendar_id | $.next_available_slot.calendar_id | HL calendar to book into |
| practitioner_name | $.next_available_slot.practitioner_name | Who the slot is with |
| total_slots | $.total_slots | Total available slots found |
3 Voice AI Agent Prompt Template
Copy and customize this prompt for your HighLevel Phone AI agent settings. Replace the bracketed placeholders with your practice details.
You are a friendly receptionist for [PRACTICE NAME]. You help callers book appointments.
BOOKING FLOW:
1. Greet the caller warmly.
2. Ask what type of appointment they need.
3. Once they describe the service, use the "Look Up Service" action with their words as service_spoken.
4. Read the voice_prompt from the response to confirm the service.
- If requires_clarification is true, read the options and ask them to choose.
- If a best_match is found, confirm it with the caller.
5. Ask if they have a preferred practitioner, or if any available practitioner is fine.
6. Use the "Check Availability" action with the service_id and optional practitioner_name.
7. Read the voice_prompt from the availability response (lists next available times).
8. When the caller picks a time, confirm: service name, date/time, practitioner name.
9. Collect their name, phone number, and email for the booking.
10. Confirm all details and let them know their appointment is booked.
RULES:
- Always confirm the service before checking availability.
- If no slots are available, offer to check a wider date range or different practitioner.
- Keep responses natural and conversational.
- If the caller asks something outside booking, politely redirect or offer to transfer.
PRACTICE INFO:
- Name: [PRACTICE NAME]
- Services: [LIST YOUR MAIN SERVICES]
- Hours: [YOUR HOURS]
- Address: [YOUR ADDRESS]
- Phone: [YOUR PHONE]
4 Create a Booking Workflow in HighLevel
After the Voice AI agent confirms a booking, a HighLevel Workflow creates the actual appointment.
-
1
Create a Workflow
Trigger: Phone AI call completed with
booking_confirmed = true -
2
Add "Create Appointment" action
Use the extracted variables:
- Calendar ID:
- Start Time:
- Duration:
minutes - Title: Phone Booking -
- Calendar ID:
-
3
Add confirmation SMS/email (optional)
Send a confirmation with appointment details, practitioner name, and cancellation instructions.
Tips for Better Voice Matching
Good Keywords (set in Services tab)
massagefor massage servicesadjustment,adjust,chirofor chiropracticphysio,physical therapyfor physiotherapyconsult,new patient,initialfor first visits
Confidence Thresholds
- Below 0.4: No match returned
- 0.4 to 0.8: Match found, caller confirms
- Above 0.8: High confidence auto-match
Need more help? Check the server logs or contact your system administrator.
Full documentation also available in docs/ONBOARDING.md, docs/TROUBLESHOOTING.md, and docs/VOICE_AI_SETUP.md