Developing a Mobile App for Pharmacy and Medicine Delivery
A pharmacy app is not a standard e-commerce with a "buy" button. The turnover of medicines is regulated by law: prescription drugs require recipe verification, some items can't be sold remotely at all. This imposes architecture requirements that can't be added after launch.
Core App Functionality
Medicine catalog with search by INN (international non-proprietary name), brand name, and barcode — basic but non-trivial. A pharmaceutical database with synonyms, analogs, and drug groups requires full-text search with query normalization: "paracetamol", "Paracetamol-UBF", "acetaminophen" should give overlapping results.
On Flutter, implement search via SearchDelegate with 300-500ms debounce, on backend — PostgreSQL with pg_trgm extension for fuzzy search or Elasticsearch for large catalogs (5000+ items). Barcode — via mobile_scanner (Flutter) or react-native-vision-camera with MLKit BarcodeScanning plugin.
Recipe Control. For Rx drugs in cart — a checkout block until recipe photo is uploaded. A pharmacist validates the recipe manually (asynchronously) or via EGISZ integration (in RF). On UI: recipe status indicator in order, push notification on status change via Firebase Cloud Messaging.
Geolocation and Pharmacy Network
Pharmacy map with filtering by product availability — key feature for chains. Implementation: when searching a product, show not just "in stock / out of stock", but "in 3 nearby pharmacies, closest 400m away". This requires storing stock per location in real-time (ERP sync) and geospatial queries in PostgreSQL via PostGIS or Firebase Firestore with GeoHash.
Flutter: flutter_map (OpenStreetMap) or Google Maps SDK. Marker clustering via flutter_map_marker_cluster for networks with 50+ locations — without it the map is unreadable.
Delivery. Integration with partner delivery services (CDEK, Yandex.Delivery, own couriers) via webhook model: order statuses update in real-time. Courier tracking on map — via EventChannel (Flutter) or EventEmitter (React Native) with WebSocket or Firebase Realtime Database.
Push Notifications and Reminders
A pharmacy app without push is half the value. Scenarios:
- order ready for pickup
- courier on the way / arrived
- medication intake reminder (if tracker implemented)
- notification of product in stock (wishlist)
Firebase Cloud Messaging + flutter_local_notifications for local reminders (intake tracker). For iOS, explicit UNUserNotificationCenter.requestAuthorization is required — without approval, pushes don't come and app can't prompt for permission on each launch.
Medication Intake Tracker
Additional value: intake schedule with reminders, intake history, treatment courses. Data — in local DB (Isar for Flutter, MMKV for React Native) with cloud sync. Reminders via flutter_local_notifications with AndroidNotificationDetails with importance: Importance.high — otherwise on Android 13+ notification won't wake phone from doze mode.
Payment System Integration
Card payment via Stripe SDK (flutter_stripe) or YooKassa (yookassa_payments_flutter). For pharmacies with 18+ items (some BAD, alcohol tinctures) — age verification before checkout. Apple Pay / Google Pay — via pay package (Flutter).
Pickup vs Delivery affects cart logic: with pickup, we reserve product at specific location, with delivery — at warehouse. Different business logic requiring explicit switch point in checkout.
Tech Stack and Architecture
Flutter + Clean Architecture (Domain / Data / Presentation). State management — Riverpod or Bloc. Backend: Node.js / Laravel with REST API, PostgreSQL. Notifications — Firebase. Maps — Google Maps or Yandex.Maps.
Auth: SMS OTP via Firebase Auth or SMS.ru, no full registration needed — lowers entry barrier.
Timelines
| Configuration | Timeline |
|---|---|
| MVP: catalog, cart, order, pickup | 6-10 weeks |
| + delivery with courier tracking | +3-4 weeks |
| + intake tracker + full pharmacy network | +4-6 weeks |
Cost is calculated individually after requirements and integration analysis.







