Güzellik & Wellness · B2B SaaS

Güzellik Salonu Zincirleri için Yönetim Platformu

Randevudan satışa, personelden müşteri takibine kadar bir salon zincirinin günlük operasyonunu tek bir platforma taşıyan B2B SaaS.

Rol
Frontend Developer (tek)
Stack
Next.js · TypeScript · MobX · Tailwind CSS
Salon CRM dashboardSalon yönetim dashboard'u: sidebar, üst bar, istatistik kartları, haftalık randevu takvimiRandevularMüşterilerPersonelSatışStokRaporlarYöneticiMerkez ŞubeBu hafta25 Kasım - 1 Aralık 2024Ara…+ YeniBu hafta randevu128+12%Bu ay gelir₺48.2k+8%Doluluk oranı%94−2%Pzt25Sal26Çar27Per28Cum29Cmt30Paz109:0010:0011:0012:0013:0014:00Kesim30dkBoyama90dkBakım60dkManikür45dkKeratin120dkKesim30dkPedikür45dkMasaj60dk

Bir sektörün dijital boşluğu

Güzellik salonları yıllardır büyük ölçüde Excel, kağıt randevu defteri ve birbirine bağlanmayan ayrı yazılımlarla yönetiliyor. Tek bir salon için bu işe yarayabilir; ama Türkiye'nin en büyük zincirlerinden birinin onlarca şubesini yönetmesi söz konusu olunca, bu yaklaşım kısa sürede tıkanıyor.

Müşterimiz tam da bu sorunu yaşıyordu: birden fazla şubede randevular ayrı sistemlerde tutuluyor, müşteri geçmişi şubeler arası taşınmıyor, personel vardiyaları ayrı, satış ve stok raporları manuel toplanıyordu. Bu dağınıklığı tek bir platformda toplayacak bir ürün geliştirildi - biz de projeye, ürünün canlıya çıkmasına yakın bir dönemde dahil olduk.

“Devraldığımız bir code base'i bitirmek değil, sahiplenip launch'a hazırlamak.”

Yaklaşımımız

Projeye, geliştirmesi aylardır devam eden bir frontend'i devralarak girdik. İlk hafta sadece koda baktık: hangi modül nerede, hangi karar neden alınmış, hangi yerler temizliğe muhtaç. Plan yapmadan kod yazmak özellikle bu büyüklükte bir projede çok hızlı yanlış yerlere savrulmamıza yol açabilirdi.

İki paralel iş çıkardık: yeni özellik geliştirmek ve mevcut kodu sürdürülebilir hale getirmek. Bunları sırayla değil, iç içe yürüttük - yeni modüle başlamadan önce o modülün dosyalarını temizledik, sonra üzerine inşa ettik.

Teknik Kararlar

1

4500+ satırlık modül dosyalarını parçalamak

Devraldığımız code base, modül başına tek büyük dosya prensibiyle yazılmıştı. Bir randevu modülünün UI'ı, business logic'i, API çağrıları ve state yönetimi 4500 satırı geçen tek bir dosyada toplanıyordu. Önceki developer component-based yaklaşımın "her zaman doğru olmadığı" görüşündeydi; ama bu büyüklükte tek dev olarak ilerlemek için bu yapı sürdürülebilir değildi. Her modülü üç katmana ayırdık: yeniden kullanılabilir component'ler, custom hooks içinde toplanan logic, ve MobX store'lar. Bu sayede randevu modülündeki tarih seçici, müşteri kartı, durum etiketi gibi parçalar; satış, personel ve CRM modüllerinde aynen tekrar kullanılabilir hale geldi.

2

MobX üzerinden API entegrasyonu

Projenin başında alınan kararlardan biri MobX'in state management olarak seçilmesiydi - biz devraldığımızda bu yapı oturmuştu. API çağrılarını da bu yapıyla uyumlu olarak doğrudan store'lar üzerinden yönettik. Backend lead ile sürekli iletişimde kalarak gerekli endpoint'leri ve method'ları beraber tasarladık; frontend tarafındaki bağlantı katmanını biz kurduk.

