Churn Rate SQL: Deteksi Pelanggan yang Kabur Sejak Dini
Blog/Tutorial SQL/Churn Rate SQL: Deteksi Pelanggan yang Kabur Sejak Dini

Churn Rate SQL: Deteksi Pelanggan yang Kabur Sejak Dini

BimaBima
·20 Mei 2026·11 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Churn rate adalah persentase pelanggan yang berhenti beli dalam satu periode, dihitung dengan bagi jumlah pelanggan yang hilang dengan jumlah pelanggan aktif di awal periode. Di bisnis tanpa langganan kayak toko retail, kamu harus tentuin sendiri ambang churn-nya, misalnya gak ada transaksi selama 90 hari. Sinyal paling awal bukan berhentinya transaksi, tapi turunnya frekuensi belanja, dan itu bisa kamu deteksi lewat SQL berbulan-bulan sebelum pelanggan beneran hilang.

Churn rate adalah persentase pelanggan yang berhenti beli dalam satu periode, dihitung dari jumlah pelanggan yang hilang dibagi jumlah pelanggan aktif di awal periode.

Yang bikin ribet bukan rumusnya. Yang bikin ribet: di toko retail, gak ada yang ngasih tau kamu kalau mereka udah berhenti jadi pelanggan.

Di Netflix, orang klik "batalkan langganan" dan kamu langsung tau. Di toko kelontong, orang cuma... gak dateng lagi. Kamu harus nebak sendiri kapan mereka dianggap hilang. Ini studi kasus dari 1.240 pelanggan toko_berkah yang hilang, plus query buat nangkep mereka lebih awal.

Gimana nentuin pelanggan udah churn?

Jangan asal ambil angka 90 hari karena keliatan bulat. Lihat datanya dulu.

Langkah pertama: cari tau berapa lama jeda normal antar pembelian di pelanggan kamu.

WITH jarak AS (
  SELECT
    pelanggan_id,
    tanggal,
    tanggal - LAG(tanggal) OVER (
      PARTITION BY pelanggan_id ORDER BY tanggal
    ) AS jeda_hari
  FROM transaksi
)
SELECT
  ROUND(AVG(jeda_hari), 1) AS rata_jeda,
  PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY jeda_hari) AS median_jeda,
  PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY jeda_hari) AS p90_jeda
FROM jarak
WHERE jeda_hari IS NOT NULL;

Hasil di toko_berkah:

Statistik jeda antar belanjaHari
Rata-rata31,4
Median24
Persentil 9067

Bacanya begini: 90 persen pembelian ulang terjadi dalam 67 hari. Kalau pelanggan udah diam lebih dari 90 hari, dia udah lewat jauh dari kebiasaan normalnya.

Jadi ambang 90 hari itu masuk akal buat toko_berkah. Kalau bisnismu jualan kasur, jeda normalnya bisa 3 tahun, dan ambang 90 hari bakal ngasih kamu angka churn yang gila.

Aturannya: ambang churn = sekitar 3 kali siklus belanja normal.

Query buat nandain pelanggan yang churn

Sekali ambangnya ketemu, query-nya sederhana.

WITH terakhir AS (
  SELECT
    pelanggan_id,
    MAX(tanggal) AS transaksi_terakhir,
    COUNT(*) AS total_transaksi,
    SUM(total_harga) AS total_belanja
  FROM transaksi
  GROUP BY pelanggan_id
)
SELECT
  pelanggan_id,
  transaksi_terakhir,
  CURRENT_DATE - transaksi_terakhir AS hari_diam,
  total_transaksi,
  total_belanja,
  CASE
    WHEN CURRENT_DATE - transaksi_terakhir > 90 THEN 'churn'
    WHEN CURRENT_DATE - transaksi_terakhir > 45 THEN 'berisiko'
    ELSE 'aktif'
  END AS status
FROM terakhir
ORDER BY hari_diam DESC;

Perhatiin kategori tengah: berisiko. Ini kelompok yang masih bisa diselametin. Kalau kamu cuma punya kategori churn dan aktif, kamu baru sadar pas semuanya udah telat.

Lebih dalam soal CASE dan agregasi ada di CASE WHEN dan MAX.

Studi kasus: 1.240 pelanggan toko_berkah yang hilang

Data setahun penuh, 2025. Toko_berkah punya 4.180 pelanggan yang pernah transaksi.

Aku jalanin query di atas per bulan buat lihat churn rate bulanannya.

BulanAktif bulan laluHilangChurn rate
Feb 20251.8401478,0%
Mei 20251.9101688,8%
Ags 20252.04029414,4%
Nov 20251.87020110,7%

