Vaka çalışması
Asansoft
Türkiye'deki asansör bakım firmaları için B2B SaaS — iOS, Android, web; tek bir Postgres + Supabase yığını üzerinde. Tek başıma kurdum; 2026 lansmanı öncesi erken test aşamasında.
- 2025 — Bugün
- iOS · Android · Web
- Türkiye · Marmara bölgesi
- Kurucu · Tek mühendis
Bağlam
Asansoft, Türkiye'deki asansör bakım firmaları için bir B2B SaaS. Üç istemci — iOS, Android, web — tek bir backend ile konuşuyor. 2025 boyunca Marmara bölgesinde saha testleri yaptım, 2026'daki kamuya açılış öncesi. Henüz ödeyen müşteri yok: sistem kurulu ve çalışıyor, satışa sunmadan önce gerçek sahada sağlama alıyorum.
Hepsini tek başıma kurdum: ürün, tasarım, üç platform, backend, yayına alma. Teknik ortak yok, yatırım yok. 2025 sonunda kendi şahıs şirketimi açtım — lansmandan sonra müşterilere düzgün fatura kesebilmek için.
Ürün üç somut ihtiyacı çözüyor: (1) bakım teknisyeni kapsamasız bir bodrumda kayıt tutuyor; (2) firma sahibi bugün neyin servis edildiğini kimseyi aramadan masasından görüyor; (3) sistem TS EN 13015 uyumlu imzalı-fotoğraflı PDF raporları yasal arşiv için otomatik üretiyor.
Problem
Şöyle bir sahne düşünün: bakım teknisyeni Bursa'da 1990'lardan kalma bir apartmanın bodrumunda. 4G yok. Sabahtan beri dört asansörü servis etmiş. Her biri için kâğıt form doldurması, bina yöneticisine imzalatması ve bütün bunları Cuma maaş gününden önce ofis sistemine girmesi gerekiyor.
Yazılımdan önce sektörün gerçeği:
- Form kâğıt üzerinde. Teknisyenin arabasında üç-nüshalı blok var.
- Faturalar bir hafta geç çıkıyor çünkü ofisin teknisyeni kovalayıp ne yaptığını öğrenmesi lazım.
- Firma sahibi bugün ne yapıldığını bilmiyor — teknisyene telefon ediyor.
- Yasal regülasyon (TS EN 13015) her bakımın imzalı + fotoğraflı kayıt taşımasını şart koşuyor. Kâğıt formlar bu şartı zar zor karşılıyor; denetime hazır bir kayıt çıkarmak tam bir eziyet.
- Müşteri itirazları ("geçen ay bizim binaya hiç gelmediniz") ya eldeki kâğıtlara ya da hafızaya dayanarak çözülüyor. İki yöntem de güven kaybettiriyor.
Firmalara anlattığım şey şu: kâğıt taşımayı bırakın. Teknisyeniniz formu telefonda doldurur — offline çalışır, sinyal gelince kendiliğinden senkronize olur. Ofisten her şeyi görürsünüz. Arşiv için PDF otomatik oluşur.
Kısıtlar
- Offline-first zorunlu. Bodrumda kapsama yok varsayılan, edge case değil.
- KVKK uyumluluğu. Kişisel veri Türkiye/EU bridge bölgelerinde kalmalı.
- Müşteri bütçesi düşük. KOBİ asansör firmaları enterprise SaaS fiyatı ödeyemez. Abonelik firma başına ~₺1.000/ay altında olmalı.
- Üç platform aynı anda. iPhone kullanan teknisyenler için iOS, geri kalan için Android, operatör için web. Birini atlarsan ürünü kimse benimsemez.
- Tek kişilik ekip. Kodu ben yazıyorum, ben deploy ediyorum, destek aramasını da ben alıyorum. Bakımı iki katına çıkaran her şeyi en baştan eliyorum.
- Saha UX'i görsel cilalardan daha önemli. Eldiven, bodrum aydınlatması, hızlı veri girişi. Form ürünün kendisi.
Yaklaşım
Her şeyi şekillendiren dört karar:
Backend — row-level security ile tek PostgreSQL
Tek bir PostgreSQL örneği üç istemciye servis veriyor. Multi-tenancy, organization_id'ye bağlı Postgres RLS politikalarıyla sağlanıyor — her sorgu bunu JWT üzerinden örtük olarak taşıyor. Mikroservisi hiç düşünmedim bile: operasyonel ek yük, abonelik bütçesini tek başına katlardı; üstelik dağıtık bir sistemi tek başıma sağlıklı tutamam.
Arka plan işleri için Redis üzerinde BullMQ ekledim — sync conflict resolution, PDF üretimi, zamanlanmış rapor gönderimleri. Queue, API ile aynı süreçte çalışıyor; gösterişli değil ama tüm sistemi tek bir trace'ten izleyebiliyorum.
Mobil — React Native + Expo
Native iOS ve native Android'i paralel yazmak hiç gerçekçi değildi. React Native + Expo bana yaklaşık %85 kod paylaşımı sağlıyor. Kalan %15 native modüller — fiş yazdırmak için Bluetooth yazıcılar, bir tanılama akışı için ivmeölçer erişimi, fotoğraf sıkıştırma worker. Ödün: bazı etkileşimler tam native'den bir kare daha yavaş hissediliyor; işin teknik tarafını bilen alıcı fark etmiyor, teknisyen zaten umursamıyor.
Offline-first — WatermelonDB
Önce SQLite + kendi yazacağım senkronizasyonu düşündüm. Senkronu elle yazmanın doğruluk maliyeti, ödemeye razı olduğumdan yüksekti; özellikle "ya teknisyenin telefonu bakım ortasında yeniden başlarsa" gibi durumlar için. WatermelonDB bana, bağlantı geldiğinde değişiklikleri toplu olarak senkronlayan; observable ve indexli bir yerel veri deposu veriyor. Ödün: schema migration en sevmediğim kısım. Altı ay sonra hâlâ sürtünme noktası.
Auth + hosting — Supabase + Vercel
2025'te bir B2B faturalama sisteminin üstüne bir de kendi auth'unu yazmak kendi ayağına kurşun sıkmaktır. Supabase bana e-posta/şifre, magic link ve RLS uyumlu JWT'leri hazır olarak veriyor. Bölge: EU, bu da bana Türkiye için kabul edilebilir bir veri yerleşimi (data residency) gerekçesi sağlıyor. Web operatör paneli Vercel'de; tüm yığın pilot ölçeğinde ayda $30 bütçesinin altında rahat çalışıyor.
Kod: sync conflict resolution
İki teknisyenin yanlışlıkla birbirinin kaydının üzerine yazmasını engelleyen kalıp:
type Record = { id: string; updatedAt: number; revision: number; payload: Json };
async function resolveConflict(local: Record, remote: Record) {
if (local.revision === remote.revision) {
// Çatışma yok — aynı base. Üzerine local uygula.
return { winner: "local", diff: null };
}
if (local.updatedAt > remote.updatedAt) {
// Local daha yeni; client tutuyor, server merge için diff alıyor.
return { winner: "local", diff: computeDiff(remote.payload, local.payload) };
}
// Remote kazanıyor; client bekleyen değişikliğini üzerine rebase etmeli.
return { winner: "remote", diff: computeDiff(local.payload, remote.payload) };
}Şu anki build, revision counter'lı bir last-write-wins üzerine kurulu. Üzerinde çalıştığım v2 merge'i operatör paneline taşıyor — firma sahibi küçük bir "iki teknisyen düzenledi" rozeti ve tek tıkla rebase görüyor.
Trade-off'lar (yapmadığım şeyler)
Mikroservis yapmadım. Tek bir Postgres + Vercel function havuzu tüm ürüne servis veriyor. Bu ölçekte dağıtık sistem karmaşıklığının bedeli, özelliklerle değil operasyonla ödenir.
Native iOS / Android yazmadım. React Native kodun %85'ini, native modüller geri kalanını taşıyor. Tam-native bir uygulamanın kapatacağı %15'lik UX farkı, alıcının gözüne görünmüyor.
Custom design system kurmadım. Tailwind + küçük bir konvansiyon katmanı. Admin panelin tamamını iki hafta sonu içinde bunun sayesinde yayınladım. Bedeli şu: işin teknik tarafını bilen biri uygulamaya bakınca "shadcn tarzı" olduğunu hemen fark ediyor.
Real-time WebSocket eklemedim. Bakım kayıtları real-time değil. Operatörler ekranı birkaç dakikada bir defadan daha sık yenilemiyor. 30s aralıklı polling yeterli; bir Realtime kanal tasarımına kıyasla geliştirmesi ve bakımı çok daha az iş.
Dış yatırım almadım. Kendi zamanım ve freelance gelirimle geliştiriyorum — tepemde geri sayan bir runway yok. Verdiğim ödün: fonlu bir ekipten yavaşım. Karşılığında kazandığım şu: ürün, bir yatırım takvimine değil, gerçekten işe yarayıp yaramadığına göre ilerliyor.
Şu ana kadar işleyen
- Saha form doldurma süresi kendi saha testlerimde ~12 dakikadan (kağıt) ~3 dakikaya (mobil) düştü.
- TS EN 13015 arşivi için PDF raporlar operatör panelinde 2 saniyenin altında imzalı + fotoğraflı olarak üretiliyor.
- Üç platform tek kod tabanından kuruldu — iOS, Android, web.
- Operasyonel ayak izi lansman öncesi mevcut ölçekte ayda $30'un altında (Vercel + Supabase + Redis).
- Offline sync sahada tutuyor — gerçek bodrumlarda, sinyalsiz, gerçek cihazlarla çalıştırdım; temiz şekilde toparlıyor.
Müşteri tarafındaki somut veriler (firma sayısı, aylık hacim, çökme oranı, uptime), ölçülecek gerçek müşteriler olunca — yani 2026 lansmanından sonra — gelecek. Var olmadan önce sayı yayımlamayacağım.
Şimdi ve öğrendiklerim
Şu an üzerinde çalıştığım yukarıda bahsettiğim v2 sync UX — last-write-wins'ten merge UI'lı optimistic concurrency'e geçiş. Zor olan algoritma değil; bu merge'i, teknik olmayan bir firma sahibinin üç saniyede çözebileceği biçimde operatör panelinde göstermek.
Üç ders kalıcı oldu:
- Müşterinin dilini konuş. "Bakım kaydı", "inspection record" değil. Sahanın dili, ürünün de dilidir; arayüzde müşterinin kendi kelimelerini kullanmak, hiçbir landing page'in sağlayamayacağı kadar güven kazandırıyor.
- Solo founder ürünü küçük tutmalı. Her özellik 2x maliyet — inşa et, sonra bakımını yap. En gurur duyduğum özellikler, roadmap'ten çıkarıp atmaya karar verdiklerim.
- KVKK bir yük değil, avantaj. "Veriniz Türkiye'de kalıyor", bu segmentte herhangi bir özellik karşılaştırmasından daha güçlü bir güven sinyali.
Benzer bir şey kuruyorsanız — offline-first mobil, multi-tenant Postgres, Türkiye'de B2B SaaS — bana yazın: hello@metehanugus.com.
Benzer bir iş mi yaptırmak istiyorsunuz? İletişime geçin