Integrasi WhatsApp Business Cloud API Resmi untuk Pasar Indonesia

Foto oleh Wikimedia Commons contributor (CC0)
Tidak. Cloud API di-hosting oleh Meta dan Anda bisa berintegrasi langsung lewat dashboard Meta Developer dan Graph API. BSP bisa mempermudah onboarding, penagihan dalam Rupiah, dan dukungan, tapi sifatnya opsional. Banyak tim di Indonesia mulai secara langsung dan beralih ke BSP hanya saat butuh invoicing lokal atau tooling tingkat lanjut.
Hanya dengan template pesan yang sudah disetujui. Pesan bebas hanya diizinkan di dalam jendela layanan pelanggan 24 jam yang terbuka saat pelanggan mengirim pesan ke Anda. Di luar jendela itu, template adalah satu-satunya cara untuk memulai kontak.
Sejak Juli 2025 Meta menagih per pesan template yang terkirim, dengan tarif berbeda per kategori. Pesan layanan di dalam jendela 24 jam yang terbuka gratis, dan template utility yang dikirim di dalam jendela terbuka juga gratis. Template marketing dan authentication ditagih per pesan, jadi cek rate card Indonesia terbaru sebelum menyusun anggaran.
Library seperti itu adalah klien hasil reverse-engineering yang melanggar Ketentuan Layanan WhatsApp. Mereka rusak setiap kali WhatsApp memperbarui klien web-nya dan sering membuat nomor pengirim diblokir permanen, yang menjatuhkan seluruh alur notifikasi Anda. Untuk sistem produksi apa pun, Cloud API resmi adalah satu-satunya pilihan andal.
Ya. Meta mewajibkan opt-in eksplisit yang menyebut WhatsApp secara spesifik, dan ini selaras dengan UU PDP di Indonesia yang memperlakukan nomor telepon sebagai data pribadi. Catat kapan dan bagaimana setiap pelanggan memberi persetujuan, dan hormati opt-out dengan segera lewat daftar berhenti.

Foto oleh Wikimedia Commons contributor (CC0)
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, buka jendela layanan 24 jam gratis saat pelanggan membalas, terima pesan masuk lewat webhook, dan siapkan anggaran untuk pricing per-pesan yang berbeda per kategori (marketing, utility, authentication, service).
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.
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 yang melanggar Ketentuan Layanan WhatsApp. Dalam praktiknya mereka rusak setiap kali WhatsApp memperbarui klien web-nya dan — lebih parah — sering membuat nomor pengirim diblokir. Untuk pipeline notifikasi bisnis, nomor yang diblokir 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, tanpa risiko ban | Risiko tinggi nomor diblokir |
| Kepatuhan | Review template dan opt-in ditegakkan | Tanpa pengaman, ada risiko hukum nyata |
| Skala | Rate limit resmi, ribuan pesan per hari | Satu sesi yang rapuh, mudah ditandai |
| Dukungan | Dokumentasi Meta plus dukungan BSP | Hanya komunitas, tanpa bantuan saat rusak |
Nomor WhatsApp yang diblokir sering kali permanen dan menjatuhkan seluruh alur notifikasi Anda tanpa peringatan sama sekali. Penghematan biaya dari library tidak resmi tidak sebanding dengan risiko operasional itu pada sistem produksi.
Setiap pesan yang Anda kirim ke pelanggan yang belum pernah menghubungi Anda lebih dulu wajib memakai template yang sudah disetujui. Anda membuat template sekali lewat Graph API, Meta meninjaunya (biasanya dalam hitungan menit, maksimal 24 jam), dan baru setelah itu Anda bisa mengirimnya. 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/v21.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}}."
}
]
}Tulis template dalam Bahasa Indonesia sejak awal dan beri setiap template akhiran locale pada namanya (misalnya akhiran id). Persetujuan bersifat per bahasa, dan mencampur Inggris dengan Indonesia dalam satu isi template memperlambat review serta terasa tidak natural bagi pelanggan Indonesia.
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.
Semua pesan keluar menuju satu endpoint. Anda butuh phone number ID dari dashboard Meta, access token permanen, dan nomor penerima dalam format E.164 — untuk Indonesia berarti kode negara 62 tanpa angka nol di depan dan tanpa tanda plus, jadi nomor yang diawali 0812 menjadi 62812. Parameter body mengisi placeholder template sesuai urutan.
// POST https://graph.facebook.com/v21.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" }
]
}
]
}
}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. Selalu balas dengan HTTP 200 secepatnya, kalau tidak Meta akan mengulang dan Anda mendapat pengiriman ganda. 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 });
}
});Sejak 1 Juli 2025, Meta beralih dari model lama berbasis percakapan ke pricing per-pesan: Anda ditagih setiap kali sebuah pesan template terkirim, dan tarifnya bergantung pada kategori template serta kode negara penerima. Yang penting, pesan layanan yang Anda kirim di dalam jendela 24 jam yang terbuka adalah gratis, dan sejak perubahan yang sama, template utility yang terkirim di dalam jendela terbuka juga gratis. Untuk nomor Indonesia, pesan utility dan authentication ditagih dengan tarif per-pesan yang relatif kecil — verifikasi rate card Indonesia terbaru sebelum menyusun anggaran, karena Meta menyesuaikannya 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 (tarif Authentication-International di Indonesia) |
| 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.
Meta mewajibkan opt-in eksplisit sebelum Anda mengirim pesan ke siapa pun. Pelanggan harus secara aktif setuju menerima pesan WhatsApp dari bisnis Anda, opt-in harus menyebut WhatsApp secara spesifik, dan Anda wajib mencatat kapan serta bagaimana persetujuan itu diperoleh. Ini bukan sekadar aturan Meta — ini selaras dengan UU Perlindungan Data Pribadi (UU PDP) Indonesia, yang memperlakukan nomor telepon sebagai data pribadi yang butuh dasar hukum. Simpan jejak persetujuan; Anda akan membutuhkannya jika pelanggan komplain atau jika Meta mengaudit quality rating Anda.
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.