Total setahun: 1.240 pelanggan hilang dari 4.180. Churn tahunan 29,7 persen.

Yang menarik lonjakan Agustus. Churn-nya hampir dua kali lipat bulan-bulan lain.

Aku cek apa yang terjadi. Agustus 2025 itu bulan di mana toko_berkah naikin harga 6 produk sembako sekitar 8–12 persen. Pelanggan yang paling banyak kabur: kelompok yang belanjanya di bawah Rp 50 ribu per transaksi.

Ini temuan yang gak keliatan dari angka omzet, karena omzet Agustus malah naik. Kenaikan harga nutupin pelanggan yang pergi.

Sinyal dini: gimana nangkep mereka sebelum kabur

Ini bagian yang paling berguna. Pelanggan gak berhenti mendadak. Mereka pelan-pelan.

Dari data toko_berkah, aku lihat tiga sinyal yang muncul sebelum transaksinya berhenti total.

  1. Frekuensi belanja turun. Yang biasanya tiap 2 minggu jadi tiap 5 minggu.
  2. Nilai keranjang mengecil. Dari rata-rata Rp 80 ribu jadi Rp 35 ribu.
  3. Variasi produk menyusut. Dari beli 6 kategori jadi cuma 2 kategori.

Sinyal pertama yang paling gampang dideteksi lewat SQL.

WITH per_pelanggan AS (
  SELECT
    pelanggan_id,
    COUNT(*) FILTER (
      WHERE tanggal >= CURRENT_DATE - 60
    ) AS transaksi_60_hari,
    COUNT(*) FILTER (
      WHERE tanggal >= CURRENT_DATE - 180
        AND tanggal <  CURRENT_DATE - 60
    ) AS transaksi_120_hari_sebelumnya
  FROM transaksi
  GROUP BY pelanggan_id
)
SELECT
  pelanggan_id,
  transaksi_60_hari,
  ROUND(transaksi_120_hari_sebelumnya / 2.0, 1) AS rata_per_60_hari_dulu,
  ROUND(
    transaksi_60_hari
    / NULLIF(transaksi_120_hari_sebelumnya / 2.0, 0)
  , 2) AS rasio_frekuensi
FROM per_pelanggan
WHERE transaksi_120_hari_sebelumnya >= 4
  AND transaksi_60_hari
      < (transaksi_120_hari_sebelumnya / 2.0) * 0.5
ORDER BY rasio_frekuensi ASC;

Query ini nyari pelanggan yang frekuensi belanjanya di 60 hari terakhir turun lebih dari setengah dibanding kebiasaan mereka sendiri.

Hasilnya di toko_berkah: 418 pelanggan masuk daftar ini, dan 71 persen dari mereka beneran churn dalam 4 bulan berikutnya.

Artinya query ini ngasih kamu waktu 4 bulan buat ngelakuin sesuatu. Kirim voucher, telepon, tanya kenapa. Apa pun.

Bandingin sama nunggu ambang 90 hari lewat: waktu kamu baru sadar, orangnya udah pindah ke toko sebelah.

Kesalahan umum waktu ngitung churn

Ambil ambang 30 hari karena keliatan enak. Kalau siklus belanja normalnya 24 hari, ambang 30 hari bakal nandain setengah pelanggan aktif kamu sebagai churn. Angka churn-nya jadi horor, dan gak ada yang percaya lagi sama laporanmu.

Ngitung churn dari semua pelanggan, termasuk yang baru sekali beli. Orang yang beli sekali terus gak balik itu masalah akuisisi, bukan masalah retensi. Pisahin dua kelompok ini. Kalau dicampur, churn rate kamu bakal keliatan parah terus.

Lupa revenue churn. Kehilangan 10 pelanggan kecil yang belanja Rp 30 ribu itu beda banget sama kehilangan 1 warung yang belanja Rp 3 juta. Hitung churn berdasarkan nilai, bukan cuma jumlah kepala.

Cuma lapor angkanya tanpa alasan. Churn 14,4 persen di Agustus itu angka. Yang bikin berguna: nemuin kenaikan harga sembako sebagai penyebabnya. Cari korelasinya sebelum presentasi.

Buat referensi lebih jauh soal cohort dan retensi, dokumentasi window function BigQuery lumayan lengkap.

FAQ

Apa rumus churn rate?

