Skip to main content

WAHA + n8n: WhatsApp integratie

Installatienotitie voor uitrol bij klant (Sarana). Gebaseerd op eigen setup thuis (juni 2026).

Overzicht

WAHA (WhatsApp HTTP API) draait een WhatsApp Web sessie in een Docker container en stelt die bloot als REST API. n8n praat ermee via de WAHA community node. Gratis Core versie: 1 sessie (naam moet exact default zijn), tekst sturen/ontvangen. Media versturen vereist WAHA Plus (betalend).

Vereisten

  • Docker host met n8n al draaiend (WAHA kan gewoon op dezelfde server, geen apart IP nodig)
  • Apart WhatsApp nummer voor de bot (prepaid SIM, eSIM of VoIP nummer). GEEN persoonlijk nummer van de klant gebruiken: onofficiele API, banrisico bij hoog volume.
  • Telefoon met dat nummer moet af en toe online komen (zelfde regel als WhatsApp Web)

Stap 1: WAHA container

Eenvoudigste opzet: WAHA in dezelfde stack (of op hetzelfde Docker netwerk) als n8n.

services:
  waha:
    image: devlikeapro/waha:latest
    container_name: waha
    restart: always
    environment:
      - WHATSAPP_API_KEY=<openssl rand -hex 32>
      - WAHA_DASHBOARD_USERNAME=beheerder
      - WAHA_DASHBOARD_PASSWORD=<sterk wachtwoord>
      - WAHA_LOG_LEVEL=info
      - TZ=Europe/Brussels
    volumes:
      - /srv/waha:/app/data
    ports:
      - "3000:3000"

Bereikbaarheid:

  • n8n naar WAHA: http://waha:3000 (zelfde compose netwerk) of http://<server-ip>:3000
  • WAHA webhook naar n8n: http://n8n:5678/webhook/... of via host-IP
  • De ports mapping dient enkel om zelf aan het dashboard te kunnen; container-naar-container verkeer heeft die niet nodig

Aandachtspunten:

  • API key: enkel hex, geen speciale tekens (openssl rand -hex 32)
  • Volume bewaart de sessie, dus geen QR scan na restart
  • Eerste pull duurt enkele minuten (image bevat Chromium, 1 a 2 GB)
  • Macvlan met eigen IP (zoals thuis) kan ook, maar is niet nodig; let dan op de klassieke beperking dat de host de container niet rechtstreeks bereikt

Stap 2: WhatsApp koppelen

  1. Dashboard openen: http://<server-ip>:3000/dashboard, inloggen
  2. Rechtsboven kan "No connected server" verschijnen: bij Workers op Connect klikken en de API key invullen
  3. Sessions > Start New, naam exact default (Core laat geen andere naam toe, de auto gegenereerde naam vervangen!)
  4. QR scannen met telefoon bot-nummer: WhatsApp > Instellingen > Gekoppelde apparaten > Apparaat koppelen
  5. Status moet naar WORKING gaan

Test via curl:

curl -X POST http://<server-ip>:3000/api/sendText \
  -H "X-Api-Key: <api_key>" \
  -H "Content-Type: application/json" \
  -d '{"session":"default","chatId":"324XXXXXXXX@c.us","text":"Test"}'

ChatId formaat: landcode zonder + en zonder leidende 0, gevolgd door @c.us. Groepen: <groepsid>@g.us (op te vragen via GET /api/default/groups, bot moet lid zijn).

Let op: sturen naar het eigen bot-nummer = "Message yourself" chat, geen notificatiegeluid. Normaal gedrag.

Stap 3: n8n koppelen

  1. n8n > Settings > Community nodes > installeer @devlikeapro/n8n-nodes-waha
  2. Credentials aanmaken: type WAHA API, URL http://waha:3000 (of host-IP), API key invullen
  3. Versturen: WAHA node, resource Chatting, operation Send Text (session default, chatId, text)
  4. Ontvangen: WAHA Trigger node toevoegen. De webhook URL die n8n toont in de sessieconfig zetten: WAHA dashboard > sessie bewerken > webhook toevoegen, event message

Testtip: stuur 1 echt bericht naar de bot, pin de trigger output in n8n, en bouw daarop verder zonder telkens berichten te sturen.

Stap 4: klant workflow (te bouwen)

Koppeling op bestaande n8n + Baserow ticketing:

  1. WAHA Trigger: inkomend WhatsApp bericht van klant
  2. Filter: fromMe = false (anders loop met eigen antwoorden!)
  3. Klant opzoeken/aanmaken in Baserow op basis van telefoonnummer
  4. Ticket aanmaken in Baserow (bestaande tabel/flow hergebruiken)
  5. WAHA Send Text: bevestiging terug met ticketnummer, met Reply To = message ID van het inkomende bericht
  6. Bestaande email notificatie flow blijft parallel werken

Productie aandachtspunten

  • Rate limiting: vers nummer ruim onder 20 berichten/minuut houden, Wait node tussen sends
  • Reactieve bot = ok, mass marketing/broadcast = niet doen (banrisico)
  • Loop preventie: altijd filteren op fromMe = false in trigger workflows
  • Monitoring: Uptime Kuma check op GET /api/sessions (status WORKING), sessie kan sporadisch breken na WhatsApp updates aan hun kant, dan eenmalig opnieuw scannen
  • API nooit blootstellen op internet zonder reverse proxy + API key

Referenties