For the complete documentation index, see llms.txt. This page is also available as Markdown.

Contoh Use Case

5 contoh kode siap pakai untuk notifikasi pesanan, OTP login, laporan ke grup, balas otomatis, dan sinkron data pelanggan.

Berikut 5 contoh kebutuhan yang paling sering dikerjakan dengan WatZap SDK. Klik salah satu untuk melihat penjelasan dan kodenya.

Semua contoh menganggap Kamu sudah mengikuti Instalasi & Kirim Pesan Pertama. Sesuaikan nomor, nama template, dan data lainnya dengan milik Kamu.

1. Notifikasi Pesanan & Cek Status Terkirim (WABA)

Cocok untuk: toko online, marketplace, dan layanan pengiriman.

Kirim kabar ke pelanggan saat pesanan dikirim, lengkap dengan nomor resi. Karena pelanggan belum tentu chat dalam 24 jam terakhir, gunakan template yang sudah disetujui Meta.

Kirim notifikasi:

import { WatZap } from '@watzapid/sdk'

const wz = new WatZap()
const pesanan = { noHp: '081234567890', nama: 'Budi', nomorPesanan: 'ORD-001', resi: 'JP1234567890' }

// Template "pesanan_dikirim": "Halo {{1}}, pesanan {{2}} sudah dikirim. No. resi: {{3}}"
const hasil = await wz.whatsapp.messages.sendTemplate({
  to: pesanan.noHp,
  template: 'pesanan_dikirim',
  language: 'id',
  variables: [pesanan.nama, pesanan.nomorPesanan, pesanan.resi], // isi {{1}}, {{2}}, {{3}}
})

// Simpan hasil.id bersama data pesanan untuk mengecek status nanti
console.log('ID pesan:', hasil.id)
  • Template dengan variabel angka seperti {{1}} dan {{2}} diisi dengan array sesuai urutan.

  • Template dengan variabel bernama seperti {{nama_pelanggan}} diisi dengan objek, contohnya variables: { nama_pelanggan: 'Budi' }.

  • Nama template harus sama persis dengan yang ada di WatZap. Cara membuatnya ada di Cara Membuat Template WABA Official.

Cek status beberapa saat kemudian:

import { WatZap } from '@watzapid/sdk'

const wz = new WatZap()
const idPesan = 'wamid.HBgM...' // ID yang disimpan saat mengirim

const cek = await wz.whatsapp.messages.status(idPesan)
console.log(cek.status) // 'sent', 'delivered', 'read', atau 'failed'
if (cek.status === 'failed') console.log('Alasan gagal:', cek.error)

Status pengiriman hanya tersedia untuk pesan WABA. Pesan Unofficial tidak punya ID pesan maupun status terkirim.

2. Kirim Kode OTP Login (WABA)

Cocok untuk: aplikasi dan website yang perlu memverifikasi nomor HP saat login atau daftar.

import { WatZap } from '@watzapid/sdk'
const wz = new WatZap()
const noHp = '081234567890'
const kode = String(Math.floor(100000 + Math.random() * 900000)) // contoh: 6 digit acak

await wz.whatsapp.messages.sendTemplate({
  to: noHp,
  template: 'kode_login', // template kategori AUTHENTICATION
  language: 'id',
  otpCode: kode,
})

Gunakan template kategori Authentication. Cara membuatnya ada di Membuat Template Authentication atau OTP. Simpan kode OTP di server Kamu untuk dicocokkan saat pengguna memasukkannya.

3. Kirim Laporan Harian ke Grup WhatsApp Tim (Unofficial)

Cocok untuk: sistem internal, gudang, dan tim operasional.

Pesan ke grup hanya bisa dikirim lewat nomor Unofficial, dan nomor tersebut harus sudah menjadi anggota grupnya.

import { WatZap } from '@watzapid/sdk'

const wz = new WatZap()
const nomor = wz.unofficial.device(process.env.WATZAP_NUMBER_KEY)

// Cari grup berdasarkan namanya
const daftarGrup = await nomor.groups.list()
const grupTim = daftarGrup.find((grup) => grup.name === 'Tim Gudang')
if (!grupTim) throw new Error('Grup "Tim Gudang" tidak ditemukan')