3

Karma form mimarisi

Salon yönetiminin formları birbirinden çok farklı: randevu oluşturma karmaşık (zaman çakışması, personel müsaitliği, paket seçimi), müşteri kaydı orta seviye, hızlı bir not eklemek çok basit. Hepsini tek bir kütüphaneye sıkıştırmak yerine ihtiyaca göre ayırdık: karmaşık formlar için React Hook Form'un validation ve performans avantajından faydalandık; basit formlarda MobX/useState ile manuel tuttuğumuzda hem kod daha okunaklı oldu hem de gereksiz bir bağımlılık eklemekten kaçındık.

4

Çok seviyeli yetki yönetimi

Bir salon zincirinde kullanıcı rolleri katmanlı: merkez yöneticisi, şube müdürü, kasiyer, terapist, resepsiyonist gibi roller var. Her birinin görebileceği sayfa, dokunabileceği müşteri verisi ve yapabileceği işlem farklı. Bunu hem route hem component seviyesinde kurduk: bir rolün hiç giremediği sayfa route guard'da takılırken, girebildiği ama yetkisi sınırlı olduğu sayfalarda butonlar/alanlar component bazlı gizleniyor. İkili koruma sayesinde "yanlış kişi yanlış yere giremez" garantisi tek bir noktaya bağımlı kalmadı.

Arayüzden

Müşteri profiliMüşteri profil özeti: avatar, durum rozeti, ziyaret ve harcama metrikleriMüşteri DetayıMüşteri ProfiliVIP MüşteriAktif ÜyeToplam Ziyaret18Toplam Harcama₺12.450Son Ziyaret3 gün önceSon hizmetSaç Boyama + Kesim26 Kas 2024 · 14:30₺850
Müşteri profilinde tek ekranda ziyaret geçmişi, sadakat metrikleri ve son hizmetler.
Personel vardiya çizelgesiHaftalık personel vardiya çizelgesi: 4 personel × 7 gün gridPersonelHaftalık Vardiya25 Kas - 1 AraTüm ŞubelerMerkezKadıköyPersonelPztSalÇarPerCumCmtPazKuaförStilist · 19-189-18İzin12-2112-219-18İzinEstetisyenStilist · 210-1910-1910-19İzin10-1910-19YarımManiküristStilist · 3İzin11-2011-2011-2011-2011-2010-16ResepsiyonPersonel · 48-178-178-178-178-17İzinİzin
Haftalık vardiya çizelgesi: 4 personel × 7 gün grid, çoklu şube filtresi ile.
Satış ve paket ekranıSolda hizmet/paket kataloğu, sağda sepet ve toplam tutarSatışYeni SatışTümüSaçCiltElSaç Kesim₺300Saç Boyama₺850Cilt Bakımı₺600Manikür₺250VIP Paket · 3 seans₺1.950−15%Sepet2Saç Boyama1×₺850Manikür1×₺250Ara toplam₺1.100VIP indirim−₺110Toplam₺990Ödeme Al
Hizmet kataloğundan seçim, anlık sepet, VIP indirim ve hızlı ödeme akışı.

Sonuç & Etki

Çalışmamız tamamlandığında ürün canlıya çıkmaya hazır haldeydi. Deployment sürecini backend lead devraldı; ürün ilk müşterisi olarak Türkiye'nin en büyük güzellik salonu zincirlerinden birinde kullanılmaya başlandı.

Devraldığımız frontend, projenin sonunda yeni özelliklerin günler içinde eklenebildiği, ortak component'lerin modüller arası paylaşıldığı ve performans olarak kullanıcı deneyimini bozmayan bir yapıya kavuştu.

Benzer bir projeniz mi var?

Karmaşık bir B2B uygulaması geliştirmek veya mevcut bir code base'i toparlamak için yardıma ihtiyacınız varsa konuşalım.

Teklif Alın