Developing a Mobile App for a Beauty Salon
An app for a beauty salon is primarily online booking. Everything else (service catalog, promotions, visit history) is extra. If booking is inconvenient or unstable, other features won't save it.
Online Booking: Common Mistakes
The main mistake — showing masters and services independently, without considering real schedule. User picks master, picks time — but the master is already busy that slot. Correct flow: select service first → system shows only masters offering this service → from available schedule of specific master — pick slot.
Each step depends on the previous. This is crucial for architecture: API requests are sequential, not parallel. On Flutter — FutureBuilder with key: ValueKey(selectedService) to force state reset when service changes.
Booking Conflict must be handled: while User A views a slot, User B booked it. Solution: when proceeding to confirmation, do soft reserve (lock slot for 3 minutes via API), show countdown timer. When it expires — return to time selection. Standard pattern for booking systems.
Master Card and Portfolio
Master's work photos — important conversion element. GridView with CachedNetworkImage (Flutter) — lazy load + cache. Important: images should be from CDN with mobile optimization. Original 5MB photos will kill traffic and load time.
Rating and reviews — at least stars + text. ListView with pagination (infinite scroll via ScrollController.addListener).
Loyalty and Promotions
Accumulative points — separate state changing after each visit. Point awarding animation (AnimatedCounter, TweenAnimationBuilder) creates nice UX moment. Promotions — push notifications via FCM + In-App Banner on entry.
Tech Stack
Flutter + BLoC, REST API, Firebase for pushes and analytics. For MVP, backend often goes on Laravel + PostgreSQL or uses ready-made SaaS booking platform (YCLIENTS, Dikidi) with API integration.
Integration with existing CRM system (if salon has one) — main factor affecting timelines. Development from scratch: MVP 8-12 weeks. Cost calculated individually.







