Panduan/Untuk developer

Integrasi n8n dengan WhatsApp Business API: otomasi tanpa koding lewat WACO

Sambungkan WhatsApp ke n8n, Make, atau Zapier: terima pesan lewat webhook, balas lewat API. Workflow n8n siap impor, lengkap dengan verifikasi tanda tangan dan anti-dobel. 6 menit baca

n8n, Make, dan Zapier hanya butuh dua hal untuk berbicara dengan WhatsApp lewat WACO — dan keduanya sudah ada di setiap langganan: webhook yang mengirim tiap pesan masuk ke alur Anda, dan API untuk membalas atau mengirim template. Tidak ada node khusus yang harus dipasang; node Webhook dan HTTP Request bawaan cukup. Panduan ini memakai n8n sebagai contoh; pola yang sama berlaku untuk Make dan Zapier.

Apa yang bisa dibuat: balas otomatis saat pelanggan menyebut kata tertentu, catat setiap chat masuk ke Google Sheets atau Notion, kirim pesan WhatsApp saat ada order baru di toko online, notifikasi tim ke Slack/Telegram saat pesan gagal terkirim, atau menyambungkan WhatsApp ke ERP/CRM yang belum punya integrasi resmi.

Yang Anda butuhkan

Langkah 1 — Impor workflow contoh

Salin JSON di bawah, lalu di n8n pilih Workflows → Import from clipboard. Isinya tiga node: Webhook menerima event WACO, Code memverifikasi tanda tangan dan menyaring, HTTP Request membalas lewat API WACO. Contoh logikanya: bila pelanggan menyebut "harga", kirim tautan daftar harga.

{
  "name": "WACO → n8n: balas otomatis",
  "nodes": [
    { "id": "1", "name": "Webhook WACO", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [0, 0],
      "parameters": { "httpMethod": "POST", "path": "waco", "responseMode": "onReceived", "options": { "rawBody": true } } },
    { "id": "2", "name": "Verifikasi & saring", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [260, 0],
      "parameters": { "jsCode": "// 1) Verifikasi tanda tangan WACO atas BODY MENTAH (bukan JSON yang sudah di-parse)\nconst crypto = require('crypto');\nconst SECRET = 'whsec_GANTI_DENGAN_SECRET_ANDA';\nconst raw = await this.helpers.getBinaryDataBuffer(0, 'data');\nconst diterima = String($input.first().json.headers['x-waco-signature'] || '');\nconst dihitung = 'sha256=' + crypto.createHmac('sha256', SECRET).update(raw).digest('hex');\nif (diterima.length !== dihitung.length || !crypto.timingSafeEqual(Buffer.from(diterima), Buffer.from(dihitung))) return [];\nconst ev = JSON.parse(raw.toString('utf8'));\n// 2) Hanya pesan masuk (status & echo diabaikan di contoh ini)\nif (ev.event !== 'message.received') return [];\n// 3) Anti-dobel: webhook WACO bisa terkirim dua kali -> ingat id yang sudah diproses\nconst st = $getWorkflowStaticData('global');\nst.seen = st.seen || {};\nconst kini = Date.now();\nfor (const k of Object.keys(st.seen)) if (kini - st.seen[k] > 86400000) delete st.seen[k];\nif (st.seen[ev.pesan.id]) return [];\nst.seen[ev.pesan.id] = kini;\n// 4) Logika Anda: contoh balas otomatis bila pelanggan menanyakan harga\nconst teks = String(ev.pesan.teks || '').toLowerCase();\nif (!/harga|price|berapa/.test(teks)) return [];\nreturn [{ json: { dari: ev.dari, nama: ev.nama, balasan: 'Halo ' + (ev.nama || '') + ', daftar harga kami: https://contoh.id/harga' } }];" } },
    { "id": "3", "name": "Balas lewat WACO", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [520, 0],
      "parameters": { "method": "POST", "url": "https://waco.id/api/v1/balas",
        "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth",
        "sendBody": true, "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ nomor: $json.dari, teks: $json.balasan }) }}",
        "options": {} } }
  ],
  "connections": {
    "Webhook WACO": { "main": [[{ "node": "Verifikasi & saring", "type": "main", "index": 0 }]] },
    "Verifikasi & saring": { "main": [[{ "node": "Balas lewat WACO", "type": "main", "index": 0 }]] }
  }
}

Langkah 2 — Isi secret & kunci API

  1. Buka node Verifikasi & saring, ganti whsec_GANTI_DENGAN_SECRET_ANDA dengan secret webhook Anda.
  2. Buka node Balas lewat WACOCredential → buat Header Auth baru: Name Authorization, Value Bearer waco_KUNCI_ANDA.
  3. Aktifkan workflow (Active), lalu salin Production URL dari node Webhook (berakhiran /webhook/waco).
Node Webhook n8n punya dua URL: Test hanya hidup saat Anda menekan "Listen for test event", Production hidup selama workflow aktif. Yang Anda daftarkan ke WACO adalah Production URL.

Langkah 3 — Daftarkan URL ke WACO

Di halaman Developer, tempel Production URL sebagai URL webhook dan simpan. Kirim chat ke nomor WhatsApp Anda berisi kata "harga" — dalam satu-dua detik balasan dari n8n masuk, dan eksekusinya tercatat di Executions n8n.

Tiga hal yang membuat alur ini aman dijalankan terus

Di n8n self-host, node Code perlu diizinkan memakai modul crypto: set variabel lingkungan NODE_FUNCTION_ALLOW_BUILTIN=crypto. Di n8n Cloud modul itu sudah tersedia.

Variasi yang sering dipakai

Make dan Zapier

Pola identik: modul Webhooks → Custom webhook (Make) atau Webhooks by Zapier → Catch Hook menerima event; modul HTTP → Make a request atau Webhooks by Zapier → POST memanggil API WACO dengan header Authorization: Bearer waco_…. Verifikasi tanda tangan di keduanya memakai modul kode masing-masing (Make: Custom JS, Zapier: Code by Zapier) dengan logika HMAC yang sama seperti di atas.

Pertanyaan yang sering muncul

Apakah ini butuh paket khusus? Tidak. API dan webhook termasuk di setiap langganan WACO; biaya pesan tetap dibayar ke Meta seperti biasa.

Bisa dipakai bersama ruang percakapan tim? Ya. Webhook berjalan berdampingan: tim tetap membalas dari ruang percakapan, n8n menerima salinan event yang sama.

Ada node WACO resmi di katalog n8n? Belum — dan tidak diperlukan; HTTP Request sudah mencakup seluruh API. Spesifikasi lengkapnya ada di OpenAPI.

Masih menemui kendala setelah mengikuti panduan ini? Hubungi kami dari dashboard — sertakan tangkapan layar bila ada, itu mempercepat semuanya.