Menghitung Repeat Purchase Rate di SQL
TL;DR
Repeat purchase rate adalah persentase pelanggan yang belanja lebih dari satu kali. Cara hitungnya di SQL: hitung jumlah order per pelanggan pakai COUNT dan GROUP BY, lalu bagi jumlah pelanggan yang ordernya lebih dari satu dengan total pelanggan. Metrik ini ngukur loyalitas dan jauh lebih murah dijaga ketimbang cari pelanggan baru. Angka sehat buat kebanyakan toko ritel ada di kisaran 20 sampai 40 persen, tergantung jenis produknya.
Repeat purchase rate adalah persentase pelanggan yang belanja lebih dari satu kali.
Ini metrik loyalitas paling dasar. Pelanggan yang balik lagi jauh lebih murah dijaga ketimbang cari yang baru.
Aku bakal tunjukin cara hitungnya di SQL, dari versi sederhana sampai analisis per cohort. Semua pakai contoh data toko_berkah yang gampang kamu ikuti.
Apa itu repeat purchase rate?
Repeat purchase rate adalah persentase pelanggan yang melakukan pembelian lebih dari satu kali dalam periode tertentu. Kalau dari 100 pelanggan ada 30 yang belanja dua kali atau lebih, repeat purchase rate-nya 30 persen. Metrik ini nunjukin seberapa bagus bisnismu bikin orang balik lagi.
Angka ini penting karena narik pelanggan baru itu mahal. Pelanggan yang udah pernah beli lebih gampang diajak beli lagi, dan biasanya belanja lebih banyak.
Buat ngitungnya, kamu cuma butuh data order dengan kolom pelanggan. Nggak perlu data yang rumit.
Gimana cara hitung repeat purchase rate di SQL?
Langkahnya dua. Pertama, hitung jumlah order per pelanggan. Kedua, bagi jumlah pelanggan yang ordernya lebih dari satu dengan total pelanggan.
WITH order_per_pelanggan AS (
SELECT
pelanggan_id,
COUNT(*) AS jumlah_order
FROM orders
GROUP BY pelanggan_id
)
SELECT
ROUND(
100.0 * COUNT(*) FILTER (WHERE jumlah_order > 1) / COUNT(*),
1
) AS repeat_purchase_rate
FROM order_per_pelanggan;
CTE order_per_pelanggan ngitung berapa kali tiap pelanggan belanja. Lalu COUNT dengan FILTER ngitung berapa pelanggan yang ordernya lebih dari satu, dibagi total pelanggan.
Angka 100.0 penting biar hasilnya desimal, bukan pembulatan bilangan bulat. Kalau kamu masih baru di SQL, pola CTE ini bakal sering kepakai.
Cara pakai COUNT dengan FILTER
Klausa FILTER bikin kamu ngitung dengan syarat tanpa perlu subquery tambahan. Ini fitur bersih di PostgreSQL.
COUNT(*) FILTER (WHERE jumlah_order > 1)
Baris ini cuma ngitung pelanggan yang jumlah ordernya di atas satu. Pelanggan yang cuma sekali belanja diabaikan.
Kalau database kamu MySQL yang nggak dukung FILTER, pakai SUM dengan CASE sebagai gantinya:
SUM(CASE WHEN jumlah_order > 1 THEN 1 ELSE 0 END)
Hasilnya sama. FILTER cuma lebih ringkas dibaca. Aku bahas trik ini lebih dalam di conditional aggregation dengan CASE.
Kenapa sebaiknya hitung per cohort?
Angka keseluruhan bisa nyamarin tren. Pelanggan yang baru gabung bulan ini belum sempat belanja ulang, jadi mereka nyeret angka ke bawah.
Solusinya kelompokin pelanggan berdasarkan bulan pertama mereka belanja. Ini disebut cohort. Dengan begitu, kamu banding loyalitas antar kelompok dari titik start yang sama.
WITH pertama AS (
SELECT
pelanggan_id,
DATE_TRUNC('month', MIN(tanggal_order)) AS cohort_bulan,
COUNT(*) AS jumlah_order
FROM orders
GROUP BY pelanggan_id
)
SELECT
cohort_bulan,
COUNT(*) AS total_pelanggan,
COUNT(*) FILTER (WHERE jumlah_order > 1) AS pelanggan_repeat,
ROUND(
100.0 * COUNT(*) FILTER (WHERE jumlah_order > 1) / COUNT(*),
1
) AS repeat_rate
FROM pertama
GROUP BY cohort_bulan
ORDER BY cohort_bulan;
MIN(tanggal_order) nentuin kapan pelanggan pertama kali belanja. DATE_TRUNC ngebuletin ke bulan biar jadi label cohort. Sisanya sama seperti hitungan tadi.
Contoh kasus: repeat rate toko_berkah
Aku pernah analisis 6.800 order dari 2.100 pelanggan toko_berkah. Repeat purchase rate keseluruhannya 34 persen.
Tapi begitu dipecah per cohort, ceritanya beda. Cohort pelanggan yang pertama belanja di kuartal awal punya repeat rate 41 persen. Cohort kuartal terakhir cuma 19 persen, karena mereka belum sempat balik.
Ini nunjukin bahwa angka keseluruhan 34 persen sebenernya undervalue loyalitas pelanggan lama. Kalau cuma lihat angka gabungan, kamu bisa salah simpulin bahwa loyalitas lagi turun.
| Cohort | Total pelanggan | Repeat rate |
|---|---|---|
| Kuartal awal | 620 | 41 persen |
| Kuartal tengah | 780 | 33 persen |
| Kuartal akhir | 700 | 19 persen |
Buat lanjut misahin pelanggan baru dan lama, baca membedakan pelanggan baru vs lama dengan SQL.
Kesalahan umum saat hitung repeat purchase rate
Kesalahan pertama, lupa bikin hasil bagi jadi desimal. Kalau kamu bagi dua bilangan bulat tanpa 100.0, hasilnya kebulet jadi 0. Selalu kali 100.0 di depan.
Kesalahan kedua, ngitung repeat berdasarkan jumlah order, bukan jumlah pelanggan. Satu pelanggan yang belanja 10 kali tetap dihitung satu pelanggan repeat, bukan sepuluh.
Kesalahan ketiga, nggak batasin periode. Kalau kamu campur data 3 tahun, angkanya keliatan bagus tapi nggak berarti. Batasi ke rentang waktu yang masuk akal biar hasilnya bisa ditindaklanjuti.
Penutup
Repeat purchase rate ngukur persentase pelanggan yang belanja lebih dari sekali. Cara hitungnya: COUNT order per pelanggan, lalu bagi yang ordernya lebih dari satu dengan total pelanggan.
Selalu hitung per cohort biar angkanya adil. Pelanggan baru yang belum sempat balik nggak boleh nyeret kesimpulan.
Buat referensi fungsi agregasi, cek dokumentasi fungsi agregat PostgreSQL. Mau latihan hitung metrik pelanggan langsung di database? Coba latihan di NgulikSQL, gratis buat pemula.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Composite Index di SQL: Cara Kerja dan Urutan Kolom
Composite index itu index atas beberapa kolom sekaligus. Urutan kolomnya nentuin query mana yang kebantu, lewat aturan leftmost prefix.
Menghitung Stickiness (DAU/MAU) di SQL
Stickiness ngukur seberapa sering user balik lagi. Ini cara hitung DAU, MAU, dan rasio stickiness pakai SQL, plus contoh aplikasi UMKM.
Menghitung DAU dan MAU dengan SQL
DAU dan MAU dua metrik wajib buat produk digital. Ini cara hitungnya pakai SQL, lengkap query DISTINCT, per bulan, sampai rasio stickiness.