Ketika pelanggan mengirim pesan, aplikasi bisnis perlu mengetahui pesan itu tanpa mengecek server WhatsApp setiap beberapa detik. Di sinilah cara kerja webhook WhatsApp menjadi penting. Webhook mengirim pemberitahuan ke endpoint aplikasi saat ada event, misalnya pesan masuk atau perubahan status pesan keluar.
Konsepnya mirip kurir yang langsung memberi kabar ketika paket tiba. Aplikasi tidak perlu terus bertanya, tetapi harus punya alamat penerima yang aktif, aman, dan mampu memproses kiriman dengan benar. Panduan ini membahas fondasinya tanpa bergantung pada framework tertentu. ๐ก
๐ Apa itu webhook WhatsApp?
Menurut dokumentasi WhatsApp Business Platform dari Meta, webhook adalah request HTTP berisi payload JSON yang dikirim server Meta ke server yang ditentukan pemilik aplikasi. Untuk field messages, notifikasi dapat membawa pesan yang dikirim pengguna ke bisnis serta status pesan yang dikirim bisnis kepada pengguna.
Webhook berbeda dari API biasa. Saat memakai API, aplikasi aktif meminta data atau menjalankan tindakan. Pada webhook, sistem sumber menghubungi endpoint aplikasi ketika event terjadi. Keduanya sering dipakai bersama: API untuk mengirim pesan, webhook untuk menerima pesan dan memantau statusnya.
โ๏ธ Alur cara kerja webhook WhatsApp
Alur dasarnya dimulai saat pengguna mengirim pesan ke nomor bisnis atau saat status pesan keluar berubah. WhatsApp Business Platform membentuk payload, lalu mengirim request HTTP ke callback URL yang telah dikonfigurasi. Endpoint membaca payload, memvalidasinya, menyimpan event, dan mengembalikan response sukses.
Payload pesan masuk umumnya memiliki array messages, sedangkan notifikasi status pesan keluar memakai array statuses. Status dapat menunjukkan tahapan seperti terkirim dari server, diterima perangkat, dibaca, atau gagal. Struktur detail dapat berubah mengikuti jenis pesan dan versi API, jadi parser perlu mengikuti dokumentasi versi yang digunakan.
Contoh alur sederhana
- Pelanggan mengirim pesan WhatsApp ke bisnis.
- Platform mengirim payload JSON ke callback URL.
- Server memeriksa request dan jenis event.
- Event disimpan atau dimasukkan ke antrean proses.
- Endpoint segera mengembalikan HTTP 200.
- Worker menjalankan aksi lanjutan, misalnya membuat tiket atau menyiapkan balasan.
Pemisahan endpoint dan worker membuat penerimaan event tetap cepat meski proses bisnis membutuhkan waktu lebih lama. ๐
๐งฉ Bagian payload yang perlu dikenali
Jangan langsung mengasumsikan semua payload memiliki bentuk yang sama. Mulailah dari objek utama, daftar entry, daftar changes, lalu objek value. Dari sana, periksa apakah payload membawa messages, statuses, atau error.
Untuk pesan masuk, field yang relevan dapat mencakup ID pesan, pengirim, waktu, tipe, dan isi sesuai tipe pesan. Untuk status keluar, simpan ID pesan, status, waktu event, dan informasi error bila tersedia. Hindari menyimpan seluruh payload tanpa batas; pilih data yang benar-benar dibutuhkan dan tetapkan retensi log.
โ Menyiapkan endpoint callback
Callback URL harus memakai HTTPS yang valid dan dapat dijangkau platform. Buat route khusus, misalnya POST /webhooks/whatsapp, lalu batasi controller agar hanya menangani webhook. Jangan mencampurnya dengan halaman admin atau endpoint pelanggan.
Pada tahap konfigurasi, platform biasanya perlu memastikan bahwa endpoint benar-benar dikuasai aplikasi. Ikuti prosedur verifikasi endpoint pada dokumentasi resmi dan simpan nilai verifikasi sebagai secret di environment, bukan di repository. Setelah itu, pilih field webhook yang memang dibutuhkan oleh aplikasi.
Endpoint sebaiknya melakukan pekerjaan minimum: baca body mentah, verifikasi request sesuai mekanisme provider, validasi JSON, catat ID event, masukkan pekerjaan ke queue, lalu balas sukses. Proses berat seperti memanggil AI, mengunduh media, atau mengirim notifikasi lain dijalankan terpisah.
๐ Keamanan yang tidak boleh dilewatkan
URL yang bisa diakses internet akan menerima traffic yang tidak selalu sah. Karena itu, jangan mempercayai request hanya karena bentuk JSON-nya mirip contoh dokumentasi. Terapkan verifikasi request sesuai spesifikasi provider, gunakan HTTPS, batasi ukuran body, validasi content type, dan tolak struktur yang tidak dikenal dengan aman.
Simpan token dan secret di secret manager atau environment dengan permission terbatas. Jangan menulisnya ke log. Log juga perlu menyamarkan nomor telepon dan isi pesan jika tidak diperlukan untuk diagnosis. Akses ke dashboard event harus memakai authentication dan authorization.
Gunakan rate limit secara hati-hati agar serangan tidak menghabiskan resource, tetapi jangan sampai event resmi terbuang tanpa jejak. Monitoring harus membedakan request invalid, error aplikasi, antrean macet, dan event sah yang selesai diproses. ๐
โป๏ธ Idempotensi dan event duplikat
Dokumentasi Meta menjelaskan bahwa pengiriman webhook dapat dicoba ulang jika endpoint tidak mengembalikan HTTP 200 atau tidak dapat dijangkau. Retry berarti aplikasi bisa menerima notifikasi yang sama lebih dari sekali. Karena itu, handler wajib idempotent.
Simpan ID pesan atau kunci event yang stabil, lalu cek apakah event sudah pernah diproses sebelum menjalankan aksi bisnis. Beri unique constraint atau mekanisme deduplikasi pada penyimpanan event. Jangan hanya mengandalkan pengecekan di memori karena proses bisa restart atau berjalan di beberapa instance.
Idempotensi sangat penting ketika webhook memicu notifikasi, pembuatan tiket, atau perubahan status. Tanpanya, satu retry dapat menghasilkan balasan ganda dan data yang membingungkan pelanggan.
๐งช Cara menguji webhook
Mulai di environment development dengan endpoint uji yang aman. Kirim test payload dari dashboard provider bila tersedia. Pastikan server menerima request, parser mengenali jenis event, dan response diberikan cepat. Setelah itu, uji pesan teks, tipe pesan lain yang didukung, status terkirim, diterima, dibaca, serta kondisi gagal.
Tambahkan pengujian untuk body kosong, JSON rusak, field hilang, signature invalid, event duplikat, queue gagal, dan database sementara tidak tersedia. Uji juga apakah retry tetap menghasilkan satu aksi bisnis. Untuk debugging, catat correlation ID dan waktu proses tanpa menyalin secret atau data percakapan sensitif.
Checklist pengujian
- Endpoint HTTPS dapat dijangkau.
- Verifikasi endpoint berhasil sesuai dokumentasi provider.
- Request tidak sah ditolak.
- Pesan masuk dan status keluar dibedakan.
- Event duplikat tidak menjalankan aksi dua kali.
- Endpoint cepat mengembalikan HTTP 200 setelah event diterima aman.
- Error queue dan worker terlihat di monitoring.
- Log tidak membocorkan token atau isi pesan yang tidak diperlukan.
๐ ๏ธ Troubleshooting umum
Jika webhook tidak masuk, cek callback URL, sertifikat HTTPS, mode aplikasi, subscription field, dan log reverse proxy. Jika provider terus melakukan retry, periksa status HTTP dan waktu respons. Endpoint yang terlalu lama sering terjadi karena seluruh proses bisnis dijalankan sebelum response.
Jika status pesan tidak cocok, pastikan aplikasi menghubungkan event menggunakan ID pesan, bukan urutan kedatangan. Event jaringan tidak selalu tiba sesuai urutan yang kita bayangkan. Simpan timestamp event dan gunakan aturan transisi status yang aman.
Kalau integrasi akan dihubungkan ke sistem bisnis, pelajari juga cara aplikasi dan tools saling terhubung. Untuk alur pembayaran, baca panduan payment gateway QRIS; keputusan pembayaran tetap harus berasal dari sistem transaksi, bukan isi chat.
๐ Kesimpulan
Cara kerja webhook WhatsApp sebenarnya sederhana: platform mendorong event JSON ke endpoint aplikasi. Tantangannya ada pada implementasi yang tahan retry, aman, mudah dipantau, dan tidak mencampur penerimaan event dengan proses berat.
Mulai dari endpoint kecil, validasi setiap request, simpan kunci idempotensi, gunakan queue, lalu uji jalur sukses dan gagal. Kuskuskuy menyarankan pendekatan bertahap seperti ini agar integrasi lebih mudah dirawat ketika volume pesan tumbuh. โ
Sumber referensi dan gambar
[1] Meta for Developers โ WhatsApp webhooks.
[2] Meta for Developers โ messages webhook reference.
Featured image: WhatsApp Chatting with Dark Mode karya VincentLR, Wikimedia Commons, lisensi CC BY-SA 4.0. Gambar dioptimalkan ke WebP; Visual Mode: screenshot/UI aplikasi.
