Episode ini membahas analisis funnel dan conversion: memetakan tahapan perjalanan pelanggan, menghitung conversion rate per tahap, menemukan drop-off terbesar, hingga channel attribution. Ditutup dengan praktik audit funnel checkout yang bisa kalian terapkan langsung

Analisis cohort di episode 14 menunjukkan siapa yang bertahan. Sekarang kita bertanya di mana mereka berhenti? Funnel analysis memetakan perjalanan pelanggan tahap demi tahap — dari pengunjung hingga pembelian selesai — dan mengungkap di titik mana pengguna paling banyak "bocor".
Mengapa ini penting? Karena pertumbuhan bisnis sering kali paling mudah diperoleh dengan menambal kebocoran funnel daripada menarik lebih banyak traffic. Meningkatkan conversion 5% di tahap checkout bisa setara dengan menggandakan budget iklan. Analis yang paham funnel tahu persis di mana peluang terbesar berada.
Funnel adalah rangkaian event yang menandai kemajuan pengguna. Untuk e-commerce, funnel standar:
Kunjungi situs → Lihat produk → Tambah ke keranjang → Mulai checkout → Pembayaran selesaiData event biasanya tersimpan dalam tabel log peristiwa:
-- user_id, event, event_timestamp, channel, ...
CREATE TABLE events (
user_id BIGINT,
event VARCHAR(50),
event_timestamp TIMESTAMP,
channel VARCHAR(20)
);SELECT event, COUNT(DISTINCT user_id) AS users
FROM events
WHERE event_timestamp >= '2026-01-01'
GROUP BY event;Aturan penting: hitung user unik, bukan jumlah event — satu user yang merefresh halaman 10x bukan 10 pengguna. Dan urutkan tahapan dengan benar: jumlah pengguna harus menurun secara monoton (bocor) dari atas ke bawah; jika tidak, definisi funnel kalian salah.
Dari jumlah user per tahap, hitung dua angka kunci:
Conversion per tahap = users tahap berikutnya / users tahap ini
Drop-off = 1 - conversion per tahap
Overall conversion = users tahap akhir / users tahap awalWITH funnel AS (
SELECT
COUNT(DISTINCT CASE WHEN event = 'visit' THEN user_id END) AS visit,
COUNT(DISTINCT CASE WHEN event = 'add_to_cart' THEN user_id END) AS add_to_cart,
COUNT(DISTINCT CASE WHEN event = 'checkout' THEN user_id END) AS checkout,
COUNT(DISTINCT CASE WHEN event = 'payment' THEN user_id END) AS payment
FROM events
)
SELECT
visit, add_to_cart, checkout, payment,
ROUND(add_to_cart * 100.0 / visit, 1) AS cart_rate,
ROUND(checkout * 100.0 / add_to_cart, 1) AS checkout_rate,
ROUND(payment * 100.0 / visit, 1) AS overall_conversion
FROM funnel;Aturan emas audit funnel: fokus pada drop-off absolut terbesar — tahap yang kehilangan paling banyak user, bukan persentase terbesar. Kehilangan 50% dari 100 user (50 user) lebih penting daripada 90% dari 10 user (9 user).
Drop-off terbesar: dari checkout ke payment (kehilangan 2.025 user). Di sanalah investigasi harus dimulai.
Funnel agregat menyembunyikan perbedaan antar sumber traffic. Channel attribution menjawab: kanal mana yang membawa pengguna yang benar-benar sampai bayar?
SELECT channel, COUNT(DISTINCT user_id) AS users
FROM events
WHERE event IN ('visit', 'payment')
GROUP BY channel;SELECT channel,
COUNT(DISTINCT CASE WHEN event = 'payment' THEN user_id END) * 100.0 /
NULLIF(COUNT(DISTINCT CASE WHEN event = 'visit' THEN user_id END), 0) AS conversion
FROM events
GROUP BY channel
ORDER BY conversion DESC;Insight yang sering muncul: kanal dengan traffic terbesar (misal iklan display) belum tentu kanal dengan conversion terbaik (misal organik/search). Angka ini langsung berdampak pada alokasi budget marketing.
Important
Attribution adalah medan jebakan: atribusi last-touch (kredit ke kanal terakhir) dan first-touch (kanal pertama) menghasilkan cerita yang berbeda. Selalu nyatakan model atribusi yang dipakai, dan paham bahwa funnel per channel hanya satu sudut pandang — kombinasi kanal (multi-touch) adalah cerita yang lebih utuh.
Kasus: tim produk curiga "banyak orang berhenti di checkout". Audit yang benar:
Hasil audit bukan sekadar "conversion 25%", melainkan rekomendasi: "Drop-off terbesar antara checkout dan payment (25% conversion), 3x lebih parah di mobile Android, dan korelasi dengan keluhan OTP SMS — rekomendasikan A/B test verifikasi alternatif."
COUNT(*) bukan COUNT(DISTINCT user_id).Inti yang harus dibawa pulang:
Di episode 16 selanjutnya kita memperluas arena kerja dari database kecil ke data warehouse di cloud: BigQuery, Snowflake, dan Redshift — apa bedanya dengan OLTP, bagaimana query data raksasa, dan cara mengendalikan biaya. Funnel sudah mengungkap titik kebocoran; sekarang kita pastikan kalian bisa menarik data dari skala enterprise!