karawaci.kode

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:

SetupP50P95P99
GrowthBook SDK (cached)0.04ms0.08ms0.12ms
GrowthBook SDK (cache miss → API)8ms12ms24ms
LaunchDarkly SDK (cached, di trial 7 hari)0.03ms0.06ms0.09ms
LaunchDarkly SDK (cache miss → API)2ms4ms8ms

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 events collection: 30 hari retention
    db.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

  1. Tim > 20 engineer: collaboration features LaunchDarkly (approval workflow, RBAC granular) matter.
  2. Compliance SOC2/ISO27001: built-in audit trail, SAML SSO, data residency options.
  3. A/B testing serius: statistical engine LaunchDarkly lebih matang (Bayesian + Frequentist, auto early-stop).
  4. Edge eval mandatory: LaunchDarkly punya edge POP global, GrowthBook self-host butuh setup CDN sendiri.

Kapan GrowthBook self-host menang

  1. Budget-constrained SMB Indonesia: cost difference Rp 6 juta/bulan signifikan.
  2. Data residency concern: data flag dan eksperimen tetap di server Anda.
  3. 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