Bir SaaS’ı nasıl kurardım - kiracılık, faturalama ve onu ürün yapan şey
MVP bir form olabilir. SaaS, birçok şirketin kiraladığı bir üründür. Kiracılığı, abonelikleri, ilk girişi ve işletmeyi nasıl tasarlardım - ve ilk yıl büyük platformlardan neyi kopyalamazdım.
MVP şunu yanıtlar: bu işi biri bitirecek mi? SaaS şunu yanıtlar: hepsi için tek bir kod tabanı çalıştıralım diye birçok şirket ödemeye devam edecek mi? İkinci soru «Stripe ve giriş ekle» değildir. Kiracılık, faturalama, ilk giriş ve gece 2’de tanımadığınız birine, verilerine SSH yapmadan yardım etmenin yoludur.
Bir MVP için stack’i nasıl seçeceğimi zaten yazdım. Bu bir sonraki katman: işin şekli software-as-a-service olduğunda gerçekten ne kurardım, hangi sırayla, ve ilk ay Linear veya Salesforce’tan neyi kopyalamazdım.
1. Önce: bu gerçekten SaaS mı?
Birçok «SaaS fikri» aylık faturalı, tek müşteriye özel bir sistemdir. İyi bir iş olabilir. SaaS değildir. SaaS demek: bir ürün, çok kiracı, self-serve veya hafif satış, ve bir sonraki şirketi eklemenin maliyeti sıfıra yakın - başka bir proje değil.
- SaaS: çok kuruluş, aynı özellikler, faturalama üründe, uptime sizin sorumluluğunuz.
- Özel yazılım: bir alıcı, benzersiz iş akışları, değişiklik isteklerini faturalarsınız. İkinci müşterinin «sadece giriş yapacağını» varsaymayın.
- İlk üç müşterinin her biri bir fork istiyorsa, buna SaaS demeyi bırakın. Örtüşme netleşene kadar proje satın - sonra ürünü çıkarın.
2. Ürünün birimi workspace’tir, kullanıcı değil
Alanı bir organizasyon etrafında modellerdim (workspace, tenant, account - bir kelime seçin ve ona bağlı kalın). Kullanıcılar kuruluşlara aittir. Veriler kuruluşlara aittir. Faturalar kuruluşlara aittir. «User’ın Projects’i var» ile başlarsanız, altı ay ekip, davet ve «kim ödüyor» eklemekle geçersiniz.
- Kuruluşun bir planı, bir fatura e-postası ve bir durumu vardır: trial, active, past_due, canceled.
- Üyelik bir satırdır: user + org + role (başta owner, admin, member yeter).
- Her iş tablosunda org_id vardır. org_id’siz sorgu kısayol değil, hatadır.
- «Onlar için kullanıcı oluştur» yerine davet. E-posta, kabul, doğru workspace’e iniş.
3. Kiracılık: paylaşılan veritabanı, sıkı izolasyon
İlk SaaS için müşteri başına Postgres açmazdım. Bir veritabanı, her satırda org_id, ve unutulan bir WHERE sızıntı olmasın diye katmanlı koruma. Kiracı başına veritabanı, düzenlenmiş izolasyon veya ölçtüğünüz gürültülü komşu içindir - dördüncü kiracı için değil.
- Row-level security veya org_id’yi her zaman oturumdan ekleyen bir sorgu yardımcısı - istemci body’sinden değil.
- Tahmin edilemeyen kimlikler (UUID). Sıralı /org/12/invoices/4 bir davettir.
- org_id önekli dosya deposu, imzalı URL, asla «tüm yüklemeler» diye herkese açık bir bucket.
- Kiracı başına şema veya veritabanı yalnızca sözleşme, uyum listesi veya gerçek bir gürültülü komşu zorlarsa. 200 şema üzerinde göç, istemediğiniz bir üründür.
4. Faturalama bir özelliktir, sonraya bırakılan bir eklenti değil
Kimse ödeyemiyorsa SaaS’ınız yoktur. Uygulamanın gerisi ince olsa bile Checkout’u ikinci hafta kritik yola koyardım. «Elle fatura keseriz» evresi ilk beş tasarım ortağı için olur - sonra kart çalışmalıdır.
- Stripe Billing (veya ilk pazarınızın gerçekten kullandığı işlemci): products, prices, customer portal, webhooks. Kart numarası saklamayın. Tahsilat motoru yazmayın.
- Yedi değil, bir veya iki plan. Net bitişli bir deneme. Deneme sonrası: salt okunur veya sert blok - birini seçin ve arayüzde söyleyin.
- Müşterinin anladığı bir şeye fiyat: koltuk, proje veya aylık hacim. Kullanıma göre faturalama güçlüdür ve kolay kaçırılır; «kullanım»ın ne olduğunu bilene kadar koltuk veya sabit planla başlayın.
- Webhook’lar «ödediler mi?» için tek kaynaktır. Veritabanınız Stripe’ı (veya Paddle’ı) yansıtır. Tahmin eden cron, ödeyen müşteriyi kilitlemenin yoludur.
5. Kullanacağım stack (ve bir site MVP’sinden farkı)
Web varsayılanı duruyor: Next.js, TypeScript, Tailwind, Postgres. SaaS, bir pazarlama sitesinin ihtiyaç duymadığı birkaç parça ekler - ve hâlâ bir servis ağına ihtiyaç duymaz.
- Kuruluşları anlayan auth: Clerk, WorkOS, Auth.js artı üyelik tablosu - küresel bir «giriş yapılmış» bayrak değil.
- Yavaş veya yeniden denenebilir bir şey varsa birinci günden arka plan işi: e-posta, Stripe webhook, dışa aktarma, LLM çağrıları. Basit bir kuyruk (Inngest, Trigger.dev veya VPS’te bir worker) serverless fonksiyondaki setTimeout’tan iyidir.
- İlk dakikadan işlem e-postası: davet, makbuz, «denemeniz cuma bitiyor». O mail gelmezse ürün ölü durur.
- Planlar için feature flag (can_export, seat_limit), elli dosyaya dağılmış if (org.plan === "pro") değil.
- Hosting: bir worker veya veri yerleşimi aksini söyleyene kadar Vercel artı hosted Postgres yeter. Bir bölge yeter. Çok bölge sonraki sorundur.
6. İlk giriş, ilk saatin ürünüdür
Boş SaaS panelleri dönüşmez. İlk oturumu bir tur değil, bir iş olarak tasarlardım: workspace oluştur, ilk gerçek kaydı içe aktar veya yaz, bir ekip arkadaşını davet et, bir sonuç gör. Boş tablonun üstündeki ipucu ilk giriş değildir.
- Örnek workspace, açıkça sahteyse ve «benim verilerimle başla»ya bir tık uzaktaysa olur.
- Aktivasyon ölçütü: «kayıt oldular» değil, asıl işi bir kez bitirdiler. Onu izleyin. Onu satın.
- Ayarlar çirkin olabilir. Ana ekranın boş hali olamaz.
7. İşletme: hiç tanımadığınız insanlara nasıl destek verirsiniz
Ödeyen bir kuruluş «faturalarımı göremiyorum» yazdığı gün, production SSH olmayan bir yol gerekir. Onuncu müşteriden önce ince bir iç admin eklerdim - ilk olaydan sonra değil.
- Admin: kuruluşu bul, planı ve son webhook’u gör, salt okunur taklit et, daveti yeniden gönder. Taklidi kayda alın.
- org_id ve request id’li log. Kiracısız «bozuldu» bir log satırı değil, omuz silkmedir.
- Bir kez geri yüklediğiniz yedek. Başta gecelik yeter; test edilmemiş yedek kendinize anlattığınız bir hikâyedir.
- Durum sayfası bekleyebilir. «Çöktük, bildiğimiz bu» e-postası bekleyemez.
8. İlk yıl kurmayacağım şeyler
Büyük SaaS, kendini sonra ödeyen özelliklerin müzesidir. Müzeyi kopyalamak o tek işi kaçırmaktır.
- SSO, SCIM ve 40 sayfalık güvenlik anketi, gerçek bir anlaşma onlara takılana kadar yok. O zaman sprint olurlar, yan görev değil.
- Herkese açık API ve entegrasyon vitrini. Bir Zapier veya CSV dışa aktarma çoğu zaman aynı alıcıyı açar.
- Kiracı başına özel alan adı, white-label ve tema stüdyosu. Erken B2B’nin çoğu için logo yüklemek yeter.
- Her yerde yapay zekâ. Dilin iş olduğu tek bir yer (arama, taslak, çıkarım), şema ve faturalanabilir sayaç ile. Her ekranda sohbet balonu değil.
9. Gerçekten izleyeceğim bir sıra
MVP’deki aynı takvim dürüstlüğü, SaaS şekilli kilometre taşlarıyla. Bir haftada kiracı, ödeme veya iş yoksa, o bir SaaS haftası değildir.
- Hafta 0: işi, alıcıyı, planı, kesme sayısını adlandırın (örn. 90 günde beş ödeyen kuruluş yoksa dururuz). Yapılmayacaklar bir sayfada.
- Hafta 1-2: kuruluş + üyelik + production’da bir mutlu yol + Stripe test mode. İzolasyon testleri: user A, user B’yi görmemeli.
- Hafta 3-4: canlı faturalama, davet, e-posta, boş durum ilk girişi, ince admin. «İnternete» değil, adı olan şirketlerin önüne koyun.
- Gün 30-90: aktivasyona ve kayıp nedenlerine bakın. Ödedikleri tek entegrasyonu veya raporu ekleyin. İkinci ürün eklemeyin.
Sonuç: bir platform değil, bir iş kiralayın
SaaS’ı bir MVP kadar süssüz kurardım, artı birçok şirketin tek sistemi paylaşmasını sağlayan parçalar: bir workspace, bir fatura, kiracılar arasında bir duvar, boş olmayan bir ilk saat, ve desteğin root shell olmaması için bir admin. Stack sıkıcı kalabilir. Ürün kalamaz.
Birkaç şirketin tekrarlaması için size zaten ödediği bir iş akışınız varsa ve bunu özel kurulum yığını yerine ürün istiyorsanız - iletişim bölümünden yazın. Kiracı modelini, ilk planı ve Salesforce taklidi yapmadan kart alan bir dilimi adlandırabiliriz.
Sadece okumak değil, kurmak mı lazım?
Web app geliştirme: Next.js, React, PostgreSQL. Doğrudan yüklenici.
Projenizi konuşalım mı?
React ve Next.js konusunda uzman kıdemli bir web geliştiriciyim - dünya çapında freelance projelere açığım.
E-posta
i.vynnychenko@gmail.comKonum
Kyiv, Ukrayna
Upwork
Profili görüntüleTelegram
Bana yazınViber
Bana yazın