Medical Clinic Mobile Application Development
Medical app — not just "book doctor + online consultations". Work under strict data requirements (HIPAA in US, FZ-323 and Ministry Health Order 965n in Russia, GDPR in Europe), integration with medical information systems (MIS), specific scenarios where UX mistake has clinical consequences.
Architecture Determination
Before first line of code, answer three questions:
What personal data processed? Full name + birth date = personal data under FZ-152. Diagnoses, tests, medical history = special category — requires separate consent and enhanced protection. HIPAA similarly distinguishes PHI. Server and storage requirements fundamentally differ.
Telemedicine present? Online consultations in Russia governed by Health Ministry Order 965n. Prescribing treatment via video requires patient identification with confirmed identity (SNILS, passport). Western apps — HIPAA requires BAA (Business Associate Agreement) from video providers.
MIS integration? 1C:Medicine, MedElement, Archimed+, TeleMed2 — each has own API. Often via FHIR (Fast Healthcare Interoperability Resources) — medical data exchange standard. Or HL7 v2 — legacy protocol, still widely used.
Typical Architecture
Standard modules for clinic:
- Auth — registration, identity verification (SNILS / passport), biometric login.
- Appointment — doctor schedules, online booking, reminders (Push, SMS).
- Personal Cabinet — visit history, test results, prescriptions.
- Telemedicine — video consultation, chat with doctor.
- Payments — acquiring, insurance payment, installments.
- Notifications — appointment reminders, test readiness, follow-ups.
Appointment Booking: Not Just Calendar
Complexity:
Real-time load. Slot available 30 seconds ago may be taken. Without WebSocket/polling every 10–15 seconds — user picks occupied slot, gets error. Optimistic locking + informative message.
Pre-booking vs live queue. Some clinics mix both. App reflects: "Booked 2:30 PM" and "Live queue, currently seeing patient 4 of 7".
Cancellation and rescheduling. Policy (free before N hours, penalty later). Push 24 hours before with "Confirm / Reschedule / Cancel" buttons.
Telemedicine: Video
Providers: Daily.co, Twilio Video, Agora, Zoom SDK, Vonage. HIPAA-compliant: Daily.co Business, Twilio HIPAA-eligible. Russian market: check data residency requirements — many Western providers unsuitable.
// Flutter — Agora RTC
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
final engine = createAgoraRtcEngine();
await engine.initialize(RtcEngineContext(appId: agoraAppId));
await engine.enableVideo();
await engine.startPreview();
final token = await consultationRepository.getAgoraToken(channelId);
await engine.joinChannel(
token: token,
channelId: channelId,
uid: currentUserId,
options: const ChannelMediaOptions(
channelProfile: ChannelProfileType.channelProfileCommunication,
clientRoleType: ClientRoleType.clientRoleBroadcaster,
),
);
Agora token generated server-side with temporal TTL. Never static in production.
UX during call: connection quality indicator, mute / camera toggle, request patient camera, consultation countdown, tech support button. Call recording (if allowed) — explicit notification both sides.
Lab Results: PDF and Structured Data
Labs deliver two ways: PDF and structured (HL7, FHIR, JSON via MIS API). For app need both:
PDF — embed via PDFKit (iOS) or AndroidPdfViewer. For FHIR DiagnosticReport — parse and display with reference ranges and color indicators (normal / abnormal).
Important: lab results — special category data. Client-side encryption mandatory. FileProtectionType.completeUnlessOpen (iOS) / EncryptedFile from androidx.security (Android). Never cache unencrypted.
Push Notifications: Medical Specifics
Appointment reminders — 24 hours and 2 hours before. Push with action buttons: "Confirm" / "Reschedule" — handle in UNNotificationResponse (iOS) / NotificationReceiver (Android) without app open.
"Test results ready" — sensitive. Preview (locked screen) not show diagnosis — only "Results ready, open app". Configure via UNMutableNotificationContent.interruptionLevel (iOS 15+) and NotificationCompat.PRIORITY_DEFAULT without sensitive content.
Payments
Acquiring: CloudPayments, Tinkoff Acquiring SDK, Robokassa for Russia. Stripe for international. Apple Pay and Google Pay integration mandatory for conversion.
Cloud register (FZ-54): each app payment must be fiscalized. Connect ATOL Online, OFD.ru or similar — send receipt via email/phone. Without — administrative liability.
Security and Audit
Certificate Pinning — mandatory. TrustKit (iOS) or OkHttp CertificatePinner (Android). Backup pinned certificates.
Root/Jailbreak detection — for PHI apps. IOSSecuritySuite (iOS), RootBeer (Android). On detection: don't block completely (aggressive, imprecise), but encrypt sensitive content additionally.
Audit Log — every medical data access logged (who, what, when). Log server-side, immutable from client.
Timeline
| Phase | Duration |
|---|---|
| Analytics, architecture, UX | 3–4 weeks |
| Auth + verification | 2–3 weeks |
| Appointments + schedule | 3–4 weeks |
| Personal cabinet + lab | 2–3 weeks |
| Telemedicine (video + chat) | 3–4 weeks |
| Payments + fiscalization | 2 weeks |
| MIS integration | 3–6 weeks (depends on MIS) |
| QA, security, release | 3–4 weeks |
MVP (appointment + personal cabinet without telemedicine) — 4–5 months. Full with telemedicine and MIS — 7–12 months. Cost estimated individually.







