EverSync

Scheduler Running Scheduler Stopped

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

Filter:
0
Pending
0
Acknowledged
0
Completed Today
0
Total

No pending entries. All caught up!

Healthcare Practices

Configure HighLevel locations for your practices

Setup Wizard

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.

Sync Logs

No sync logs yet.

Time Config Status Appointments Created Updated Deleted Errors

Scheduled Jobs

No scheduled jobs.

Jane App Automation

Automatically create Jane appointments from HighLevel bookings

Active Sessions: /
0
Queued
0
Processing
0
Completed
0
Failed
0
Total

Automation Settings by Configuration

Automation Queue

No items in the automation queue

Patient Appointment Status Retries Actions

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

Service Lookup

Test how spoken service names are matched

Matches:
Voice prompt:
No matches found for that input.

Availability Check

Test slot availability for a service

Available
Voice prompt:
No Availability
Voice prompt:
Click "Check Availability" on a matched service to test slot lookup.

Patient Lookup

Browse synced patients and their appointment history

Patients
Appointments
Showed
Missing HL Event
Enriched
Patients
Loading...
No patients found

Select a patient to view their appointments

No email/phone — not enriched
Loading appointments...
Date/Time Service Status Sync HL Event Source
No appointments found for this patient

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.

1 Create Practice

HighLevel credentials + Jane subdomain

2 Jane Automation

Save Jane credentials or cookies

3 Add Providers

One per practitioner with ICS feeds

4 Initial Sync

Sync Jane appointments to HighLevel

5 Voice AI Services

Import services + map practitioners

6 HL Voice Agent

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. 1

    Go to Practices tab > Add Practice

    Fill in: practice name, HighLevel Location ID, API Key, Jane subdomain, and timezone.

  2. 2

    Test the HighLevel connection

    Click the plug icon on the practice card to verify the API key works.

Critical: The timezone MUST match the Jane clinic timezone exactly, or appointments will sync at wrong times.

2 Set Up Jane Automation

This enables EverSync to create appointments in Jane when patients book through HighLevel.

  1. 1

    Open Automation Settings

    Go to Providers tab, find the practice row, click the gear icon.

  2. 2

    Save Jane credentials

    Enter Jane subdomain, staff email, and password. Click Save Credentials.

  3. 3

    Test the login

    Click Test Login. If it fails due to CAPTCHA, use the Session Cookies import method instead.

Tip: After saving, the credentials section shows a green "Credentials saved" banner. Password fields stay blank for security — your credentials are securely stored.

3 Add Providers (One per Practitioner)

  1. 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. 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. 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. 1

    Trigger sync for each provider

    Click the sync icon on each provider card. Check Sync Logs for results.

  2. 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. 3

    Verify in HighLevel

    Confirm Jane appointments appear and available slot counts are correct.

How concurrency works: If a practitioner has 5 slots at 2pm and Jane shows 3 booked, HighLevel shows 2 available. Disable "Sync Shifts" for this to work correctly.

5 Set Up Voice AI Services

  1. 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. 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. 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. 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
1Create practice with HL credentialsPractices tab
2Test HL connectionPractices tab (plug icon)
3Save Jane credentialsProviders tab (gear icon)
4Test Jane loginAutomation modal
5Add sync config per practitionerProviders tab (Add Provider)
6Run initial syncProvider card (sync icon)
7Configure HL calendar concurrencyHighLevel UI
8Import servicesServices tab
9Map practitioners to servicesServices tab
10Add MCP Server to Phone AI agentHighLevel AI Employee → MCP Servers

Sync Issues

ProblemFix
Appointments at wrong timesTimezone mismatch — practice timezone must exactly match Jane clinic timezone (Settings > Clinic > Timezone)
Sync shows 0 appointmentsICS 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 errorsHL API key expired or wrong — regenerate in HighLevel > Settings > API Keys
ICS feed returns 404Feed URL was regenerated in Jane — update the provider's feed URL
Duplicate appointmentsPractitioner has multiple sync configs — delete duplicates (one config per practitioner)
Past appointments failingNormal — HighLevel rejects past appointments. Only future/current ones sync reliably.

Connection & Credential Issues

