İçeriğe geç
UA.
Tüm projeler
CanlıSaaSOca 2025 — Devam ediyor

Revio

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

Revio ana sayfası: "Müşterinizin ne düşündüğünü, masadan kalkmadan öğrenin."
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: müşteri kartı okutur, ziyareti puanlar, işletmeci panelden izler.
    Üç adım, sıfır kurulum — ürünün tamamı tek ekranda.
  • Google Business Profile bölümü; yalnızca okuma erişimini ve geri alınabilir yetkiyi anlatıyor.
    Google yorumları da aynı panele düşüyor — yalnızca okuma, ve Google'ın kendi ayarlarından geri alınabilir.

Mimari

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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