For the salon
What changes at the front desk
An app is only worth building when it takes work off the desk and brings clients back sooner. This is what the second generation does for Zeus, day to day.
Fewer phone calls
Clients see the salon’s real free slots and book them without a call. What used to be a conversation at the desk is a tap on the phone, at any hour.
Changes go both ways
A move, a cancellation or a walk-in entered in the CRM reaches the client’s phone as a push within seconds. Nothing has to be phoned through.
Regulars come back faster
A favourite barber’s next free times sit on the client’s home screen; the last visit has “Book again”. The shortest path to the next visit is one tap.
Loyalty that is visible
The cashback balance, tier and progress live on the home screen instead of in a leaflet. The programme itself stays in the CRM — nothing is duplicated or reconciled by hand.
Keep the CRM you have
The staff keep working in the tool they know. The app reads and writes through a middleware, so a change of CRM later is a backend change with no app update.
Two salons, one app
Both Zeus branches live in the same app with their own hours, teams and price lists. A third one is configuration, not a project.
For clients
Booking in under a minute
The first generation of the app was a loyalty card with a booking form attached. The new one is built around the visit itself: the home screen shows the live cashback balance and the last visit with a one-tap “Book again”, and a booking can start from a service or from a barber — whichever the client thinks of first.
Two ways in
Start from the service or from the barber. Barbers carry their grade (Junior, Barber, Senior, Top, Chief), rating and review count; the “any barber” option lets the salon assign one.
Real free slots
Morning, afternoon and evening slots come from the salon’s live schedule, so the app never offers a time the front desk would have to move.
Slide to book
The confirmation screen lists barber, time, services, price range, accepted payment methods (cash, card, Apple Pay, Google Pay) and how much of the bill the cashback balance can cover.
Guest booking
A visit can be booked with just a name and a phone number. Signing in — a one-time code to the phone, no passwords — is needed only to see, move or cancel bookings.
Cashback loyalty
The Zeus cashback card lives on the home screen with its current balance; tiers and progress are read from the salon’s own loyalty programme, not re-implemented in the app.
Reviews and the salon
Clients rate a visit for 14 days after it, read the salon’s reviews, and find opening hours, directions, call, message and website in one place. Bulgarian, English and Russian out of the box.
Favourite barbers
A client marks a barber and up to three services as favourites. The home screen then shows that barber’s next free slots for each service, and one tap on a slot books it — no flow, no forms.
A home screen you arrange
The five home blocks — salons, cashback, upcoming bookings, favourite barbers, last visit — can be shown, hidden and reordered in Settings, so the app opens on what each client actually uses.
Live notifications
A booking confirmed, moved or cancelled at the desk reaches the phone as a push within seconds; a loyalty change updates the balance. With the app open it is a quiet in-app banner, in the background a system notification.
Screens
The booking flow, as shipped








The same code runs on Android. Below: the Android build in Bulgarian.


Under the hood
A middleware that outlives the CRM
The app never talks to the CRM directly. A Ktor middleware — the Zeus backend — owns the mobile API contract and translates it to whatever the salon runs today. The contract is frozen and test-enforced, so a CRM switch is a backend change with zero app releases.
One contract, 26 endpoints
The mobile API is a versioned, documented specification with an OpenAPI export that is test-equal to the docs. DTOs mirror it byte for byte; the error catalogue is enforced by tests.
CRM behind ports
Branches, services, staff, availability, clients, records, loyalty and reviews are eight ports. The CRM adapter is the only module allowed to know the vendor; the architecture test keeps it that way.
Provider-computed availability
Free slots are computed by the CRM and normalised by Zeus, with stale-while-revalidate caches and request coalescing so a busy Saturday morning does not turn into a CRM outage.
Content overlay
Rich fields the CRM lacks — localised descriptions, grades, hero images with BlurHash placeholders, opening-hours text — live in Zeus’s own store and are merged per locale.
Safe writes
Every booking write carries an idempotency key, retries replay the original response, and salon-side changes (a move at the front desk, a walk-in cancellation) are picked up by a delta-poll job.
Passwordless identity
Sign-in is a one-time code to the phone; sessions are Ed25519-signed tokens with rotation and theft detection. Rate limits per device and IP guard the anonymous endpoints.
Engineering
What it took
- ●Kotlin end to end. The app is Kotlin Multiplatform with Compose Multiplatform UI on both platforms; the backend is Kotlin on Ktor with PostgreSQL. One language, one architecture (VISCE), one set of conventions across mobile and server.
- ●Custom design system. No Material: the UI is built from Composables UI primitives and Lucide icons on Zeus’s own tokens, so the app looks like the brand, not like a framework.
- ●Contract-first. The mobile API was written, reviewed and frozen before the first backend stage; route tests run against both a fake CRM and recorded fixtures of the real one.
- ●Production-grade from day one. Structured logs with redacted phone numbers, Prometheus metrics, a circuit breaker and bulkhead around the CRM, a security audit with its findings fixed, runbooks and a launch checklist — 200+ automated tests keep it honest.
- ●Store-ready. Framed store screenshots in English and Bulgarian, sandbox accounts for app-store review that never reach the CRM, and a Dockerised release pipeline.
Is this for you?
Built for Zeus. Fits any business with a schedule and regulars.
Nothing in this product is specific to haircuts. Replace “barber” with “stylist”, “dentist”, “trainer” or “mechanic” and the same app — bookings from live availability, a favourite specialist, loyalty on the home screen, changes pushed to the phone — works unchanged. The middleware speaks to your booking system instead of Zeus’s.
What you need to bring
- ●Your brand. Logo, colours, tone of voice. The app is built on your design tokens, not on a framework’s defaults — it looks like your business, not like every other booking app.
- ●The booking system you already use. Or none: the middleware can own the schedule itself. Your staff keep their tools; the app talks to them through the middleware.
- ●One person who knows how the desk works. Cancellation rules, deposits, who may pick “any specialist” — the decisions that make the app feel like your place.
- ●Nothing else. Design, both app stores, the backend, monitoring and the launch are part of the delivery.
Zeus is a two-salon business in Varna, not an enterprise. The budget and the timeline were sized accordingly — and the result is a native app on both stores that its clients use every day.
Availability
The new app is rolling out to Zeus Barbershop clients on the App Store and Google Play as an update to the existing app; the middleware has been live in production since 23 September 2026. Read the full story on the Zeus Barbershop case-study page.