Integrando Evolution API com n8n (automação de WhatsApp)

A integração entre Evolution API e n8n permite automações completas de WhatsApp: receber mensagens via webhook, processá-las com lógica condicional no n8n e enviar respostas automaticamente. O fluxo básico tem três partes, webhook da Evolution API apontando para o n8n, trigger no n8n processando o evento, e node de envio de resposta chamando a API de volta.

Pré-requisitos: Evolution API e n8n acessíveis entre si

Para que a integração funcione, a Evolution API precisa conseguir fazer requisições HTTP para o n8n (para entregar o webhook) e o n8n precisa conseguir fazer requisições HTTP para a Evolution API (para enviar mensagens). A forma mais simples é rodar os dois na mesma VPS na mesma rede Docker:

yaml
# docker-compose.yml com Evolution API + n8n na mesma rede
services:
  evolution:
    image: atendai/evolution-api:latest
    restart: always
    ports:
      - "8080:8080"
    environment:
      - AUTHENTICATION_API_KEY=sua-chave-api
      - DATABASE_ENABLED=true
      - DATABASE_CONNECTION_URI=postgresql://evolution:senha@postgres:5432/evolution
    networks:
      - app-network

  n8n:
    image: n8nio/n8n:latest
    restart: always
    ports:
      - "5678:5678"
    environment:
      - WEBHOOK_URL=https://n8n.seudominio.com.br/
    networks:
      - app-network

networks:
  app-network:

Configurar o webhook da Evolution API para o n8n

Com o n8n rodando, crie um Webhook node no n8n (método POST), copie a URL gerada e configure como webhook da instância na Evolution API:

bash
# Configurar o webhook apontando para o n8n
# Substitua pela URL do webhook node do seu n8n
curl -X POST "https://seu-servidor/webhook/set/minha-instancia" \
  -H "apikey: sua-chave-api" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://n8n.seudominio.com.br/webhook/evolution-whatsapp",
    "webhook_by_events": false,
    "events": ["MESSAGES_UPSERT", "CONNECTION_UPDATE"]
  }'

Estrutura do workflow no n8n

O workflow básico tem 4 nodes: Webhook (trigger) → IF (filtrar só mensagens recebidas) → Code (extrair número e texto) → HTTP Request (enviar resposta via Evolution API):

javascript
// No node Code do n8n — extrair dados da mensagem
const body = $input.first().json;

// O evento MESSAGES_UPSERT tem estrutura aninhada
const message = body.data?.message || body.message;
const remoteJid = body.data?.key?.remoteJid || body.key?.remoteJid;
const text = message?.conversation || message?.extendedTextMessage?.text || '';

// Remover o sufixo @s.whatsapp.net para obter o número
const number = remoteJid?.replace('@s.whatsapp.net', '') || '';

return [{ json: { number, text, remoteJid } }];

Enviar resposta via HTTP Request node

Para enviar a resposta de volta ao WhatsApp, use o node HTTP Request chamando o endpoint de envio de mensagem da Evolution API:

bash
# Endpoint para envio de texto (Evolution API v2)
# Configuração do node HTTP Request no n8n:
# Method: POST
# URL: https://seu-servidor/message/sendText/minha-instancia
# Headers: apikey: sua-chave-api
# Body (JSON):
{
  "number": "{{ $json.number }}",
  "text": "Olá! Recebi sua mensagem: {{ $json.text }}"
}

Evitar loop: bot respondendo a si mesmo

Sem filtro, o bot responde às próprias mensagens enviadas, criando um loop infinito. Use um node IF no início do workflow para filtrar apenas mensagens recebidas de outros números:

javascript
// Condição no node IF para evitar loop:
// Verificar se a mensagem foi ENVIADA pelo próprio número (fromMe)
const fromMe = $json.data?.key?.fromMe || $json.key?.fromMe;
const isGroup = $json.data?.key?.remoteJid?.includes('@g.us');

// Continuar apenas se: não é do próprio bot E não é de grupo (opcional)
return !fromMe && !isGroup;

Não quer configurar manualmente?

Implante o n8n em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Existe um node comunitário (n8n-nodes-evolution-api) que você instala via npm no n8n self-hosted. Ele simplifica envio de mensagens, mídia e gerenciamento de instâncias sem montar chamadas HTTP manualmente. Para instalar: Settings → Community Nodes → n8n-nodes-evolution-api.

Não obrigatoriamente, mas é recomendado para menor latência e comunicação sem expor as APIs publicamente. Se estiverem em servidores diferentes, ambos precisam de HTTPS e o firewall deve permitir as chamadas entre eles.

Use o Header Auth credential do n8n: nome do header apikey, valor é a chave configurada em AUTHENTICATION_API_KEY. No node HTTP Request, selecione Header Auth como autenticação e escolha essa credential.

Sim. Use o endpoint /message/sendMedia/{instance} com o tipo da mídia (image, document, audio, video) e a URL pública do arquivo ou o conteúdo em base64. O n8n pode buscar o arquivo de uma URL e passar para a Evolution API no mesmo workflow.

Mensagens de grupo têm remoteJid terminando em @g.us. Filtre no node IF se quiser tratar grupos separadamente. Para identificar quem enviou a mensagem dentro do grupo, use o campo participant do payload (disponível em MESSAGES_UPSERT).