Developing a Mobile Application for Doctor Appointment Booking
Patient booked appointment for next Tuesday and forgot. Doctor waits, slot wasted — effectively lost. Clinic statistics show 15–25% no-show rate without reminders. Mobile app with properly configured reminders cuts this to 5–8%.
Reminder System as Key Feature
Three mandatory reminders for each appointment:
- 24 hours before — "Reminder: appointment with Dr. [Name] tomorrow at 2:30 PM"
- 2 hours before — "In 2 hours: appointment at [Clinic], Room 215"
- When you need to leave — calculated based on user geolocation and clinic address via Google Maps Distance Matrix API or 2GIS API
Third reminder is most valuable and rarest in implementation. Logic: night before appointment, server scheduler requests current user location (if PERMISSION_BACKGROUND_LOCATION granted) or last known, calculates travel time, schedules push at appointment_time - travel_time - 15 min.
On iOS requires Background Location usage description in Info.plist and NSLocationAlwaysAndWhenInUseUsageDescription. Apple carefully reviews justification during review — must clearly explain benefit.
Confirmation and cancellation directly from push notification — via UNNotificationAction:
let confirmAction = UNNotificationAction(
identifier: "CONFIRM_ACTION",
title: "Confirm ✓",
options: []
)
let cancelAction = UNNotificationAction(
identifier: "CANCEL_ACTION",
title: "Cancel Appointment",
options: [.destructive]
)
Tapping "Cancel" without opening app calls API, frees slot, notifies clinic.
Doctor Schedule: Technical Implementation
Schedule grid is most complex backend component. Each doctor has:
- Base schedule (Monday 9:00–1:00 PM, Wednesday 2:00–6:00 PM)
- Exceptions (vacations, sick leave, replacements)
- Slot duration (15, 20, 30 minutes — depends on specialty)
- Appointments per slot (usually 1, but group sessions exist)
Generating available slots for specific doctor on date range: take base schedule, subtract exceptions and occupied slots. PostgreSQL query with JOIN on appointments and exceptions tables, result cached in Redis for 5 minutes.
Simultaneous booking of same slot by two users (race condition) — transaction with SELECT FOR UPDATE on slot row. First gets confirmation, second — "slot already taken, choose another time".
Client Side: Time Selection
Calendar with available days (TableCalendar on Flutter) → slot selection (horizontal list of time buttons). Unavailable slots shown grayed, not hidden — user understands schedule fullness.
Show nearest available time at top immediately — reduces time to first tap.
Medical Record and History
Visit history, discharge summaries, test results — require special data security attention. In Russia — 152-FZ requirements and Health Ministry orders on medical data storage.
Documents stored in encrypted S3 (AES-256), access only via backend with rights check, presigned links with 15-minute TTL. Clients don't cache documents on disk.
Notifications for Doctor and Reception
Doctor receives push on tablet/phone:
- "New appointment at [time]" — with brief anamnesis if patient filled it
- "Patient confirmed appointment"
- "Patient cancelled 2 hours before" — frees slot
Reception sees general appointment list for day in web cabinet (React + WebSocket for live updates).
Stack and Timeline
| Component | Technology |
|---|---|
| Mobile | Flutter (iOS + Android) |
| Backend | Node.js/Go + PostgreSQL |
| Push | FCM + APNs |
| Maps | Yandex Maps SDK / Google Maps |
| Documents | S3-compatible + encrypted |
| Scale | Timeline |
|---|---|
| MVP: booking, reminders, history | 8–12 weeks |
| + Telemedicine (video consultations) | +6–8 weeks |
| + Integration with MIS (1C:Medicine etc.) | +4–8 weeks |







