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:
    Dica
    Na mesma rede Docker, o n8n acessa a Evolution API por http://evolution:8080 e a Evolution API acessa o n8n por http://n8n:5678. Sem precisar de IP público para comunicação interna.

    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"]
      }'
    Dica
    Use a URL de produção do n8n (https://...), não localhost. Se o n8n e a Evolution API estão na mesma rede Docker, use o nome do serviço: http://n8n:5678/webhook/evolution-whatsapp

    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 } }];
    Atenção
    A estrutura do payload do webhook varia entre versões da Evolution API. Sempre valide o JSON recebido nos logs do n8n antes de colocar em produção.

    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 }}"
    }
    Dica
    [VERIFICAR: o endpoint /message/sendText/{instance} pode variar entre v1 e v2 da Evolution API. Confirme na documentação da versão instalada.]

    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;

    $ 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.