Churn rate = jumlah pelanggan yang hilang selama periode dibagi jumlah pelanggan aktif di awal periode, dikali 100. Kalau awal bulan ada 1.000 pelanggan aktif dan 80 berhenti beli, churn rate-nya 8 persen. Yang bikin ribet bukan rumusnya, tapi definisi "hilang" itu sendiri, apalagi di bisnis yang gak pakai sistem langganan.

Gimana nentuin pelanggan udah churn di bisnis retail?

Cek dulu jarak rata-rata antar pembelian dari pelanggan aktifmu. Kalau mayoritas belanja tiap 3 sampai 4 minggu, ambang 90 hari itu masuk akal karena udah lewat tiga kali siklus normal. Jangan asal ambil 30 hari atau 6 bulan tanpa lihat data. Ambang yang salah bikin angka churn-mu terlalu galak atau terlalu santai.

Apa bedanya churn rate dan retention rate?

Dua-duanya sisi mata uang yang sama. Kalau retention rate 85 persen, churn rate-nya 15 persen. Retention biasanya dipakai buat cerita yang positif ke manajemen, churn dipakai buat ngasih alarm. Yang lebih berguna sebenernya revenue churn, karena kehilangan satu pelanggan besar bisa lebih sakit dari kehilangan sepuluh pelanggan kecil.

Sinyal apa yang muncul sebelum pelanggan churn?

Frekuensi belanja turun duluan, sebelum transaksinya berhenti total. Pelanggan yang biasanya belanja tiap 2 minggu tiba-tiba jadi tiap 5 minggu. Sinyal kedua: nilai keranjang mengecil. Ketiga: variasi produk yang dibeli menyusut, dari 6 kategori jadi 2. Tiga sinyal ini bisa kamu deteksi lewat SQL jauh sebelum pelanggannya beneran hilang.

Berapa churn rate yang wajar?

Sangat tergantung industri, jadi jangan bandingin lintas sektor. Di toko kelontong dengan pelanggan warung, churn tahunan 15 sampai 25 persen itu lumrah. Di aplikasi mobile, churn 30 hari pertama bisa tembus 70 persen dan itu masih normal. Patokan yang lebih berguna: bandingin churn kamu bulan ini sama bulan-bulan sebelumnya.

Penutup

Tiga hal yang bikin analisis churn kamu beneran kepakai.

Tentuin ambang churn dari data siklus belanja pelangganmu sendiri, bukan dari angka bulat yang keliatan enak.

Bikin kategori "berisiko" di tengah. Itu kelompok yang masih bisa diselametin.

Deteksi frekuensi belanja yang melambat. Di toko_berkah, sinyal ini nangkep 71 persen pelanggan yang bakal churn, 4 bulan sebelum mereka beneran ilang.

Coba jalanin query sinyal dini di data kamu sendiri. Kalau keluar 400-an nama, itu daftar telepon buat minggu depan.

Latihan window function yang dipakai di sini bisa mulai dari LAG dan cohort analysis.

Lanjut baca: YoY Growth SQL — buat ngecek apakah pelanggan yang hilang itu udah kelihatan efeknya di omzet.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel Terkait

YoY Growth SQL: Bandingkan Performa dengan Tahun Lalu
Tutorial SQL
17 Mei 2026•11 menit baca

YoY Growth SQL: Bandingkan Performa dengan Tahun Lalu

Hitung YoY growth di SQL pakai LAG atau self-join, lengkap dengan cara ngindarin pembagi nol dan jebakan bulan yang bolong. Contohnya pakai data toko_berkah.

BimaBima
MoM Growth SQL: Hitung Pertumbuhan Bulanan Otomatis
Tutorial SQL
14 Mei 2026•10 menit baca

MoM Growth SQL: Hitung Pertumbuhan Bulanan Otomatis

Berhenti copy-paste omzet bulan lalu ke Excel buat ngitung growth. Satu query SQL pakai LAG bisa ngasih pertumbuhan bulanan otomatis, lengkap sampai bulan yang datanya kosong.

BimaBima
Customer Lifetime Value SQL: Hitung LTV dari Data Transaksi
Tutorial SQL
11 Mei 2026•11 menit baca

Customer Lifetime Value SQL: Hitung LTV dari Data Transaksi

LTV bilang berapa nilai satu pelanggan sepanjang dia jadi pelanggan kamu. Ini query SQL buat ngitungnya dari data transaksi, plus cara pakainya buat keputusan budget akuisisi.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

Copyright © 2026 - All rights reserved

LINKS
SupportPricingDatasetBlogAffiliates
LEGAL
Terms of servicesPrivacy policy
Ngulik Data
DatasetLeaderboardBlogStore