Your EHR is the system of record.
It shouldn’t be the booking experience.
Telehealth funnels live or die on the booking step. Patients fill out intake, pick a time, and either become customers or bounce. Most EHR schedulers were never built for that.
So teams build their own. And then they own a scheduling engine forever.
Slow availability
Thirty seconds to compute a week of slots is normal for an EHR. In a booking flow, it’s a spinner the patient watches while they decide to leave.
Double-booking
When everyone is fighting over the next two hours of appointments, two requests a millisecond apart have to resolve correctly. Some schedulers give both patients the slot.
Rules the generic tools can't express
Provider rotations, state licensure, virtual-versus-in-person, protocol-specific constraints. Off-the-shelf HIPAA schedulers get you 70% of the way there, and the last 30% becomes your problem.
Your booking flow. Our engine.
SavvyCal Appointments is the scheduling layer between your patient app and your EHR. Build the booking experience on our API, or embed our components and skip the front-end work. Your app stays the source of truth for patients. We compute availability, enforce the rules, and book atomically.
- Built for your front end, or ours
- Built for healthcare
- Built to sit in a funnel
Everything a scheduling engine has to get right
The front-desk view
One schedule across every provider. Block a sick day, see who’s affected, reschedule them, all from one screen.
Provider self-service, with a safety net
Providers set their own hours and blocks, and connect Google Calendar so a forgotten lunch blocks the slot automatically.
Atomic booking
Two patients can’t get the same slot. Bookings resolve consistently under burst load, so your funnel doesn’t need to re-fetch and retry.
Policies, enforced server-side
Minimum notice, reschedule and cancellation windows, provider utilization, per-service slot cadence, monthly schedule releases.
Notifications, yours or ours
Bring your own reminder system, or use ours with fully customizable MJML templates.
Built to be called from code
Full OpenAPI spec. Every object — services, staff, schedules, blocks, clients, appointments — is create/read/update/delete over the API. Sandbox accounts are free and immediate.
- Availability computed server-side; your app never reconciles slots
- Webhooks for every appointment and block event
- Written in Elixir, for teams who care about that sort of thing
GET /v1/services/{service_id}/slots ?from=2026-09-01 &until=2026-09-03{ "data": { "aggregated_slots": [ { "count": 3, "start_at": "2026-09-01T14:00:00Z", "end_at": "2026-09-01T14:15:00Z" }, { "count": 2, "start_at": "2026-09-01T14:15:00Z", "end_at": "2026-09-01T14:30:00Z" } ] }}Already running patient booking at scale
CNY Fertility, one of the largest fertility networks in the US, had an EMR with no API and a manual, phone-driven scheduling process. Echobind built their patient app on SavvyCal Appointments. Consult wait times went from over a month to two days, with 100% self-service booking, rescheduling, and cancellation.

Consult wait time at CNY Fertility, before and after.
Self-service booking, rescheduling, and cancellation.
Sub-second availability, a month of slots at a time.

SavvyCal worked closely with our team every step of the way. The incumbents we tried in the past only got us 70% there and were very pricey.
Michael Yared
CEO, Echobind
From sandbox to production in three steps
- Step 01
Model your practice
Create services, add providers, set working hours and slot rules. Or do all of it over the API.
- Step 02
Wire in your app
Embed the booking flow or call the API directly. Listen for webhooks to stay in sync.
- Step 03
Go live under a BAA
Sign the BAA, migrate your first tenant, and turn off the EHR's scheduler.
Questions engineers ask
Something we didn’t cover? Talk to the founder.
Yes. Send an opaque client ID; keep patient data in your system. Appointments stores what it needs to book and nothing more.
Fast enough to render inline in a booking flow. We’ve optimized slot computation repeatedly for a customer running 80+ providers with a month of slots queried at once.
No. Bookings are atomic.
Connect their calendar. Conflicts block availability automatically, and their personal calendar only ever shows “Appointment — Your Brand.”
Yes, on every Appointments account.
Pricing is based on provider and appointment volume, starting with a BAA-backed plan. Talk to us for a quote.
Elixir/Phoenix, hosted in the US.
