Salonyar — Terminbuchung für Friseursalons, ohne App

Ein mandantenfähiges Buchungssystem für Friseursalons: Jeder Salon bekommt einen Buchungslink, der in jedem Browser öffnet, dazu eine Bale-Mini-App, ein Salon-Panel und eine Plattform-Konsole.

Ergebnis

Pilotreif nach 12 Phasen: Unit- und E2E-Tests, ein im Build erzwungenes Performance-Budget (rund 88 KB JavaScript gzip beim ersten Laden) und die Hauptabfragen an rund 4,4 Mio. Terminen gemessen.

Das Problem

Friseursalons nehmen Termine per Telefon oder Instagram-Direktnachricht an — mit Doppelbuchungen, vergessenen Terminen und leeren Stühlen als Folge. Fertige Buchungstools setzen zwei Dinge voraus, die im Iran nicht gelten: dass jemand für einen Haarschnitt eine App installiert und sich registriert, und dass ausländische SMS- und Push-Dienste das Telefon erreichen. Eine Buchung muss also mit einem Link beginnen, in unter einer Minute fertig sein und auf Bale und inländischer SMS aufbauen.

Ein NestJS-Backend auf PostgreSQL und Prisma, eine BullMQ-Queue auf Redis und ein React-Frontend, das zugleich Webseite und Bale-Mini-App ist.

Ein Link pro Salon. salonyar.ir/<slug> rendert den Salon — Name, Adresse, Öffnungszeiten, Leistungen und Preise — auf dem Server (nginx SSI mit 30-Sekunden-Cache), sodass ein auf WhatsApp oder Instagram geteilter Link den Salon zeigt statt einer leeren Seite.

Ein Buchungskern, zwei Eingänge. Web und Bale laufen durch denselben Ablauf: „egal bei wem" ist voreingestellt, die nächsten freien Zeiten stehen oben. Man stöbert ohne Anmeldung und bestätigt sich erst beim Buchen mit einem Einmalcode. In Bale wird die Nummer über Bales eigenen Dialog bestätigt, ohne Tippen, und Web- und Bale-Konto werden eine Identität.

Die Datenbank verweigert die Doppelbuchung, nicht der Code. Anlegen, stornieren, verschieben, bestätigen und ablehnen, mit einem Stornofenster pro Person. Zwei gleichzeitige Buchungen desselben Slots stoppt ein Exclusion-Constraint in PostgreSQL, und ein Nebenläufigkeitstest prüft genau das.

Ein Mobile-first-Panel für den Salon. Ein Kalender aller Termine, telefonische Buchungen von Hand, ein druckbarer Link mit QR-Code. Salons registrieren sich selbst, ein Assistent legt Standardleistungen, Personal und Öffnungszeiten an und übergibt am Ende Weblink, QR-Code, Bale-Link und eine Zeile für die Instagram-Bio. Tarife mit Testphase, Personal-Limit je Tarif und Umrechnung der Resttage beim Wechsel.

Gegen No-Shows: Erinnerungen in Bale mit SMS als Rückfallebene und eine Anzahlung über Bales Wallet. Benachrichtigungen gehen über BullMQ mit Outbox raus; Login-Codes kommen von Bales Safir-Dienst und Kavenegar-SMS, mit Rate-Limit. Der Produktions-Stack sichert sich täglich selbst, meldet Störungen an Bale, und die API startet mit unsicheren Einstellungen gar nicht erst.