Sadakat programları, POS ve mağaza yönetimini tek bir platformda birleştiren işletme çözümü.
Türkiye'deki her kafe sadakat sistemini farklı çalıştırıyor. Kaşe kartları, kimsenin iki kez indirmediği uygulamalar, 2003'ten kalma damga kartları — parçalanmış ve unutuluyor. Müşteri için on kafe, on sistem, hiçbiri birbirleriyle konuşmuyor.
İşletme sahibi için daha da kötü. POS sistemi, sadakat programı, personel yönetimi, stok takibi — dört farklı aracı birbirine yapıştırıyorlar. Sabah 8'de sıra olan bir baristanın hangi uygulamanın ne yaptığını düşünmesine gerek olmamalı.
Lokal tek bir platform olarak hepsini yapıyor. Üç uygulama — biri müşteri için, biri işletme için, biri yönetim için — ortak bir çekirdek paylaşıyor. Müşteri işletme başına tek bir sadakat kartı görüyor. İşletme tam bir POS, menü yönetimi, personel rolleri ve gerçek zamanlı raporlama elde ediyor.


Modüler monolit .NET 10 backend, Flutter monorepo ile 3 uygulama (lokal-common paylaşımlı paket), PostgreSQL veritabanı ve Redis önbellek. Gerçek zamanlı SignalR hub.

Standart RBAC 'bu mağazanın siparişlerini yönetebilir' ile 'tüm mağazaları yönetebilir' arasında ayrım yapmıyor. Kapsamı doğrudan izin anahtarlarına kodladım — Store.Order.Create ile Business.Order.Read. Tek bir arama, kapsam anahtardan çıkarılıyor.
Zor kısım menüyü oluşturmak değildi — aynı espressoyu 5 farklı mağazada farklı fiyata satarken birleştirilmiş rapor oluşturmaktı. Ürünler işletme seviyesinde bir kez tanımlanıyor, her mağaza fiyatı geçersiz kılabiliyor.
Bir müşteri espressoyu 3.50'ye satın aldığında, bu fiyat siparişte sonsuza kadar dondurulur — menü yarın değişse bile. Geçmiş siparişler değişmez, raporlar müşterilerin gerçekte ne ödediğini gösterir.
Barista ile Genel Müdür farklı şeyler görür. 7 varsayılan rol, özel rol oluşturma, ve Business/Store kapsamlı izin sistemi ile her çalışan sadece ihtiyacı olana erişir.
Ürünler bir kez tanımlanır, her mağaza kendi fiyatını belirler. İşletme genelinde raporlama bozulmadan, mağaza bazlı esneklik sağlanır.
Müşteri, işletme ve yönetici uygulamaları lokal-common paylaşımlı paketiyle ortak çekirdekten beslenirken, her biri kendi kullanıcı deneyimine sahip.
İlk yetkilendirme sistemi çok katıydı — sabit roller, genişletilemez izinler. İşletmelerin kendi rollerini oluşturmasını engellemesi projeyi tıkadığı an, tüm sistemi sıfırdan yeniden tasarladım. Kapsam kodlanmış izin anahtarları, dinamik roller ve temsilci geçersiz kılmaları ile. Bu, projenin en büyük tek yeniden yazımıydı ve şu ana kadar gördüğüm en kritik tasarım kararlarından biriydi.
Mağaza geçersiz kılma katmanını doğru çalıştırmak beklenenden zordu. Her sorgu hem işletme varsayılanını hem mağaza geçersiz kılmasını hesaba katmalıydı. İlk implementasyonda NULL geçersiz kılmalar ile 'fiyat yok' durumu arasında ayrım yapmak sorun oldu. COALESCE desenini bulduktan sonra her şey yerine oturdu — ama oraya giden yol birçok yanlış başlangıç içeriyordu.
Prodüksiyon Flutter uygulaması (Müşteri, İşletme, Yönetici)
Dapper ile daha hızlı sorgu çalıştırma (~45ms vs EF Core ~80ms)
Granüler izin anahtarı, 7 varsayılan rol ile
FAB Coffee olarak App Store ve Play Store'da yayında
Projenizi konuşalım.
İletişime geç