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 WACO β†’ Credential β†’ 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.