Panduan pembalasan.id
Integrasi & Otomasi

Webhook

Kirim setiap kejadian di akun Anda ke URL eksternal untuk diproses sistem lain.

Webhook adalah pemberitahuan satu arah. Setiap kali terjadi sesuatu di akun Anda — pesan masuk, percakapan baru, status berubah — pembalasan.id mengirim data kejadian itu sebagai HTTP POST ke URL yang Anda daftarkan. Sistem Anda menerima, lalu memprosesnya sendiri.

Webhook tidak bisa membalas atau mengubah apa pun di percakapan. Untuk itu, gunakan Agent Bot.

Kapan dipakai

  • Mencatat percakapan/pesan baru ke Google Sheets, CRM, atau database Anda.
  • Mengirim notifikasi internal (Slack, Telegram tim) saat pelanggan menghubungi.
  • Mengalirkan data ke dashboard analitik atau alat otomasi (n8n, Zapier, Make).

Event yang tersedia

Saat membuat webhook, Anda memilih event mana saja yang ingin diterima:

EventDikirim ketika
conversation_createdPercakapan baru dibuat
conversation_updatedDetail percakapan berubah
conversation_status_changedStatus berubah (Terbuka, Selesai, Tunda, Snooze)
message_createdAda pesan baru (masuk atau keluar)
message_updatedPesan diperbarui
contact_createdKontak baru dibuat
contact_updatedData kontak berubah
webwidget_triggeredPengunjung membuka live chat di situs Anda
inbox_createdInbox baru dibuat
inbox_updatedPengaturan inbox berubah
conversation_typing_on / conversation_typing_offPelanggan mulai / berhenti mengetik

Cara membuat

Buat webhook lewat API dengan menyertakan url tujuan dan daftar subscriptions (event yang ingin diterima):

curl -X POST 'https://api-c6tw.pembalasan.id/api/v1/accounts/{account_id}/webhooks' \
  -H 'api_access_token: TOKEN_ANDA' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://sistem-anda.com/webhook",
    "subscriptions": ["conversation_created", "message_created"]
  }'

Lihat detail lengkap di referensi API: Add a webhook.

Setiap webhook punya secret yang dipakai untuk menandatangani (sign) tiap kiriman. Verifikasi tanda tangan ini di sisi server Anda untuk memastikan request benar-benar berasal dari pembalasan.id.

Verifikasi tanda tangan (HMAC)

Agar yakin request benar-benar dari pembalasan.id (bukan pihak lain), verifikasi tanda tangan pada setiap kiriman. Setiap POST membawa header berikut:

HeaderIsi
X-Chatwoot-Signaturesha256=<hmac> — tanda tangannya
X-Chatwoot-TimestampWaktu kirim (unix), ikut ditandatangani
X-Chatwoot-DeliveryID unik pengiriman (untuk mencegah proses ganda)

Tanda tangan dihitung dengan HMAC-SHA256, memakai secret webhook sebagai kunci atas gabungan timestamp + titik + body mentah:

sha256=HMAC_SHA256( secret, timestamp + "." + body_mentah )

secret diambil dari record webhook (field secret pada response API webhook).

Gunakan body mentah persis seperti diterima. Jangan parse JSON lalu susun ulang — perubahan spasi atau urutan kunci akan membuat tanda tangan tidak cocok.

Contoh di Next.js (Route Handler):

import crypto from 'crypto';

export async function POST(req) {
  const rawBody = await req.text(); // mentah, sebelum JSON.parse
  const signature = req.headers.get('x-chatwoot-signature');
  const timestamp = req.headers.get('x-chatwoot-timestamp');

  const expected =
    'sha256=' +
    crypto
      .createHmac('sha256', process.env.WEBHOOK_SECRET)
      .update(`${timestamp}.${rawBody}`)
      .digest('hex');

  const a = Buffer.from(signature ?? '');
  const b = Buffer.from(expected);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return new Response('invalid signature', { status: 401 });
  }

  const payload = JSON.parse(rawBody);
  // ...proses event...
  return Response.json({ ok: true });
}

Bandingkan tanda tangan dengan fungsi constant-time (timingSafeEqual, hash_equals), bukan ===, untuk mencegah timing attack. Anda juga bisa menolak request yang timestamp-nya terlalu lama untuk mencegah serangan replay.

Bentuk data yang dikirim

Setiap kiriman berisi nama event dan data terkait. Contoh ringkas untuk message_created:

{
  "event": "message_created",
  "id": 12345,
  "content": "Halo, apakah masih buka?",
  "message_type": "incoming",
  "conversation": { "id": 678, "status": "open" },
  "sender": { "name": "Budi", "email": null }
}

Webhook hanya memberi tahu. Jika Anda butuh sesuatu yang membalas otomatis atau mengubah status percakapan, gunakan Agent Bot.

On this page