await nomor.groups.sendText({
  groupId: grupTim.id,
  text: 'Laporan hari ini: 25 pesanan dikirim, 3 menunggu pembayaran.',
})

Jalankan kode ini secara terjadwal (misalnya dengan cron) supaya laporan terkirim otomatis setiap hari.

4. Balas Otomatis Pesan Masuk (WABA)

Cocok untuk: customer service yang sering menerima pertanyaan yang sama.

Langkah 1: daftarkan URL webhook. Cukup dilakukan sekali:

import { WatZap } from '@watzapid/sdk'
const wz = new WatZap()

// Lihat WABA ID dari daftar nomor pengirim
const pengirim = await wz.senders.list()
const waba = pengirim.find((nomor) => nomor.type === 'waba')
if (!waba) throw new Error('Belum ada nomor WABA yang terhubung')

await wz.whatsapp.webhook(waba.wabaId).set('https://tokoku.com/webhook/watzap-x7k29q')

Langkah 2: siapkan endpoint untuk menerima pesan. Contoh ini memakai Express (npm install express):

import express from 'express'
import { WatZap, isWabaWebhook } from '@watzapid/sdk'

const wz = new WatZap()
const app = express()
app.use(express.json())

app.post('/webhook/watzap-x7k29q', async (req, res) => {
  res.sendStatus(200) // langsung balas 200 supaya server WatZap tidak menunggu

  const payload = req.body
  if (!isWabaWebhook(payload)) return // contoh ini khusus pesan masuk WABA

  const { phone, message_text } = payload.data
  console.log(`Pesan dari ${phone}: ${message_text}`)

  if (message_text?.trim().toLowerCase() === 'jam buka') {
    try {
      // Pelanggan baru saja chat, jadi pesan teks biasa boleh dikirim (masih dalam 24 jam)
      await wz.whatsapp.messages.sendText({ to: phone, text: 'Kami buka setiap hari pukul 08.00–17.00 WIB 😊' })
    } catch (err) {
      console.error('Gagal membalas:', err)
    }
  }
})

app.listen(3000, () => console.log('Webhook siap di port 3000'))

Untuk nomor Unofficial, daftarkan webhook dengan wz.unofficial.device(numberKey).webhook.set(url). Isi pesannya ada di payload.data.message_body. Webhook Unofficial juga terkirim untuk pesan yang dikirim dari nomor itu sendiri (is_from_me: true), jadi abaikan pesan tersebut supaya bot tidak membalas dirinya sendiri.

5. Sinkronkan Data Pelanggan ke List

Cocok untuk: CRM, sistem membership, dan toko online yang ingin mengirim broadcast dari dashboard.

Setiap ada pelanggan baru atau data berubah di aplikasi Kamu, simpan juga ke List WatZap.

import { WatZap } from '@watzapid/sdk'
const wz = new WatZap()
const pelanggan = { id: 123, nama: 'Andi', noHp: '081234567890', kota: 'Solo' }

// Sekali saja: lihat ID list yang ada di akun Kamu
const { items } = await wz.lists.list()
console.log(items.map((list) => `${list.listId}  ${list.name}`))

// Setiap ada pelanggan baru atau data berubah
await wz.lists.subscribers.upsert('LIST_ID', {
  externalId: `pelanggan-${pelanggan.id}`, // ID dari database Kamu, supaya tidak dobel
  phone: pelanggan.noHp,
  name: pelanggan.nama,
  customFields: { kota: pelanggan.kota },
})
  • Data dicocokkan lewat externalId, lalu nomor HP, lalu email. Kalau sudah ada, data lama diperbarui sehingga tidak dobel.

  • Field yang tidak dikirim tetap dipertahankan.

  • Nama custom field baru (seperti kota) otomatis ditambahkan ke List.

  • Untuk banyak data sekaligus, gunakan wz.lists.subscribers.bulkUpsert(listId, daftar) (maksimal 500 data per panggilan).

Melihat semua subscriber di List:

import { WatZap } from '@watzapid/sdk'

const wz = new WatZap()

// Ambil semua subscriber di List, halaman demi halaman secara otomatis
for await (const subscriber of wz.lists.subscribers.list('LIST_ID')) {
  console.log(subscriber.name, subscriber.phone)
}

for await mengambil semua data halaman demi halaman secara otomatis, jadi Kamu tidak perlu mengurus nomor halaman.