Revio
Tezgâhtaki bir dokunuştan müşteri geri bildirimi — uygulama yok, kayıt yok.

- Rolüm
- Tek geliştirici — mimari, API, arka plan görevleri, panel ve dağıtım.
- Durum
- Canlı
Problem
Bir kafe ya da kuaför, ziyaretin kötü geçtiğini tek yıldızlı yorum çoktan yayımlandığında öğreniyor. Tezgâhta sormak da pek işe yaramıyor: dürüst cevap, insanların yüzünüze söylemeyeceği cevaptır. Diğer her yol — işletmeyi bul, giriş yap, bir şeyler yaz — ilk dokunuştan önce neredeyse herkesi kaybediyor.
Ne yaptım
Çok kiracılı bir SaaS. Her işletme tezgâhı ve masaları için NFC kartlar alıyor; müşteri telefonunu kartlardan birine yaklaştırıyor, ziyareti birkaç saniyede puanlıyor ve isterse not bırakıyor — hiçbir şey kurmadan, hesap açmadan. Dokunuşun arkasında temiz mimariyle yazılmış bir .NET 8 API var: MediatR üzerinden CQRS, MySQL üzerinde EF Core, sıcak yolda Redis ve gece boyunca Google Business Profile yorumlarını çeken Hangfire. Üstünde ise puanların, notların ve Google yorumlarının masaya, kasaya ve personele göre ayrılarak buluştuğu bir React paneli.
Nasıl görünüyor

Üç adım, sıfır kurulum — ürünün tamamı tek ekranda. 
Google yorumları da aynı panele düşüyor — yalnızca okuma, ve Google'ın kendi ayarlarından geri alınabilir.
Mimari
Fiziksel katman
Her kart, kendi işletmesini ve konumunu taşıyan bir URL kodluyor; böylece bir puan, hangi masadan geldiğini zaten bilerek geliyor.
- NFC tags
- QR fallback
Okutma uç noktası
Sıcak yol. Kart ve işletme önbellekten okunuyor, okutma kayıt altına alınması akışı bekletmeden yapılıyor ve müşteri yönlendiriliyor — sistemde hiç kimse için yavaş olmasına izin verilmeyen tek istek bu.
- ASP.NET Core
- Redis
API
Domain, Application, Infrastructure ve Api ayrı projeler; bağımlılıklar yalnızca içeri bakıyor. Domain projesi hiçbir pakete referans vermiyor.
- .NET 8
- MediatR (CQRS)
- FluentValidation
- EF Core 8
Arka plan görevleri
Gece yorum senkronizasyonu; her işletme için ayrı bir iş olarak kuyruğa alınıyor ki tek bir hatalı hesap diğerlerini bloklamasın, ve Google'ın kendi yorum kimliği üzerinden idempotent çalışıyor.
- Hangfire
- Google Business Profile API
Panel
Puan dağılımı, yoğun saatler ve tekrar eden şikâyetler; işletmenin kendi geri bildirimlerinin yanında Google yorumlarıyla birlikte.
- React
- Vite
- TanStack Query
- Recharts
Kararlar ve ödünleşmeler
Yıldız filtresi bir sıralama, kapı değil
Yalnızca memnun müşteriyi Google'a yönlendirmenin adı review gating ve Google'ın kendi politikası seçici biçimde olumlu yorum istemeyi yasaklıyor — yakalanan bir işletme yorumlarını tümden kaybedebiliyor. Bu yüzden puan, hangi kapıların var olduğuna değil hangi ekranın önce geleceğine karar veriyor: bir yıldız veren müşteri de Google seçeneğini görüyor, sadece ondan önce "doğrudan işletmeye anlat" formunu görüyor. Kötü yorumu azaltmanın meşru yolu, ziyareti müşteri hâlâ oradayken düzeltmek.
Tek platform Google hesabı, yönetici olarak eklenmiş
İlk tasarım her işletmeden kendi yetkisini panele yapıştırmasını istiyordu. Google'ın erişim jetonları bir saatte doluyor, dolayısıyla gece senkronizasyonu ertesi sabaha kırılıyordu; bunun yerine refresh token kullanmak işletme başına bir istemci kimliği ve sırrı gerektiriyor, ki bunu bir kuaförden üretmesini isteyemezsiniz. Artık işletme sahibi, platformun destek adresini kendi profiline yönetici olarak ekliyor — jeton yok, parola yok, Google ayarlarından tek tıkla geri alınabiliyor.
Kiracı izolasyonu bir query filter, WHERE değil
Kiracıya bağlı her varlık global bir query filter taşıyor ve bir konumun isteği yapan kiracıya ait olup olmadığı kontrolü panelde değil sunucuda çalışıyor. Uygulama kodunda filtrelemek, bir kafeye başka bir kafenin yorumlarını göstermekten yalnızca bir unutulmuş koşul uzaktır; seçeneği arayüzde gizlemek ise sadece arayüzü kullananları durdurur.
Önce hesapla, sonra modele sor
Yorum içgörüleri, aritmetiğin yettiği her yerde deterministik olarak hesaplanıyor; yalnızca dil gerektiren kısımlar bir modele gidiyor — önce Gemini, Gemini başarısız olduğunda yedek olarak Claude, günlük bir tavanla ve anahtar tanımlı değilse sessizce devre dışı kalarak. Para harcayan ve halüsinasyon görebilen bir özet, akışın kendisi değil istisnası olmalı.
Sonuç
Memnun kalmamış müşteri, Google'a ulaşmadan önce işletmeciye ulaşıyor — hem de daha dükkândayken ve birinin bir şey yapabileceği bir zamanda.
Ölçülen
- Otomatik test
- 878 across 111 files
- Domain katmanının paket bağımlılığı
- 0