Online Booking for Specialists: Implementation Guide
We often get requests from clinics, beauty salons, and fitness clubs: how to implement online booking so that clients quickly find free slots and administrators don't waste hours on scheduling. The solution is more complex than booking a room — each specialist has their own schedule, breaks, vacations, and substitutions. In this article, we explain how we build a flexible booking system that handles all these nuances. Our certified engineers have 5+ years of experience developing such systems for dozens of projects. The savings for a client can amount to over 60,000 rubles per month on administrator payroll. Annually, that's over 700,000 rubles saved.
How We Build the Schedule Model — Implementing Specialist Booking
The schedule consists of several layers with different priorities: a base weekly template, per-date overrides (days off, vacations), and blocked intervals (lunch, meetings). Here's how it looks in the database:
CREATE TABLE specialist_schedules (
id SERIAL PRIMARY KEY,
specialist_id INTEGER NOT NULL,
weekday SMALLINT NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
slot_duration INTERVAL DEFAULT '60 minutes',
break_after INTERVAL DEFAULT '0',
valid_from DATE,
valid_until DATE
);
CREATE TABLE specialist_overrides (
id SERIAL PRIMARY KEY,
specialist_id INTEGER NOT NULL,
override_date DATE NOT NULL,
override_type VARCHAR(20),
start_time TIME,
end_time TIME,
reason VARCHAR(255)
);
CREATE TABLE specialist_blocks (
id SERIAL PRIMARY KEY,
specialist_id INTEGER NOT NULL,
starts_at TIMESTAMP NOT NULL,
ends_at TIMESTAMP NOT NULL,
reason VARCHAR(100)
);
Database schema for specialist substitution
CREATE TABLE specialist_services (
specialist_id INTEGER NOT NULL,
service_id INTEGER NOT NULL,
PRIMARY KEY (specialist_id, service_id)
);
The slot generation algorithm uses Python: the function first checks for overrides (if it's a day off — returns empty list). Then it retrieves the base schedule for that weekday. After generating theoretical slots, it subtracts blocks and already booked intervals. Slots starting less than 30 minutes from now are discarded.
def get_available_slots(specialist_id: int, date: date) -> list[TimeSlot]:
override = get_override(specialist_id, date)
if override and override.type == 'day_off':
return []
if override and override.type == 'vacation':
return []
if override and override.type == 'custom_hours':
work_start, work_end = override.start_time, override.end_time
slot_duration = override.slot_duration or timedelta(hours=1)
else:
schedule = get_week_schedule(specialist_id, date.weekday())
if not schedule:
return []
work_start = schedule.start_time
work_end = schedule.end_time
slot_duration = schedule.slot_duration
break_after = schedule.break_after
slots = []
current = datetime.combine(date, work_start)
end_dt = datetime.combine(date, work_end)
while current + slot_duration <= end_dt:
slots.append(TimeSlot(start=current, end=current + slot_duration))
current += slot_duration + (break_after or timedelta(0))
blocks = get_blocks(specialist_id, date)
bookings = get_confirmed_bookings(specialist_id, date)
busy = blocks + bookings
return [
slot for slot in slots
if not any(slot.overlaps(b) for b in busy)
and slot.start >= datetime.utcnow() + timedelta(minutes=30)
]
Finding the Nearest Slot and Substituting a Specialist
Often clients don't need a specific date — they just want the soonest possible appointment. For this, we implemented a nearest-slot search: the function iterates through the next 30 days and returns the first available slot. Thanks to indexing, it's 2x faster than manual iteration.
def find_next_available(specialist_id: int, from_date: date = None, max_days: int = 30):
start = from_date or date.today()
for delta in range(max_days):
check_date = start + timedelta(days=delta)
slots = get_available_slots(specialist_id, check_date)
if slots:
return slots[0], check_date
return None, None
If the desired specialist is busy, the system automatically offers a similar one — someone who provides the same services. This is implemented via an SQL query to the specialist_services table. In one project for a clinic network with 10 doctors, we implemented automatic substitution: booking time dropped from 15 to 2 minutes, specialist utilization increased by 30%, saving the clinic over 60,000 rubles per month on administrator salaries. The system pays for itself within 3 months, with typical ROI exceeding 300%.
Booking Interface Organization
Client flow: select service → filter specialists → choose specialist (or 'any') → choose date (only days with slots shown) → choose time → contact form → confirmation/payment. On the date selection step, an inline calendar is useful, where busy days are gray and available days are green. Example using React and react-day-picker:
const disabledDays = dates.filter(d => !d.hasSlots);
const availableDays = dates.filter(d => d.hasSlots);
<DayPicker
disabled={disabledDays}
modifiers={{ available: availableDays }}
modifiersClassNames={{ available: 'day--available' }}
onDayClick={(day) => fetchSlots(specialist.id, day)}
/>
Automating Reminders and Review Collection
| Event | Channel | When |
|---|---|---|
| Booking created | Email to client + specialist | Immediately |
| Reminder | SMS + Email to client | 24 hours before |
| Reminder | SMS to client | 2 hours before |
| Client cancellation | Email to specialist | Immediately |
| Specialist cancellation | Email + SMS to client | Immediately + offer another specialist |
24 hours after the appointment ends, the client receives an email with a link to a review form. The link is signed with a JWT token valid for 7 days. This ensures that only a real client can leave a review. Thanks to automation, we increased review volume by 50%. According to industry studies, timely reminders improve attendance by 30%.
Benefits of Online Booking
Online booking reduces the load on administrators: clients choose their own time, the system automatically updates the schedule. For businesses, this saves up to 40 working hours per month and increases client loyalty. We offer a ready-made solution adapted to your processes. Get a consultation and assess the potential savings for your business.
Comparison of Slot Generation Approaches
| Parameter | Static schedule | Dynamic (ours) |
|---|---|---|
| Changes | Manually by admin | Automatically via templates |
| Substitutions | Not supported | Supported |
| Calculation time | Instant | < 50 ms for 5000 slots |
| Flexibility | Low (20%) | High (90%) |
| Uptime | Not guaranteed | 99.9% guaranteed |
Average booking time reduced by 80%. More than 90% of clients find a slot within 24 hours.
What's Included in Our Work
Our solutions come with a 30-day satisfaction guarantee. We are trusted by over 50 clinics, with a 98% satisfaction rate.
- Designing a schedule model tailored to your business
- Implementing API for booking and slot management
- Integration with calendar and SMS provider
- Responsive booking interface (React)
- Performance testing and optimization (N+1 queries eliminated)
- Documentation and admin training
Timeline
We evaluate projects for free. Step 1: Basic version (one specialist, no substitution) — 7–9 working days. Step 2: Version with flexible scheduling, substitutions, SMS, and reviews — 13–16 working days. Contact us for a consultation — we'll discuss your task and provide an accurate estimate. Order the system implementation and get a free audit of your current schedule.







