Dokumentasi Wazent
Wazent adalah Team Inbox WhatsApp untuk bisnis dengan banyak nomor, banyak cabang, dan banyak CS: semua chat masuk ke satu dashboard, terbagi rapi antar admin, riwayatnya tersimpan, dan mutu layanan tim terpantau — berjalan di atas WhatsApp Business API resmi dari Meta.
Panduan di bawah dibagi dua: Bagian 1 untuk memakai Wazent sehari-hari, dan Bagian 2 untuk tim teknis yang ingin menyambungkan sistem sendiri lewat API — opsional, tidak perlu dibaca kalau Anda hanya memakai dashboard.
1. Mulai cepat
Empat langkah ini juga muncul sebagai daftar centang di halaman depan dashboard Anda, dan hilang sendiri begitu semuanya beres.
- Hubungkan WhatsApp. Sambungkan nomor WhatsApp Business Anda lewat jendela resmi Meta di halaman Hubungkan WhatsApp. Nomor tetap milik Anda — Wazent tidak memindahkannya.
- Aktifkan langganan. Pilih paket di halaman Langgananagar tim bisa mengirim & membalas pesan.
- Undang tim CS. Buat akun untuk CS/agen di halaman Tim, atur perannya dan cabang mana yang boleh mereka tangani.
- Kirim pesan uji. Kirim satu pesan ke nomor Anda sendiri untuk membuktikan sambungan sudah jalan.
2. Inbox — kerja harian CS
Inbox adalah tempat tim Anda bekerja setiap hari. Semua percakapan dari semua nomor dan semua cabang masuk ke satu layar — tak perlu lagi berpindah HP atau browser.
2.1 Pembagian chat — anti balasan dobel
Tiap percakapan menunjukkan siapa yang menanganinya: "Belum ditangani" atau "Dipegang [nama CS]". CS bisa mengambil percakapan, dan supervisor bisa menugaskannya ke anggota lain. Rekan satu tim melihat status yang sama, sehingga dua orang tidak membalas chat yang sama.
2.2 Membalas
- Balasan teks biasa.
- Foto, video, dokumen, dan pesan suara — dikirim maupun diterima.
- Balasan Cepat — jawaban yang sering dipakai, disiapkan sekali lalu dipilih dari composer. Dikelola supervisor di Balasan Cepat, tapi tombolnya tersedia untuk semua CS.
- Pesan interaktif — kirim pilihan bertombol supaya pelanggan tinggal menekan, bukan mengetik.
- Flow — kirim formulir interaktif WhatsApp (lihat bagian Bot otomatis & Flows).
- Template — dipakai saat window 24 jam tutup (lihat bagian berikutnya).
2.3 Hal lain yang perlu diketahui
- Pesan masuk muncul otomatis tanpa perlu menyegarkan halaman.
- Riwayat percakapan tersimpan dan tetap bisa dibuka serta diekspor walau langganan sedang tidak aktif.
- Chat baru bisa dikirim sebagai notifikasi ke Telegram tiap CS — lihat bagian 8.
3. Window 24 jam & template
Ini aturan Meta, bukan batasan Wazent — dan ini alasan paling sering kenapa sebuah chat tiba-tiba tidak bisa dibalas dengan teks biasa. Semua CS sebaiknya memahaminya.
3.1 Aturannya
Anda hanya boleh mengirim pesan bebas (teks/media) dalam 24 jam sejak pelanggan terakhir membalas. Setiap balasan pelanggan me-reset jendela 24 jam itu.
3.2 Kapan boleh apa
- Window terbuka → pesan bebas (teks/media) boleh.
- Window tutup, atau pelanggan belum pernah chat → pesan bebas ditolak; wajib template.
- Template selalu boleh — termasuk untuk memulai percakapan.
3.3 Yang Anda lihat di Inbox
Tiap percakapan menampilkan status window-nya. Saat masih terbuka: "Pelanggan membalas dalam 24 jam terakhir — kamu bisa kirim pesan teks biasa." Saat sudah lewat, composer mengarahkan Anda memakai template. Wazent memeriksanya sebelum pesan diteruskan ke Meta, jadi Anda mendapat penjelasan yang jelas — bukan kode error mentah.
3.4 Solusinya: template
Buat dan ajukan template di halaman Template. Template harus disetujui Meta lebih dulu (prosesnya asinkron — status berubah dari PENDING menjadi APPROVED atau REJECTED). Sesudah disetujui, template bisa dipakai kapan saja tanpa terpengaruh window.
3.5 Lewat API
Bila Anda mengirim lewat API, window yang tutup dijawab 409 window_closed — bukan error mentah Meta (131047):
{
"error": "window_closed",
"message": "Window 24 jam sudah tutup. Pelanggan harus membalas dulu, atau kirim pakai pesan template (type: \"template\").",
"window": { "open": false, "expires_at": null }
}expires_at = waktu kedaluwarsa window bila ada percakapan; null bila pelanggan belum pernah chat.
4. Tim, peran & cabang
4.1 Tiga peran
| Peran | Untuk siapa | Yang bisa diakses |
|---|---|---|
| Owner | Pemilik akun bisnis | Semuanya — termasuk Tim, Langganan, API Keys, Webhook, dan Log Audit. |
| Manager | Supervisor tim CS | Inbox, Kontak, Broadcast, Balasan Cepat, Bot, Flows, Pemantauan & Kesehatan Akun, Log Pesan, Hubungkan WhatsApp. |
| Agen (CS) | CS yang membalas chat | Inbox, Template, Pengaturan akun sendiri, Notifikasi Telegram. |
Owner membuat akun CS di halaman Tim, lalu memberikan sandi sementara kepada CS untuk login pertama.
4.2 Cabang
Punya beberapa outlet? Buat cabang, tugaskan tiap nomor WhatsApp ke cabangnya, lalu tentukan agen mana yang boleh menangani cabang mana. Agen hanya melihat percakapan cabang yang menjadi tanggung jawabnya; manager dan owner melihat semuanya.
4.3 Kuota akun CS
- Tiap nomor WhatsApp berbayar sudah termasuk 3 akun CS. Punya 3 nomor berarti 9 akun CS.
- Akun owner tidak dihitung — 1 nomor berarti owner plus 3 CS.
- Kuota dihitung dari akun yang aktif. Kalau ada CS yang keluar, hapus akunnya dan kuotanya langsung bebas untuk penggantinya.
- Butuh lebih banyak? Tambah akun dari halaman Langganan — sekali bayar, berlaku selamanya, tidak ikut siklus perpanjangan.
5. Bot otomatis & Flows
5.1 Bot balas otomatis
Bot Otomatis membalas pertanyaan umum tanpa menunggu CS — berguna di luar jam kerja atau saat chat menumpuk. Anda menyusun alurnya sendiri di kanvas bot, per nomor WhatsApp.
5.2 Jawaban AI dengan data Anda sendiri
Bot bisa dibantu AI supaya menjawab lebih luwes, dengan sumber data milik Anda:
- Google Sheets — mis. daftar harga atau stok, cukup perbarui isinya di spreadsheet.
- API sendiri — bot mengambil data dari sistem Anda saat menjawab.
Keduanya boleh aktif bersamaan. Bila salah satu sumber sedang bermasalah, bot tetap menjawab dari sumber yang lain.
5.3 Serah-terima ke CS
Begitu percakapan perlu sentuhan manusia, bot menyerahkannya ke CS. Setelah CS diam beberapa saat (lamanya bisa Anda atur), bot mengambil alih lagi — jadi pelanggan tidak menggantung.
5.4 Flows
Flows adalah formulir interaktif resmi WhatsApp: pelanggan mengisi form di dalam chat (mis. pendaftaran atau pemesanan) tanpa dilempar ke browser. Flow bisa dikirim otomatis oleh bot atau manual oleh CS dari Inbox.
6. Broadcast
Broadcast mengirim pesan ke banyak pelanggan sekaligus lewat template resmi yang sudah disetujui Meta.
- Penyaring izin otomatis. Pelanggan yang menolak promosi atau masuk daftar blokir tidak akan dikirimi — dan itu diperiksa saat pesan benar-benar dikirim, bukan hanya saat antrean dibuat. Jadi pelanggan yang berhenti berlangganan di tengah proses tetap terlindungi.
- Nomor ganda disaring. Satu pelanggan menerima satu pesan, walau nomornya tercantum berkali-kali.
- Hormati batas Meta. Akun baru punya batas kirim harian yang rendah dan akan naik seiring reputasi nomor Anda membaik. Mengirim melebihi batas berisiko menurunkan mutu nomor — lihat Kesehatan Akun.
7. Kontak & izin
Kontak adalah direktori pelanggan Anda. Isinya terkumpul sendiri dari percakapan yang masuk — tidak perlu diketik manual.
- Nama pelanggan bisa Anda perbaiki sendiri, dan nama itu ikut tampil di Inbox serta notifikasi.
- Tag & segmen untuk mengelompokkan pelanggan.
- Izin (opt-in/opt-out) tercatat per pelanggan, dipakai otomatis sebagai penyaring saat broadcast.
- Daftar blokir untuk nomor yang tidak boleh dikirimi sama sekali.
8. Pemantauan, kesehatan & audit
8.1 Mutu layanan tim
Pemantauan menunjukkan kecepatan balasan tim dan chat yang belum tertangani — supervisi berdasar angka, bukan tebak-tebakan.
8.2 Kesehatan nomor
Kesehatan Akun merangkum sinyal dari Meta untuk tiap nomor: mutu (quality rating), batas kirim, dan apakah nomor sedang bisa dipakai mengirim. Mutu yang turun adalah peringatan dini sebelum Meta membatasi nomor Anda.
8.3 Riwayat & jejak
- Log Pesan — riwayat semua pesan (masuk, balasan CS, bot, broadcast, API) dengan penyaring dan ekspor CSV.
- Log Audit — khusus owner: jejak aksi akun, keamanan, dan data (siapa mengundang siapa, siapa mengubah apa). Tidak bisa diubah atau dihapus.
8.4 Notifikasi Telegram
Tiap CS bisa menautkan akun Telegram-nya di halaman Notifikasi Telegram supaya chat masuk terkirim sebagai notifikasi — berguna saat dashboard tidak sedang dibuka.
9. Langganan & kuota
- Biaya dihitung per nomor WhatsApp yang Anda pakai. Tambah atau kurangi jumlah nomor kapan saja dari halaman Langganan.
- Mengganti nomor di dalam jumlah yang sudah dibayar tidak dikenai biaya tambahan.
- Kuota akun CS mengikuti jumlah nomor (lihat bagian 4).
- Pembayaran diproses Midtrans; langganan aktif otomatis setelah pembayaran dikonfirmasi, dan faktur PDF dikirim ke email Anda.
- Langganan tidak diperpanjang otomatis. Anda akan diingatkan di dashboard sebelum masa aktif habis.
Biaya percakapan WhatsApp tidak termasuk. Meta menagihkannya langsung ke akun WhatsApp Business Anda sendiri sesuai tarif resmi mereka — Wazent tidak menambahkan markup di atasnya. Kalau langganan habis, pengiriman berhenti sementara, tetapi percakapan, kontak, dan riwayat tetap bisa dibuka dan diekspor.
A. Kirim Pesan (API)
Bagian ini opsional — hanya diperlukan bila tim teknis Anda ingin menyambungkan sistem sendiri (mis. toko online atau ERP) ke WhatsApp. Memakai dashboard saja tidak membutuhkan API key.
A1. Base URL
Semua permintaan dikirim ke alamat berikut:
https://api.wazent.idA2. Autentikasi
Sertakan API key Anda di header Authorization. Buat & kelola key di halaman API Keys (perlu login).
Authorization: Bearer WAZENT_API_KEY_ANDAA3. Kirim teks
POST /v1/messages/send — body (JSON):
{
"to": "6281234567890",
"type": "text",
"message": "Halo dari Wazent!"
}type opsional untuk teks (default text). Tambahkan "preview_url": true untuk menampilkan pratinjau link. Contoh dengan curl:
curl -X POST https://api.wazent.id/v1/messages/send \
-H "Authorization: Bearer WAZENT_API_KEY_ANDA" \
-H "Content-Type: application/json" \
-d '{"to":"6281234567890","type":"text","message":"Halo dari Wazent!"}'A4. Kirim media
Tipe image, video, audio, dan document dikirim lewat url (https, publik) — Meta yang mengambil file dari URL tersebut.
{
"to": "6281234567890",
"type": "image",
"url": "https://contoh.com/promo.jpg",
"caption": "Promo bulan ini!"
}{
"to": "6281234567890",
"type": "document",
"url": "https://contoh.com/invoice.pdf",
"filename": "invoice-1234.pdf",
"caption": "Faktur Anda"
}{
"to": "6281234567890",
"type": "audio",
"url": "https://contoh.com/voice.ogg"
}caption— opsional untukimage/video/document(maks 1024 karakter). Tidak berlaku untukaudio.filename— opsional, hanya untukdocument.
A5. Kirim template
Pesan template selalu boleh dikirim — termasuk untuk memulai percakapan (lihat bagian 3). Pakai nama template yang sudah disetujui Meta.
{
"to": "6281234567890",
"type": "template",
"template": {
"name": "order_update",
"language": "id",
"components": [
{ "type": "body", "parameters": [ { "type": "text", "text": "1234" } ] }
]
}
}language = kode bahasa Meta (mis. id, en_US). components opsional (untuk parameter), diteruskan apa adanya ke Meta.
A6. Respons sukses
{
"status": "sent",
"to": "6281234567890",
"type": "image",
"message_id": "wamid.HBgN..."
}A7. Kode error
| HTTP | error | Arti |
|---|---|---|
| 401 | unauthorized | API key tidak ada / tidak valid / sudah di-revoke. |
| 402 | subscription_inactive | Langganan tidak aktif. |
| 402 | subscription_expired | Langganan sudah kedaluwarsa. |
| 400 | no_whatsapp | Belum ada WhatsApp yang terhubung. |
| 400 | bad_request | Body bukan objek JSON, atau JSON rusak. |
| 400 | unsupported_type | "type" di luar text/image/video/audio/document/template. |
| 400 | invalid_to | Nomor tujuan salah (harus digit 8–15, format internasional). |
| 400 | invalid_message | Teks kosong atau lebih dari 4096 karakter. |
| 400 | invalid_url | 'url' media bukan https valid / terlalu panjang. |
| 400 | invalid_caption | Caption >1024 karakter, atau caption pada audio. |
| 400 | invalid_filename | 'filename' pada tipe non-document / terlalu panjang. |
| 400 | invalid_template | 'template.name'/'language' salah, atau 'components' bukan array. |
| 409 | window_closed | Window 24 jam tutup — kirim pakai template (lihat bagian 3). |
| 429 | rate_limited | Terlalu banyak permintaan; tunggu sesuai header Retry-After. |
| 502 | send_failed | Meta menolak pengiriman (lihat pesan detail). |
A8. Batas permintaan (rate limit)
- Per API key: maksimal 600 permintaan / 60 detik.
- Per IP hanya saat autentikasi gagal: 5 / 10 detik (anti brute-force — pemakaian normal tidak menyentuh batas ini).
- Jika melebihi batas: 429
rate_limited+ headerRetry-After(detik untuk menunggu).
A9. Cek status layanan
GET /health — untuk memastikan layanan hidup.
{ "ok": true, "service": "wazent-api" }B. Terima Pesan (Webhook)
B1. Atur tujuan webhook
Di halaman Webhook dashboard: isi URL webhook (https) dan Generate signing secret (whsec_…— salin & simpan). Setiap pesan masuk dari pelanggan akan diteruskan (POST) ke URL itu, ditandatangani agar bisa Anda verifikasi.
B2. Format payload
Wazent mengirim POST dengan body JSON berikut:
{
"event": "message",
"phone_number_id": "1191635700691087",
"conversation_id": "0e6f3b2a-....-uuid",
"from": "6281234567890",
"message": {
"id": "wamid.HBgN...",
"type": "text",
"content": "Halo, saya mau tanya",
"raw": { "...": "objek message mentah dari Meta (fidelity penuh)" }
},
"window": { "open": true, "expires_at": "2026-06-18T12:00:00.000Z" },
"timestamp": "2026-06-18T11:00:00.000Z"
}| Field | Arti |
|---|---|
phone_number_id | ID nomor WABA bisnis (tujuan pesan masuk). |
conversation_id | ID percakapan di Wazent (stabil per pelanggan). |
from | Nomor pelanggan pengirim. |
message.content | Isi teks bila ada; null untuk tipe non-teks. |
message.raw | Objek message asli dari Meta (untuk media, lokasi, dll). |
window | Status window 24 jam saat pesan diterima (lihat bagian 3). |
B3. Verifikasi tanda tangan
Tiap request membawa header X-Wazent-Signature: sha256=<hex> = HMAC-SHA256 atas raw body (string mentah, sebelum di-parse) memakai webhook_secret Anda. Hitung ulang lalu bandingkan secara timing-safe. ⚠️ Wajib pakai raw body — bukan hasil serialisasi ulang JSON.
Node.js (Express):
const crypto = require("crypto");
// Simpan raw body:
// app.use(express.json({ verify: (req, _res, buf) => { req.rawBody = buf; } }));
function verifyWazent(rawBody, header, secret) {
const expected =
"sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(header || "");
const b = Buffer.from(expected);
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
// app.post("/webhook", (req, res) => {
// if (!verifyWazent(req.rawBody, req.get("X-Wazent-Signature"), SECRET))
// return res.sendStatus(401);
// res.sendStatus(200); // balas cepat, proses async
// });PHP:
<?php
$raw = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_WAZENT_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $raw, $secret);
if (hash_equals($expected, $header)) {
http_response_code(200); // sah — balas cepat
} else {
http_response_code(401);
}B4. Praktik baik
- Balas 2xx secepatnya; proses berat lakukan asinkron.
- Tangani kemungkinan kiriman ganda secara idempoten lewat
message.id(wamid).