Ücretsiz katman ve paywall gözden geçirmesi
Tarih: 2026-08-29 Bağlam: ~200 kayıtlı üye, ~300 izlenen site, 1 ödeyen müşteri, hesap başına ~1.5 monitör.Teşhis
Paywall yanlış eksende duruyor. Bugünkü tek gerçek duvar hacim (monitör sayısı), ama ajans profilinin canını yakan şey hacim değil: müşteriye gösterilen yüzey (status page, alan adı, marka), geçmiş veri (aylık rapor), ekip ve nöbet (SMS/eskalasyon). Bunların hepsi ya bedava ya da yanlış basamakta. İki sayı bunu özetliyor:- Ortalama 1.5 monitör/hesap, ücretsiz limit 10. Medyan kullanıcı limitin ~%15’ini kullanıyor — limit onun için görünmez.
- 5-10 müşterisi olan bir ajans da 10’un altında kalıyor. Yani limit onun için de görünmez. Duvar iki profilin de arasına düşmüyor.
Mevcut durum (koddan çıkarıldı, ilanla karşılaştırmalı)
| Free | Solo $5.99 | Team $19.99 | Stack $59.99 | |
|---|---|---|---|---|
| Monitör | 10 | 50 | 100 | 500 |
| Sunucu | 0 | 1 | 5 | 50 |
| Check aralığı (min) | 5 dk | 1 dk | 30 sn | 30 sn |
| Bölge | 3 | 3 | 3 | 3 |
| Status page | 3 | 5 | 10 | 20 |
| Özel alan adı | ✗ | ✗ | ✓ | ✓ |
| Görünürlük / GTM | ✗ | ✗ | ✓ | ✓ |
| Site paylaşımı | 1 | 3 | 5 | 20 |
| Takım kurma | 0 | 0 | 5 | 10 |
| SMS | ✗ | ✗ | ✓ | ✓ |
| Slack | ✗ | ✗ | ✓ | ✓ |
| Bildirim/gün | 10 | 30 | 50 | 100 |
| Veri saklama | sınırsız | sınırsız | sınırsız | sınırsız |
Önce kapatılması gereken 4 sızıntı
Bunlar fiyatlandırma kararı değil, hata. Yeni limitler koyulmadan önce kapanmalı, yoksa yeni limitler de aynı şekilde delinir.1. Check aralığı sunucuda hiç kontrol edilmiyor — 60× maliyet açığı
PLAN_MIN_LIMITS yalnızca frontend’te:
CheckRange.tsx:11-16.
Backend tarafında tek sınır Math.max(5_000, ...):
detailSite.controller.ts:334.
Elinde token olan herhangi bir ücretsiz kullanıcı PUT /site/:id/change-check-interval
ile 5 saniye yazabilir. 5 dakika yerine 5 saniye = 60× probe, üstelik 3 bölgeden.
Tek bir hesap tüm edge kapasitesini yiyebilir.
Yapılacak: aralık alt sınırını UserSource.limits’e taşı (minCheckIntervalMs)
ve changeCheckInterval içinde uygula. Site oluşturma yolunda da aynı sınır geçerli
olmalı.
2. stats koleksiyonunda TTL yok — saklama politikası fiilen “sonsuz”
Stat.model.ts hiçbir TTL indeksi tanımlamıyor.
Buna karşılık yeni monitoring hattının tamamı 3 gün: MON_RUN_TTL_DAYS = 3
(buildExpiresAt.ts:1),
Evidence de expiresAt TTL’li.
Yani ücretli planların bile satılabilir bir “geçmiş” vaadi yok, ücretsiz katmanın da
maliyeti sınırsız büyüyor. Saklama süresi hem en büyük gizli maliyet hem de
satılmayan en değerli ajans özelliği.
3. Solo’nun SMS kotası yalan söylüyor
notificationLimits.user.byType.sms = 10 (plans.ts:98)
ama sms: false (plans.ts:106). Kota var, kanal
kapalı. İkisinden biri düzeltilmeli — tercihen kota 0’a çekilmeli, SMS Team’de kalmalı.
4. “Powered by Watchman Tower” hiçbir planda kaldırılamıyor
Footer.tsx:55 koşulsuz. Ajansın müşterisine gösterdiği sayfada bizim markamız duruyor ve bunu kaldırmanın satın alınabilir bir yolu yok. Bu, ajansın en yüksek ödeme isteği olan kalemlerden biri ve şu anda ürün olarak mevcut değil.Önerilen yeni yapı
Prensip: ücretsiz katman “kendi sitesini izleyen birey” için tasarlansın, tam ve utanmadan çalışsın; üçüncü müşteride duvara çarpsın.| Free | Solo $5.99 | Team $19.99 | Stack $59.99 | |
|---|---|---|---|---|
| Monitör | 10 → 3 | 50 → 10 | 100 | 500 |
| Check aralığı | 5 dk (sunucuda zorlanır) | 1 dk | 30 sn | 30 sn |
| Veri saklama | 7 gün | 30 gün | 12 ay | 24 ay |
| Status page | 3 → 1 | 5 → 3 | 10 | 20 |
| Özel alan adı | ✗ | ✗ | ✓ | ✓ |
| Marka kaldırma | ✗ | ✗ | ✓ (yeni) | ✓ (yeni) |
| Site paylaşımı | 1 → 0 | 3 | 5 | 20 |
| Takım kurma | 0 | 0 | 5 | 10 |
| SMS / nöbet | ✗ | ✗ | ✓ | ✓ |
- 3. müşteri sitesi → monitör limiti (gün 1-3)
- İlk aylık rapor → 7 günlük geçmiş yetmiyor (gün 30, ama farkına 7. günde varır)
- Müşteriye link yollama → 1 status page, üstünde bizim markamız (gün 1)
- Ekibe devretme → paylaşım 0, takım yok (gün 5-10)
- Müşteri SLA sorunca → SMS/eskalasyon yok
Neden Solo da 10’a iniyor
Solo’nun bugünkü 50 site limiti, “bağımsız operatör” tarifiyle uyuşmuyor ve ajansı $5.99’da tutuyor. Solo 10’a inince merdiven şöyle okunur:- 1-3 site → Free
- 4-10 site (serbest çalışan, birkaç müşteri) → Solo $5.99
- 10+ site + ekip + müşteri yüzeyi → Team $19.99
3 mü 5 mi?
Kesin sayı segmentasyon sorgusundan sonra seçilmeli. Karar kuralı: mevcut ücretsiz hesapların en az %80’i yeni limitin altında kalmalı.backend-ts/scripts/analytics/account-segmentation.mongo.js çıktısındaki
1 ve 2-4 kovalarının toplam payı bunu doğrudan verir. 1.5 ortalamayla 3’ün
rahat geçmesi bekleniyor; 2-4 kovası şişkin çıkarsa 5’e çekilir.
Göç: grandfathering bedava geliyor
Mimaride şanslı bir ayrım var — limit kontrolüPlan’ı değil, kullanıcı başına
kopyalanan UserSource.limits’i okuyor
(checkUserSourceLimits.middleware.ts:62),
ve bu kopya kayıt anında User post-save hook’unda oluşuyor
(User.model.ts).
Sonuç:
plansdokümanını güncellemek yalnızca yeni kayıtları etkiler.- Mevcut 200 hesap,
usersourcesüzerindeupdateManyçalıştırılmadıkça eski limitlerinde kalır — yani grandfathering varsayılan davranış. - 26 sitelik tohum veri ve 7 aylık gözlem hiçbir şekilde risk altında değil.
firstCreatePlansyalnızcaplanCount === 0iken çalışıyor (plans.ts:13) — seed’i değiştirmek canlıyı değiştirmez. Dosyanın altındakiappAgentLimitbackfill bloğu (plans.ts:236-268) doğru deseni gösteriyor: idempotentfindOneAndUpdate+ hedefliUserSourceModel.updateMany.- Plan dokümanı güncellendikten sonra Redis plan cache’i (
plan:data:*,plan:name:*) mutlaka tazelenmeli — plan.service.ts:35. - Saklama süresi önce okuma tarafında uygulanmalı (API plan penceresinden eskisini döndürmesin), TTL indeksi sonra. Ters sırada yapılırsa tohum veri silinir ve geri gelmez.
Ölçüm
Değişiklikten önce ve 30 gün sonra aynı sorgu koşulmalı (backend-ts/scripts/analytics/account-segmentation.mongo.js). İzlenecekler:
2-4ve5-9kovalarındaki hesap sayısı — limitin gerçekten ısırıp ısırmadığı- ücretsiz katmanın aylık probe payı — maliyet tarafının düşüşü
- zombi hesap sayısı — login yok ama check koşuyor
- Free→Solo ve Solo→Team dönüşümleri — asıl aranan sinyal Solo→Team
