2026-06-29 · 7 min
GrowthBook vs LaunchDarkly: Feature Flag SaaS Indonesia
Tujuh bulan lalu, SaaS akuntansi UMKM yang saya maintain mulai butuh feature flag serius. Tim 8 engineer, ~12k tenant, dan kami mulai launching fitur experimental ke 10% user (tier Pro) sebelum rollout penuh. Saya evaluate dua opsi: LaunchDarkly (industri standard, $400/bulan starter) dan GrowthBook (open source, self-host).
Pilih GrowthBook. Hari ini, share angka real dan kapan saya akan ganti ke LaunchDarkly.
Konteks pengambilan keputusan
- Tim: 8 engineer, 1 PM, 0 dedicated DevOps.
- Tenant: ~12.000 aktif, 380 di tier Pro (experiment target).
- Flag yang dibutuhkan: ~50 dalam 12 bulan ke depan (estimate).
- Eksperimen A/B: ya, ~3-4 per kuartal.
- Budget: < $200/bulan untuk tooling.
LaunchDarkly Starter: $400/mo (lihat pricing 2026 mereka, MAU-based, kami akan masuk di tier $400-700). Out of budget.
GrowthBook self-host: $0 software + cost VPS untuk run.
Setup GrowthBook self-host
Saya pakai Hetzner CX22 (€5.4/bulan, 2 vCPU, 4GB RAM, 40GB disk). GrowthBook stack:
- MongoDB 7 (untuk metadata flag dan eksperimen)
- Redis 7 (cache evaluation)
- GrowthBook backend (Node.js)
- GrowthBook frontend (Next.js, static)
Docker Compose:
services:
mongo:
image: mongo:7
volumes: [./data/mongo:/data/db]
restart: unless-stopped
redis:
image: redis:7-alpine
restart: unless-stopped
growthbook:
image: growthbook/growthbook:latest
ports: ["3100:3100"]
environment:
MONGODB_URI: mongodb://mongo:27017/growthbook
JWT_SECRET: ${JWT_SECRET}
ENCRYPTION_KEY: ${ENCRYPTION_KEY}
depends_on: [mongo, redis]
Plus nginx reverse proxy + Let’s Encrypt cert. Setup time: 3 jam termasuk DNS dan SSO setup (Google Workspace).
Total cost monthly: €5.4 + €0 (Cloudflare DNS gratis) ≈ Rp 95k.
SDK integration
Backend (Bun service):
import { GrowthBookClient } from '@growthbook/growthbook';
const gb = new GrowthBookClient({
apiHost: 'https://flags.kami.id',
clientKey: process.env.GB_CLIENT_KEY!,
enableDevMode: false,
});
await gb.init({ timeout: 1000 });
// Per-request evaluation
export function isFeatureEnabled(userId: string, tenantId: string, feature: string) {
const ctx = gb.createScopedInstance({
attributes: { id: userId, tenantId, tier: getTenantTier(tenantId) }
});
return ctx.isOn(feature);
}
createScopedInstance (GrowthBook v1.4+) penting untuk multi-tenant — tiap eval punya attribute set sendiri, bukan global state.
Latency observed
Saya benchmark 10.000 evaluation per skenario:
| Setup | P50 | P95 | P99 |
|---|---|---|---|
| GrowthBook SDK (cached) | 0.04ms | 0.08ms | 0.12ms |
| GrowthBook SDK (cache miss → API) | 8ms | 12ms | 24ms |
| LaunchDarkly SDK (cached, di trial 7 hari) | 0.03ms | 0.06ms | 0.09ms |
| LaunchDarkly SDK (cache miss → API) | 2ms | 4ms | 8ms |
LaunchDarkly punya edge POP di Singapore (~38ms dari Jakarta), GrowthBook self-host saya di Hetzner Helsinki (~290ms dari Jakarta). Cache miss penalty saya 3x lebih besar.
Workaround yang saya pakai: SDK polling interval 60 detik (default 30s), warmup cache di startup, fail-safe ke default value kalau API timeout.
Practical impact: 99.7% evaluation hit cache (SDK in-memory). Latency penalty cache miss hanya pada cold start atau setelah polling refresh. User tidak feel difference.
Hasil 7 bulan
- 47 flag aktif (kill switch, rollout %, experiment, config)
- Uptime GrowthBook server: 99.94% (1 downtime 40 menit saat MongoDB OOM)
- Eksperimen A/B: 11 dijalankan, 4 winning variant rollout, 5 losing variant dibuang, 2 inconclusive
- Cost: Rp 95k/bulan × 7 = Rp 665k
- Cost saving vs LaunchDarkly: ~$2.800 / Rp 44 juta dalam 7 bulan
Yang break
1. MongoDB OOM bulan ke-4
GrowthBook simpan event evaluation di MongoDB. Setelah 4 bulan, collection events membengkak ~8.4 GB. MongoDB instance 4GB RAM mulai swap, lalu OOM-killed.
Fix:
- TTL index di
eventscollection: 30 hari retentiondb.events.createIndex({ timestamp: 1 }, { expireAfterSeconds: 2592000 }); - Upgrade VPS ke CX32 (€10/bulan, 4GB → 8GB RAM)
- Set MongoDB
wiredTigerCacheSizeGB: 4
Downtime 40 menit (saya nyalakan ulang sambil purge old data manual). Bukan critical karena SDK punya local cache fallback.
2. Race condition di rollout %
Bug GrowthBook v3.2 (sudah di-fix di v3.4): saat rollout % berubah dari 10% ke 25%, ada window ~2 menit di mana SDK punya cache lama. User yang sudah masuk di 10% tetap dapat flag ON, plus user baru di 10-25% mulai dapat flag ON. Tidak ada de-duplication.
Symptom: total user yang lihat fitur experimental sempat overshoot ke ~28% selama 2 menit.
Fix: upgrade ke v3.4 yang punya “sticky bucketing” — user yang sudah di-bucket di rollout sebelumnya tetap di bucket itu meskipun % berubah.
3. Audit trail terbatas
GrowthBook log siapa toggle flag, tapi tidak log payload (siapa user yang affected di moment itu). Untuk compliance SOC2-ish yang klien kami mulai approach, ini gap.
Workaround: saya tulis middleware yang log tiap evaluation flag ke ClickHouse (eksternal), dengan retention 1 tahun. Extra cost: ~Rp 80k/bulan untuk ClickHouse Cloud trial.
Kapan saya rekomendasi LaunchDarkly
- Tim > 20 engineer: collaboration features LaunchDarkly (approval workflow, RBAC granular) matter.
- Compliance SOC2/ISO27001: built-in audit trail, SAML SSO, data residency options.
- A/B testing serius: statistical engine LaunchDarkly lebih matang (Bayesian + Frequentist, auto early-stop).
- Edge eval mandatory: LaunchDarkly punya edge POP global, GrowthBook self-host butuh setup CDN sendiri.
Kapan GrowthBook self-host menang
- Budget-constrained SMB Indonesia: cost difference Rp 6 juta/bulan signifikan.
- Data residency concern: data flag dan eksperimen tetap di server Anda.
- Custom integration: GrowthBook open source, bisa modify untuk integration tooling internal.
Verdict
Untuk SaaS Indonesia ukuran SMB-mid (5-15 engineer, < 50k MAU): GrowthBook self-host menang telak di cost dengan trade-off latency cache miss yang manageable.
Saya akan migrate ke LaunchDarkly kalau: (a) compliance audit memaksa, atau (b) tim tumbuh ke 20+ engineer dengan kebutuhan approval workflow. Untuk sekarang, GrowthBook di Hetzner CX32 sudah cukup.
Bukan magic bullet — saya pernah debug rollout bug yang bikin telpon dari PM jam 11 malam. Tapi untuk Rp 95k/bulan, ekspektasi memang harus realistis. Konteks pemilihan tooling SaaS terkait lihat juga catatan saya di Cloudflare D1 vs Postgres warung.
Ditulis oleh Reza Pradipta