An advanced booking & operations platform built for a women's salon - designed not around a calendar, but around "how a salon actually operates" under real daily pressure.
Domain: Service Business OperationsStatus: π’ Soft Launch β Live Testing
RoleFull-stack Engineer
ComplexityMulti-role Β· Multi-constraint System
ImpactOperational chaos to Structured system
Project Gallery
11 images
+6more
π‘ The Real Engineering Challenge
Most booking systems treat an appointment as a simple tuple: service + time + customer.
[Redacted]was built around a harder question:
what does it actually take for a booking to be possible?
"The problem wasn't building a booking page. The problem was modeling the operational logic of a salon itself."
Shift-Aware Scheduling No Ghost Slots
Staff availability isn't just a name in a database. [Redacted] ties every time slot to
actual shift windows, work days, and exceptions β before surfacing it to the customer.
Conflict Prevention First Zero Double-Books
The system validates against service duration, staff assignment, and concurrent bookings
before any appointment is confirmed β not after.
Payment-Linked Booking Real Intent
Bookings from the website require a deposit. Reception-created bookings require
full payment. The appointment state machine reflects both paths cleanly.
Best-Fit Recommendation Smart Allocation
Customers can pick a specific staff member β or let the system
recommend the best available match based on service, time, and shift constraints.
ποΈ System Architecture
[Redacted] operates as four interconnected layers β each solving a distinct operational concern.
Booking Request
β
βΌ
Availability Engine
β βββ Is the service available?
β βββ Does the time fit within shift hours?
β βββ Is the staff member free? (no overlap check)
β βββ Specific pick or best-fit recommendation?
β
βΌ
Payment Gate
β βββ Online booking β Deposit required
β βββ Reception entry β Full payment recorded
β
βΌ
Appointment State Machine
β Pending β Awaiting Deposit β Confirmed
β Confirmed β Completed / No-show / Rescheduled / Cancelled
β
βΌ
WhatsApp Notifications β Customer Confirmation + Reminders
β
βΌ
Financial Reports + Admin Dashboard (Manager Layer)
π Appointment States
Every appointment moves through a defined state machine β no ambiguity in what "confirmed" means.
The platform doesn't mix all users into one view. Each role has a dedicated,
permission-scoped experience that matches their actual daily job.
π
Customer
Browse 200+ services, create multiple bookings, pick a specific staff member or use best-fit recommendation, pay deposit online, receive WhatsApp updates.
ποΈ
Staff Member
View shift-linked personal schedule, see assigned services, track upcoming appointments, avoid surprises β no access outside their scope.
π₯οΈ
Receptionist
Enter walk-in bookings (full payment), handle cancellations and rescheduling through the control panel, manage daily operations in real time.
π
Site Manager
Full visibility: all bookings, all staff shifts, services and pricing, financial reports, daily pressure monitoring β a genuine operational control layer.
π§ Why This Is Actually Hard
This isn't a CRUD app with a calendar skin. The real complexity is in the constraints.
Modeling real availability β A staff member being "in the database" doesn't mean she's bookable.
Availability is calculated from shift start/end, assigned service types, and existing confirmed appointments.
200+ services with distinct durations β Every service has its own duration, price, and potentially a required skill level or specific staff assignment.
Scheduling must account for the actual time block each service occupies.
Payment as a workflow gate β The booking-to-payment link is behavioral: online bookings trigger a deposit flow,
reception entries bypass it with full payment. The state machine must reflect this without leaking logic between paths.
Role-based access across a live system β Four roles with different views, different permissions, and different operational realities β
all sharing the same underlying data layer without colliding.
The best UX here isn't a beautiful animation. The best UX is a system that prevents chaos before it starts.