Ringkasan Utama
Untuk notifikasi pelanggan di Indonesia, gunakan WhatsApp Business Cloud API resmi dari Meta, bukan library tidak resmi. Daftarkan template pesan yang sudah disetujui, balas dengan pesan bebas di dalam jendela layanan pelanggan 24 jam yang terbuka saat pelanggan mengirim pesan, terima pesan masuk lewat webhook, dan siapkan anggaran untuk pricing per-pesan template yang berbeda per kategori (marketing, utility, authentication), sementara balasan non-template di dalam jendela tetap gratis.
Di Indonesia, WhatsApp bukan sekadar aplikasi chat — ini adalah kanal default untuk segala hal, dari konfirmasi pesanan sampai pengingat pembayaran. Pada sebuah proyek untuk klien Indonesia baru-baru ini, saya butuh backend yang mengirim notifikasi andal begitu pesanan dikirim atau tagihan jatuh tempo. Godaannya selalu memakai library scraper yang mengotomasi WhatsApp Web. Saya sangat menyarankan untuk tidak melakukannya, dan artikel ini menjelaskan jalur resmi yang saya tempuh sebagai gantinya.
Opsi resmi adalah WhatsApp Business Platform Cloud API, yang di-hosting oleh Meta. Tidak ada server WhatsApp yang perlu Anda jalankan sendiri — Anda cukup memanggil satu endpoint HTTP, dan Meta menangani pengiriman, enkripsi, serta kesehatan akun. Keputusan tunggal itu menghilangkan satu kelas penuh insiden produksi yang biasa diciptakan oleh tools tidak resmi.
Kenapa Cloud API resmi mengalahkan library tidak resmi
Library Node dan Python populer yang menggerakkan WhatsApp Web lewat headless browser terlihat praktis karena gratis dan melewati proses persetujuan. Tapi ini adalah klien hasil reverse-engineering, dan Ketentuan Layanan WhatsApp melarang reverse engineering layanannya maupun penggunaannya lewat cara otomatis yang tidak sah. Library seperti ini bisa rusak setiap kali WhatsApp memperbarui klien web-nya, dan Ketentuan yang sama mengizinkan WhatsApp menonaktifkan atau menangguhkan akun yang melanggarnya. Untuk pipeline notifikasi bisnis, nomor yang dinonaktifkan berarti gangguan total tanpa peringatan. Berikut perbandingan kedua pendekatan tersebut.
| Aspek | Cloud API resmi | Library tidak resmi |
|---|---|---|
| Keandalan | Di-hosting Meta, endpoint stabil dengan versi | Hasil reverse-engineer WhatsApp Web, rusak saat ada update |
| Keamanan akun | Direstui Meta; penegakan dimulai dari peringatan dan pembatasan yang bisa diajukan banding | Akun bisa dinonaktifkan karena melanggar Ketentuan WhatsApp |
| Kepatuhan | Review template dan opt-in ditegakkan | Tanpa pengaman, ada risiko hukum nyata |
| Skala | Tier resmi dari 250 hingga tanpa batas penerima per 24 jam | Satu sesi yang rapuh, mudah ditandai |
| Dukungan | Dokumentasi Meta plus dukungan BSP | Hanya komunitas, tanpa bantuan saat rusak |
Jika WhatsApp menonaktifkan sebuah nomor karena melanggar Ketentuannya, seluruh alur notifikasi Anda ikut berhenti, dan Anda tidak bisa begitu saja mendaftarkan pengganti, karena Ketentuan tersebut melarang pembuatan akun lain tanpa izin. Penghematan biaya dari library tidak resmi tidak sebanding dengan risiko operasional itu pada sistem produksi.
Template pesan dan cara mendapatkan persetujuannya
Setiap pesan yang Anda kirim di luar jendela layanan pelanggan yang terbuka wajib memakai template yang sudah disetujui. Anda membuat template sekali lewat Message Templates API atau WhatsApp Manager, lengkap dengan contoh nilai untuk setiap placeholder, lalu Meta meninjaunya; keputusan persetujuan bisa memakan waktu hingga 24 jam. Hanya template yang sudah disetujui yang bisa dikirim. Template mendukung variabel placeholder yang Anda isi saat pengiriman, jadi satu template yang disetujui bisa mencakup ribuan pesan yang dipersonalisasi. Pilih kategori yang tepat — utility untuk update transaksional, marketing untuk promosi, authentication untuk kode sekali pakai — karena kategori menentukan aturan persetujuan sekaligus penagihan.
// Create a UTILITY template (Bahasa Indonesia) via the Graph API
// POST https://graph.facebook.com/v26.0/<WABA_ID>/message_templates
// Authorization: Bearer <SYSTEM_USER_TOKEN>
{
"name": "order_shipped_id",
"language": "id",
"category": "UTILITY",
"components": [
{
"type": "BODY",
"text": "Halo {{1}}, pesanan {{2}} Anda sudah dikirim dan diperkirakan tiba {{3}}.",
"example": {
"body_text": [["Budi", "INV-2026-0817", "besok sore"]]
}
}
]
}Tulis template dalam Bahasa Indonesia sejak awal, dengan kode bahasa id. Meta tidak menerjemahkan isi template, dan setiap versi bahasa adalah template tersendiri yang melewati review dan dihitung dalam batas jumlah template Anda, jadi pisahkan versi Inggris dan Indonesia alih-alih mencampur keduanya dalam satu isi template.
Jendela layanan pelanggan 24 jam
Begitu pelanggan mengirim pesan kepada Anda, jendela layanan pelanggan 24 jam terbuka. Selama jendela terbuka, Anda bisa membalas dengan pesan bebas — tanpa template — dan setiap pesan baru dari pelanggan mereset timer menjadi 24 jam lagi. Setelah jendela tertutup, satu-satunya cara menjangkau pelanggan itu lagi adalah lewat pesan template. Perbedaan inilah inti dari platform ini: template untuk kontak yang diinisiasi bisnis, pesan layanan bebas untuk percakapan yang dimulai pelanggan.
- Jendela terbuka: kirim teks, gambar, tombol, atau daftar dengan bebas — ideal untuk balasan support atau chatbot.
- Jendela tertutup: hanya pesan template yang disetujui yang bisa menghubungi pelanggan kembali.
- Setiap pesan masuk dari pelanggan mereset timer 24 jam, sehingga chat yang aktif tetap bisa bebas template.
Mengirim pesan template dari backend
Semua pesan keluar menuju satu endpoint. Anda butuh phone number ID dari dashboard Meta, access token System User yang berumur panjang, dan nomor penerima lengkap dengan tanda plus dan kode negara — untuk Indonesia berarti +62 tanpa angka nol di depan, jadi nomor yang diawali 0812 menjadi +62812. Meta sangat menyarankan tanda plus tetap dicantumkan: tanpa tanda plus, kode negara nomor bisnis Anda sendiri akan ditambahkan di depan, sehingga pesan bisa salah terkirim. Parameter body mengisi placeholder template sesuai urutan.
// POST https://graph.facebook.com/v26.0/<PHONE_NUMBER_ID>/messages
// Authorization: Bearer <ACCESS_TOKEN>
{
"messaging_product": "whatsapp",
"to": "+6281234567890",
"type": "template",
"template": {
"name": "order_shipped_id",
"language": { "code": "id" },
"components": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "Budi" },
{ "type": "text", "text": "INV-2026-0817" },
{ "type": "text", "text": "besok sore" }
]
}
]
}
}Menerima pesan masuk dengan webhook
Untuk merespons balasan pelanggan — dan untuk tahu bahwa jendela layanan baru saja terbuka — Anda berlangganan webhook. Meta pertama-tama memanggil endpoint Anda dengan request GET untuk memverifikasinya terhadap token yang Anda tetapkan, lalu mengirim setiap pesan masuk dan update status pengiriman sebagai POST yang ditandatangani dengan header X-Hub-Signature-256, yang sebaiknya Anda cocokkan dengan app secret. Balas dengan HTTP 200 secepatnya: untuk respons lain Meta akan mengulang pengiriman hingga 7 hari, dan pengulangan itu bisa datang sebagai duplikat, jadi lakukan deduplikasi berdasarkan ID pesan. Lakukan proses berat di antrean (queue), bukan langsung di dalam handler webhook.
// Express webhook: verification (GET) + inbound handling (POST)
app.get("/webhook", (req, res) => {
const mode = req.query["hub.mode"];
const token = req.query["hub.verify_token"];
const challenge = req.query["hub.challenge"];
if (mode === "subscribe" && token === process.env.VERIFY_TOKEN) {
return res.status(200).send(challenge);
}
return res.sendStatus(403);
});
app.post("/webhook", (req, res) => {
res.sendStatus(200); // ack immediately, then process
const value = req.body.entry?.[0]?.changes?.[0]?.value;
const message = value?.messages?.[0];
if (message) {
// Customer messaged us -> 24-hour service window is now open
enqueue({ from: message.from, text: message.text?.body });
}
});Kategori template dan pricing per-pesan
Sejak 1 Juli 2025, Meta menagih per pesan, bukan lagi per percakapan: Anda membayar setiap kali pesan template terkirim, dan tarifnya bergantung pada kategori template serta kode negara nomor penerima. Pesan non-template, yang hanya bisa dikirim di dalam jendela layanan pelanggan yang terbuka, gratis, dan template utility yang terkirim di dalam jendela terbuka juga gratis. Indonesia (+62) punya tarif tersendiri di rate card Meta, yang juga diterbitkan dalam rupiah, dan volume bulanan yang lebih tinggi membuka tarif utility dan authentication yang lebih rendah. Jika Anda membalas dalam 24 jam pelanggan yang datang lewat iklan Click to WhatsApp atau tombol Halaman Facebook di aplikasi ponsel, terbuka jendela free entry point selama 72 jam yang membuat semua pesan gratis. Cek rate card terbaru sebelum menyusun anggaran, karena Meta memperbaruinya secara berkala.
| Kategori | Pemakaian umum | Ditagih? |
|---|---|---|
| Marketing | Promo, newsletter, pengingat keranjang | Ditagih per pesan terkirim |
| Utility | Update pesanan, struk, pengingat tagihan | Gratis di dalam jendela 24 jam, selebihnya ditagih |
| Authentication | Kode OTP dan verifikasi login | Ditagih; bisnis yang berbasis di luar Indonesia bisa dikenai tarif authentication-international |
| Service | Balasan Anda ke pelanggan di dalam jendela 24 jam | Gratis |
Rancang alur agar update transaksional terkirim saat jendela masih terbuka. Jika pelanggan baru saja memesan lewat chat, mengirim update pengiriman sebagai pesan utility di dalam jendela itu tidak berbiaya — penghematan nyata pada volume khas Indonesia.
Aturan opt-in dan kepatuhan
Meta mewajibkan opt-in sebelum Anda mengirim pesan ke siapa pun. Pelanggan harus setuju menerima pesan dari bisnis Anda, dan permintaan persetujuan harus menyebut nama bisnis Anda dengan jelas. Sejak pembaruan kebijakan Meta pada November 2024, opt-in tidak lagi harus menyebut WhatsApp secara spesifik, asalkan mematuhi hukum setempat, dan di Indonesia hukum itu mencakup UU PDP. Nomor telepon yang terkait dengan pelanggan yang dikenali termasuk data pribadi menurut UU ini, pemrosesannya butuh dasar hukum seperti persetujuan eksplisit (Pasal 20), persetujuan harus tertulis atau terekam (Pasal 22), dan Anda wajib bisa menunjukkan bukti persetujuan itu (Pasal 24). Simpan jejak persetujuan; Anda akan membutuhkannya jika pelanggan mempersoalkan sebuah pesan.
- Ambil opt-in di kanal yang sudah dipakai pelanggan — checkout web, aplikasi, atau formulir fisik Anda.
- Nyatakan dengan jelas bahwa mereka setuju menerima pesan dari bisnis Anda dan sebut nama bisnisnya; menyebut bahwa pesan akan datang lewat WhatsApp tidak lagi diwajibkan Meta, tapi mencegah pelanggan kaget.
- Hormati opt-out dengan segera dan simpan daftar berhenti agar Anda tidak pernah mengirim ke nomor yang berhenti berlangganan.
- Jaga kualitas tetap tinggi: blokir, laporan, dan mute dari pengguna menurunkan quality rating Anda, dan kualitas rendah yang berlangsung lama membuat pengiriman Anda dibatasi.
Digabungkan, inilah pipeline yang saya percayai di produksi: template yang disetujui untuk peringatan keluar, webhook yang mengubah pelanggan ke jendela layanan gratis, pengiriman yang sadar kategori untuk mengendalikan biaya, dan catatan persetujuan yang menjaga kepatuhan. Setup-nya memang lebih banyak daripada library scraper, tapi inilah satu-satunya versi yang bertahan menghadapi trafik nyata di Indonesia.

