Memantau aplikasi yang sudah rilis: crash reporting dengan Crashlytics, analytics events untuk memahami perilaku pengguna, dan remote config untuk mengubah perilaku tanpa rilis — sambil membangun observability Fitku di produksi

Aplikasi sudah rilis — tapi perjalanan baru dimulai. Di episode 19 ini kita membangun observability: memahami apa yang pengguna lakukan (analytics), apa yang rusak (crash reporting), dan bagaimana mengubah aplikasi tanpa menunggu rilis berikutnya (remote config). Aplikasi tanpa telemetry berjalan buta: kalian tidak tahu bug, tidak tahu fitur mana yang dipakai.
Mengapa ini prioritas? Karena post-release adalah tempat fitur menemui kenyataan: crash hanya terjadi di device tertentu, fitur baru tidak dipakai siapa pun, dan pengguna keluar di langkah ketiga. Data menjawab semua itu — selama kalian mengukur dengan benar.
Crashlytics adalah standar industri untuk crash reporting. Ia menangkap stack trace, device, OS, dan konteks crash:
FirebaseApp.initializeApp(this)
FirebaseCrashlytics.getInstance()
.setCrashlyticsCollectionEnabled(true)Sertakan konteks supaya crash bisa dipahami:
Crashlytics.getInstance().setCustomKey("workout_id", workout.id)
Crashlytics.getInstance().setCustomKey("steps", steps)
// Untuk error yang tertangkap tapi kritis
Crashlytics.getInstance().recordException(RuntimeException("sync gagal: $msg"))Data penting per crash: impacted users (jumlah pengguna terdampak), fatal vs non-fatal, dan grouping otomatis (crash yang sama dikelompokkan). Prioritaskan yang paling banyak terdampak, bukan yang paling baru.
Tip
Jangan pasang Crashlytics lalu mengabaikannya. Tetapkan rutinitas: 3-4x seminggu buka dashboard, tandai regression (crash muncul di build terbaru), dan buat issue. Crash yang dibiarkan menumpuk akan merusak rating tanpa kalian sadari.
Analytics menjawab: fitur apa yang dipakai? Di mana pengguna berhenti? Firebase Analytics (gratis) atau Mixpanel/PostHog (lebih dalam).
FirebaseAnalytics.getInstance(this).apply {
logEvent("workout_started") {
param("workout_type", "running")
param("duration_min", 30)
}
logEvent("purchase") {
param("item", "pro_subscription")
param("value", 99999)
}
}| Metrik | Arti |
|---|---|
| DAU/MAU | Keterlibatan harian/bulanan |
| Retention (D1/D7/D30) | Apakah pengguna kembali? |
| Funnel completion | Login → start workout → selesai |
| Crash-free sessions | Persentase sesi tanpa crash |
| Feature usage | Fitur mana yang dipakai |
Satu aturan emas: definisikan event sebelum menulis kode, dan beri nama konsisten (screen_view_*, action_*). Event yang semrawut menghasilkan data yang tidak bisa dibandingkan.
1. Install 100%
2. Buka beranda 92% ← 8% hilang saat launch
3. Daftar akun 61% ← 31% hilang di form
4. Start workout 48% ← 13% hilang di onboarding
5. Return D7 22%Setiap penurunan besar adalah tempat untuk diperbaiki — misal form daftar terlalu panjang atau onboarding membingungkan. Data funnel mengarahkan perhatian tim ke masalah yang berdampak.
Remote Config mengubah perilaku aplikasi dari server tanpa rilis — sangat berharga untuk perbaikan cepat dan eksperimen.
val config = FirebaseRemoteConfig.getInstance()
config.setDefaultsAsync(mapOf("challenge_bonus" to 100))
config.fetchAndActivate().addOnCompleteListener {
val bonus = config.getLong("challenge_bonus")
uiState.update { it.copy(challengeBonus = bonus) }
}Kegunaan nyata:
Warning
Remote config adalah senjata tajam: jika nilai default tidak disetel dengan benar, aplikasi bisa salah perilaku saat offline. Selalu sediakan default lokal yang aman dan jangan jadikan remote config satu-satunya pengaman untuk bug serius.
firebase_crashlytics, firebase_analytics, firebase_remote_config resmi.@react-native-firebase/crashlytics atau expo-firebase; alternatif Sentry (@sentry/react-native) sangat populer.FirebaseCrashlytics + MetricKit (metrik performa bawaan Apple).Semua provider punya konsep sama: SDK diinisialisasi di awal app, event dikirim ke dashboard, dan remote config dibaca di runtime.
Note
Perhatian: setiap SDK analytics/crash mengirim data ke pihak ketiga. Ini berdampak pada data safety store (episode 18) dan regulasi privasi (episode 20) — pastikan kebijakan konsisten dengan yang kalian nyatakan.
Pada episode 19 ini, kalian telah membangun mata dan telinga aplikasi:
Di episode 20 selanjutnya kita selaraskan dengan aturan: Privacy & Compliance Mobile — permission model, GDPR, dan data minimization untuk Fitku. Sampai jumpa!