ProblemFix
HL connection test failsVerify Location ID and API key. Ensure API key has Calendars, Users, Contacts, Conversations scopes.
Automation modal shows blankPassword 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

ProblemFix
Jane login fails / CAPTCHAImport 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 screenshotsFailed operations save screenshots for debugging. Check the Automation tab or server screenshots directory.

Voice AI Issues

ProblemFix
Service lookup returns no matchesImport services first (Services tab > Import from History). Must have synced appointments first.
Low confidence scoresAdd more keywords to the service and set a Display Name matching how callers say it.
No availability returnedCheck: (1) practitioners mapped to service, (2) HL calendar has open hours, (3) slots aren't all booked.
Wrong service durationsEdit the service and correct the duration. Durations are auto-calculated from Jane appointment data.
Garbage service namesICS parsing artifact — delete the bad service. Future imports filter these automatically.
Practitioner mapping dropdown emptyPractitioners must belong to the same HL location as the practice.

Dashboard UI Issues

ProblemFix
Tab content not loadingHard-refresh the page (Ctrl+Shift+R). Check browser console (F12) for JavaScript errors.
Data looks staleSwitch away from the tab and back, or refresh the page. Most tabs reload data when activated.
Modal shows wrong dataClose the modal, refresh the page, and try again.

Diagnostic Commands (Server Admin)

Check service status

sudo systemctl status eversync

View recent logs

sudo journalctl -u eversync -n 50 --no-pager

Follow logs in real-time

sudo journalctl -u eversync -f

Restart everything

sudo systemctl restart eversync && sleep 3 && curl -s http://localhost:8000/api/v1/health

API health check

curl -s http://localhost:8000/api/v1/health | python3 -m json.tool

HighLevel Voice AI Integration

Connect EverSync to HighLevel's Phone AI agent so callers can book appointments by voice. The flow uses two Custom Actions:

Caller phones in Service Lookup Availability Check Book Appointment

Practice IDs (for Custom Action config)

Use the practice ID in the request body of your Custom Actions:

PracticeIDJane Subdomain

1 Custom Action: Look Up Service

Matches what the caller said to your service catalog using fuzzy text matching.

Action Settings

NameLook Up Service
MethodPOST
HeadersContent-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

VariableJSON PathDescription
service_id$.best_match.service_idID of matched service
service_name$.best_match.nameService name
service_duration$.best_match.duration_minutesDuration in minutes
voice_prompt$.voice_promptWhat the agent should say
requires_clarification$.requires_clarificationWhether 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

NameCheck Availability
MethodPOST
HeadersContent-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

VariableJSON PathDescription
has_availability$.has_availabilitytrue/false
voice_prompt$.voice_promptSlots formatted for speech
slot_id$.next_available_slot.slot_idUnique slot ID for booking
start_time$.next_available_slot.start_timeISO datetime of slot
calendar_id$.next_available_slot.calendar_idHL calendar to book into
practitioner_name$.next_available_slot.practitioner_nameWho the slot is with
total_slots$.total_slotsTotal 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. 1

    Create a Workflow

    Trigger: Phone AI call completed with booking_confirmed = true

  2. 2

    Add "Create Appointment" action

    Use the extracted variables:

    • Calendar ID:
    • Start Time:
    • Duration: minutes
    • Title: Phone Booking -
  3. 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)

  • massage for massage services
  • adjustment,adjust,chiro for chiropractic
  • physio,physical therapy for physiotherapy
  • consult,new patient,initial for 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
Display Names: Set a Display Name for services with technical Jane names. E.g., Jane name "Chiropractic Visit Dr. Nicole Arnold 15 min" → Display name "Chiropractic Visit". The display name is what the agent says to the caller.

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

Add a practice first

HighLevel calendar will be auto-created

Sync name:

Jane App Calendar Feeds

Sync Settings

Use {service} for the service name from Jane

Notification Settings

Staff phone numbers to receive SMS alerts

Staff email addresses to receive alerts

No notifications will be sent during quiet hours

Notifications are sent via Evergreen

SMS and email are sent through your Evergreen/HighLevel account using the API key configured for this sync.

Practice Automation Settings

Jane credentials and automation settings apply to all practitioners in this practice
Enable Automation

Automatically create Jane appointments from HighLevel bookings

Jane App Credentials

