Пацієнт записався на прийом на наступний вівторок і забув. Лікар чекає, слот зайнятий — фактично втрачений. За статистикою клінік, 15–25% записів — no-show без нагадувань. Ми розробляємо мобільні додатки з налаштовуваними нагадуваннями, які скорочують no-show до 5–8% — у 3–4 рази ефективніше за SMS-розсилку. Середня вартість порожнього слоту для клініки — 1500–3000 гривень. Скорочення no-show з 20% до 5% на 50 лікарях економить до 450 000 гривень на місяць. Наше рішення включає Push-сповіщення, геолокаційну підтримку та інтеграцію з календарем, що підтверджено сертифікатами та досвідом 5+ років і понад 20 проєктах у сфері охорони здоров'я. За даними дослідження Journal of Medical Internet Research, комбіновані нагадування скорочують no-show на 40%. Отримайте консультацію щодо вашого проєкту — ми допоможемо обрати оптимальну архітектуру.
Чому система нагадувань — основа успіху?
Три обов'язкові нагадування для кожного запису:
- За 24 години — «Нагадуємо про запис до лікаря [ПІБ лікаря] завтра о 14:30»
- За 2 години — «Через 2 години прийом у [клініка], кабінет 215»
- У момент, коли потрібно виходити — розраховується на основі геолокації користувача та адреси клініки через Google Maps Distance Matrix API або 2GIS API
Третій тип найцінніший і найрідкісніший у реалізації. Логіка: вночі перед прийомом серверний планувальник запитує поточну локацію користувача (якщо дозвіл PERMISSION_BACKGROUND_LOCATION отримано) або останню відому, розраховує час у дорозі, ставить задачу відправки push на appointment_time - travel_time - 15 min.
На iOS для цього потрібен Background Location usage description в Info.plist і NSLocationAlwaysAndWhenInUseUsageDescription. Apple ретельно перевіряє обґрунтування при рев'ю — потрібно чітко пояснити користь.
Докладніше про дозвіл фонової геолокації
Apple вимагає явного зазначення причини в Info.plist. Наприклад: «Додаток використовує ваше місцезнаходження у фоні, щоб розрахувати час у дорозі до прийому та відправити своєчасне нагадування». Без цього App Store відхилить збірку.
Підтвердження та скасування прямо з push-сповіщення — через UNNotificationAction:
let confirmAction = UNNotificationAction( identifier: "CONFIRM_ACTION", title: "Підтвердити ✓", options: [] ) let cancelAction = UNNotificationAction( identifier: "CANCEL_ACTION", title: "Скасувати запис", options: [.destructive] ) Натискання «Скасувати» без відкриття додатку викликає API, звільняє слот і повідомляє клініку.
Розклад лікарів: технічна реалізація
Сітка розкладу — найскладніший компонент на бекенді. Кожен лікар має:
- Базовий розклад (понеділок 9:00–13:00, середа 14:00–18:00)
- Винятки (відпустки, лікарняні, заміни)
- Тривалість слоту (15, 20, 30 хвилин — залежить від спеціалізації)
- Кількість записів на один слот (зазвичай 1, але бувають групові заняття)
Генерація доступних слотів для конкретного лікаря на діапазон дат: беремо базовий розклад, віднімаємо винятки та вже зайняті слоти. Запит до PostgreSQL з JOIN на таблицю appointments та exceptions, результат кешується в Redis на 5 хвилин.
При одночасному записі двох користувачів на один слот (race condition) — транзакція з PostgreSQL row-level locking (SELECT FOR UPDATE) на рядок слоту. Перший отримує підтвердження, другий — «цей слот уже зайнятий, оберіть інший час».
Як технічно реалізувати вибір часу?
Кроки реалізації:
- Завантажити список лікарів та їх базовий розклад.
- За вибраним лікарем запитати доступні слоти на найближчі 7 днів.
- Відобразити календар з доступними днями (
TableCalendarна Flutter). - При виборі дня показати горизонтальний список часових кнопок з доступними слотами.
- Недоступні слоти показуємо сірим, не приховуємо — користувач розуміє заповненість розкладу.
- Відразу показуємо найближчий доступний час вгорі — знижує час до першого тапу.
- При виборі слоту — фіксація з оптимістичним UI та запитом до API.
Медична карта та історія
Історія відвідувань, виписки, результати аналізів — потребує особливої уваги до безпеки даних. В Україні — вимоги Закону «Про захист персональних даних» та накази МОЗ щодо зберігання медичних даних.
Документи зберігаються в зашифрованому S3 (AES-256), доступ тільки через backend з перевіркою прав, посилання presigned з TTL 15 хвилин. На клієнті документи не кешуються на диску.
Сповіщення для лікаря та реєстратури
Лікар отримує push на свій планшет/телефон:
- «Новий запис на [час]» — з коротким анамнезом якщо пацієнт заповнив
- «Пацієнт підтвердив запис»
- «Пацієнт скасував за 2 години до прийому» — звільняє слот
Реєстратура бачить загальний список записів на день у web-кабінеті (React + WebSocket для live-оновлень).
Стек та терміни
| Компонент | Технологія |
|---|---|
| Mobile | Flutter (iOS + Android) |
| Backend | Node.js/Go + PostgreSQL |
| Push | FCM + APNs |
| Карти | Yandex Maps SDK / Google Maps |
| Документи | S3-compatible + encrypted |
| Масштаб | Термін |
|---|---|
| MVP: запис, нагадування, історія | 8–12 тижнів |
| + Телемедицина (відеоконсультації) | +6–8 тижнів |
| + Інтеграція з МІС (1С:Медицина та ін.) | +4–8 тижнів |
Що входить у роботу
- Аналіз бізнес-вимог та проєктування архітектури
- Розробка клієнтської частини (iOS + Android) на єдиному коді Flutter
- Реалізація backend-сервісу з PostgreSQL та Redis
- Налаштування Push-сповіщень (FCM/APNs) та інтеграція карт
- Підготовка документації та інструкцій для адміністраторів
- Розміщення в App Store та Google Play з повним супроводом
- Гарантійна підтримка 3 місяці
Отримайте консультацію щодо вашого проєкту — ми підготуємо пропозицію з точними термінами та вартістю під вашу специфіку.







