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:
# 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:
# 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):
// 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:
# 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:
// 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;$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o n8n em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.
Perguntas frequentes
Conteúdos relacionados
[VERIFICAR antes de publicar]
- 1. Confirme o endpoint /message/sendText/{instance} na versão da Evolution API instalada.
- 2. Valide a estrutura do payload MESSAGES_UPSERT rodando um teste real e inspecionando no n8n.
- 3. Confirme o nome do pacote comunitário do n8n para Evolution API — pode ter mudado.