Credentials saved— session active— session expired

Leave username/password blank to keep existing credentials. Fill them in to update.

https:// .janeapp.com

If Jane uses 2FA, enter your TOTP secret here

Session Cookies (Alternative Login)

If automated login fails due to CAPTCHA, you can manually log in to Jane and paste your session cookies here.

How to get cookies from your browser
  1. Log in to Jane App manually in your browser
  2. Open DevTools (F12) → Console
  3. Paste and run this code: JSON.stringify([...document.cookie.split('; ').map(c => { const [name, ...v] = c.split('='); return {name, value: v.join('='), domain: '.janeapp.com', path: '/'} })])
  4. Copy the output and paste it above

Browser Settings

Run browser without visible window

Timing Settings

Retry Settings

Patient Data Enrichment

Scrape full patient contact details (name, email, phone) from Jane App and sync to HighLevel contacts. This allows appointments to be linked to real patient contacts instead of placeholder contacts.

Enable Patient Data Scraping

Requires valid Jane session cookies

Max appointments to enrich per sync

Rate limiting between appointments

When enabled, each sync will scrape patient details from Jane's web interface. This creates HighLevel contacts with full name, email, and phone instead of the generic "Jane Sync - Blocked Time" placeholder.

Patient Cache & History Export

Downloads Jane's full patient list and appointment history as CSV files — replaces hundreds of per-patient API calls with a single export. Run on first setup and weekly thereafter.

Patients cached

Last export

Also runs automatically every Sunday at 2am Eastern

Security Notice

Jane credentials are encrypted at rest. Ensure your server is secure and only trusted staff have access to this dashboard.

Comma-separated terms for voice matching

Practitioner Mappings -

No practitioners mapped to this service

Voice AI Setup Guide —

Loading practice data...

1 Connect MCP Server

Paste this URL into HighLevel to connect Phone AI to EverSync. The AI gets two tools: find_availability (service matching + slot lookup) and confirm_booking (creates the appointment) — no custom actions or variable wiring needed.

Steps in HighLevel:

  1. Go to AI Employee → select or create your Phone AI agent
  2. Open MCP Servers tab → click Add Server
  3. Paste the URL above — no headers, auth, or parameters needed
  4. Save — two tools will appear: find_availability and confirm_booking
  5. Click find_availability and paste the following into the "When should the tool be used" field:
Use this tool whenever a caller wants to book, schedule, or check availability for an appointment. This includes when they ask about available times, want to see a specific practitioner, or request any type of service booking.

find_availability Response Variables:

Key Value
voice_prompt$.voice_prompt
has_availability$.has_availability
requires_clarification$.requires_clarification
service_name$.service_name
service_id$.service_id
practitioner_name$.practitioner_name
total_slots$.total_slots
next_available_slot.calendar_id$.next_available_slot.calendar_id
next_available_slot.start_time$.next_available_slot.start_time
next_available_slot.slot_id$.next_available_slot.slot_id
next_available_slot.date_display$.next_available_slot.date_display
next_available_slot.time_display$.next_available_slot.time_display
next_available_slot.voice_description$.next_available_slot.voice_description
success$.success
error$.error

confirm_booking Tool Setup:

This tool appears automatically alongside find_availability. Click it and paste the following into the "When should the tool be used" field:

Use this tool ONLY after: (1) the caller chose a specific time slot from find_availability results, (2) you collected their full name, email, and phone number, and (3) you read back the appointment details (service, date, time, practitioner) and they confirmed. Pass slot_id, calendar_id, start_time, and service_id exactly as returned by find_availability.

confirm_booking Response Variables:

Key Value
voice_prompt$.voice_prompt
success$.success
hl_appointment_id$.hl_appointment_id
jane_queued$.jane_queued
error$.error

2 Practice Overview

Practice Name:
Practice ID:
Timezone:
HL Location ID:
Server URL:
Voice API Key (embedded in MCP URL)

This key is already part of the MCP URL above. If you regenerate it, you must update the MCP server URL in HighLevel.

3 Voice-Bookable Services

No voice-bookable services found. Go to the Services tab to enable voice booking for services.
Service Name Display Name Duration Practitioners

4 Practitioners

No practitioners found for this practice.

5 Agent Prompt