Pular para o conteúdo
FerramentasIniciante

n8n do zero: sua primeira automação com IA em 30 minutos

Suba o n8n com Docker, importe um fluxo que recebe contatos por webhook, classifica e grava em CSV, e ligue um nó de IA opcional.

Por Equipe IAUAI Estudos · 21 de setembro de 2026 · 10 min de leitura · Revisado em 9 de outubro de 2026

Nesta página

Ao terminar este artigo você terá o n8n rodando no seu computador em um container Docker, com um fluxo que recebe um contato por webhook, classifica a mensagem em comercial, suporte ou dúvida e grava uma linha em um arquivo CSV. Você também vai saber trocar a classificação por regra por uma chamada a um modelo de IA, e exportar o fluxo em JSON para guardar ou compartilhar.

O que é o n8n e o que vamos montar

O n8n é uma ferramenta de automação em que você liga blocos, chamados nós, que passam dados de um para o outro. Um nó recebe um evento (um formulário, um e-mail, uma chamada HTTP), outros transformam os dados e outros entregam o resultado em algum lugar. Você pode usá-lo na nuvem do próprio n8n ou instalar na sua máquina. Aqui vamos instalar na máquina (self-hosted), porque dá para aprender sem criar conta.

O fluxo do tutorial tem sete nós.

  1. Webhook: recebe um POST com nome e mensagem.
  2. Classificar: um nó de código que decide a categoria por palavras-chave.
  3. IA opcional (Claude): uma chamada HTTP a um modelo de linguagem, desligada por padrão.
  4. Montar linha: prepara a linha do CSV.
  5. Converter em arquivo e 6. Gravar no CSV: acrescenta a linha em contatos.csv.
  6. Responder: devolve a categoria ao chamador.

A parte de IA é uma etapa opcional porque exige uma chave de API paga. O fluxo funciona de ponta a ponta sem ela.

Passo 1: suba o n8n com Docker

Você precisa do Docker instalado. Crie uma pasta de trabalho e uma subpasta saida para receber o CSV:

mkdir n8n-estudos && cd n8n-estudos
mkdir saida && chmod 777 saida

docker run -d --name n8n-estudos --cpus=2 \
  -p 127.0.0.1:5678:5678 \
  -e N8N_SECURE_COOKIE=false \
  -v n8n_dados:/home/node/.n8n \
  -v "$PWD/saida":/home/node/.n8n-files \
  n8nio/n8n

O que cada parte faz:

  • -p 127.0.0.1:5678:5678 publica a porta só no seu computador, o que evita expor o editor na rede.
  • -v n8n_dados:... guarda fluxos e credenciais em um volume, para não perder nada ao recriar o container.
  • -v ...:/home/node/.n8n-files é a pasta onde o n8n tem permissão para gravar arquivos. Sem ela, o nó de gravação falha com o erro ENOENT: no such file or directory, realpath '/home/node/.n8n-files', que foi exatamente o que aconteceu no nosso primeiro teste.
  • N8N_SECURE_COOKIE=false só é necessário porque você acessa por http://localhost. Em um servidor com HTTPS, não use.

Espere cerca de 20 segundos e abra http://localhost:5678. Na primeira visita o n8n pede para criar a conta de administrador local.

Passo 2: importe o fluxo

No editor, abra o menu do canto superior direito, escolha "Import from file" e selecione o arquivo fluxo.json com o conteúdo da seção "O fluxo em JSON" mais abaixo. Salve o texto em fluxo.json antes. Depois, ative o fluxo pelo interruptor "Active" ou "Publish", conforme o rótulo da sua versão.

Para quem prefere linha de comando, é possível importar sem abrir a interface. Foi o caminho usado no teste:

docker cp fluxo.json n8n-estudos:/tmp/fluxo.json
docker exec n8n-estudos n8n import:workflow --input=/tmp/fluxo.json
docker exec n8n-estudos n8n publish:workflow --id=contatoIauaiEstudos1
docker restart n8n-estudos

Esse caminho exige reiniciar o container para a publicação valer, como o próprio comando avisa.

Passo 3: envie um contato de teste

Com o fluxo ativo, o webhook de produção responde em /webhook/contato. O endereço /webhook-test/contato só funciona enquanto você clica em "Listen for test event" no editor.

curl -s -X POST http://localhost:5678/webhook/contato \
  -H 'Content-Type: application/json' \
  -d '{"nome":"Ana","mensagem":"Quero um orçamento para 20 licenças"}'

No teste real, as três mensagens enviadas voltaram assim:

{"ok":true,"categoria":"comercial"}   (Quero um orçamento para 20 licenças)
{"ok":true,"categoria":"suporte"}     (O sistema travou ao exportar)
{"ok":true,"categoria":"duvida"}      (Vocês atendem em Varginha?)

E o arquivo saida/contatos.csv ficou com uma linha por contato:

2026-10-09T09:28:33.597Z,"Ana",comercial,"Quero um orçamento para 20 licenças"
2026-10-09T09:28:33.790Z,"Ana",suporte,"O sistema travou ao exportar"
2026-10-09T09:28:33.878Z,"Ana",duvida,"Vocês atendem em Varginha?"

O arquivo está na pasta saida do seu computador. Você pode abrir no Excel ou no Google Planilhas.

Passo 4 (opcional): troque a regra por um modelo de IA

A classificação por palavras-chave erra quando o cliente escreve "gostaria de saber quanto sai" e não usa nenhuma palavra da lista. Um modelo de linguagem entende melhor a intenção. Para ligá-lo:

  1. No n8n, abra Credentials e crie uma credencial do tipo Header Auth, com o nome do cabeçalho x-api-key e como valor a sua chave da API da Anthropic. Nunca cole a chave dentro do JSON do fluxo.
  2. Abra o nó "IA opcional (Claude)", escolha essa credencial em Authentication e clique em Enable (o nó vem desabilitado).
  3. Reenvie o contato de teste.

O nó faz um POST para https://api.anthropic.com/v1/messages com um prompt de sistema curto que pede só uma palavra e um limite de 10 tokens de saída. O nó seguinte, "Montar linha", usa a resposta da IA se ela for uma das três categorias válidas e mantém a regra em qualquer outro caso. Esse desenho é de propósito: se a IA devolver uma frase ou o serviço falhar, o fluxo continua com a categoria da regra.

Esta etapa não foi executada no teste, porque exigiria uma chave paga. O que foi validado é o fluxo com o nó desligado. Se for usar, rode primeiro com poucas mensagens e confira o consumo. O artigo o que é token em IA e por que ele define o seu custo mostra como estimar a conta. O modelo do exemplo, claude-haiku-5-5, é o Haiku 5.5, indicado pela Anthropic para classificação e extração em volume (página de modelos consultada em 09/10/2026). Identificadores mudam, então confira a lista antes de usar.

O fluxo em JSON

Salve como fluxo.json. É o arquivo importado no teste, sem credenciais.

[
  {
    "name": "Contato classificado (IAUAI Estudos)",
    "nodes": [
      {
        "parameters": {
          "httpMethod": "POST",
          "path": "contato",
          "responseMode": "responseNode",
          "options": {}
        },
        "id": "11111111-0000-4000-8000-000000000001",
        "name": "Webhook",
        "type": "n8n-nodes-base.webhook",
        "typeVersion": 2,
        "position": [
          0,
          0
        ],
        "webhookId": "5d2f0c1e-0000-4000-8000-0000000000a1"
      },
      {
        "parameters": {
          "jsCode": "// Classifica o contato por palavras-chave. Troque pelo nó de IA quando quiser.\nconst corpo = $input.item.json.body || {};\nconst texto = String(corpo.mensagem || '').toLowerCase();\nlet categoria = 'duvida';\nif (/orçamento|orcamento|preço|preco|contratar|proposta/.test(texto)) categoria = 'comercial';\nelse if (/erro|problema|não funciona|nao funciona|travou|reclama/.test(texto)) categoria = 'suporte';\nreturn { json: { nome: corpo.nome || '', mensagem: corpo.mensagem || '', categoria } };"
        },
        "id": "11111111-0000-4000-8000-000000000002",
        "name": "Classificar",
        "type": "n8n-nodes-base.code",
        "typeVersion": 2,
        "position": [
          220,
          0
        ]
      },
      {
        "parameters": {
          "method": "POST",
          "url": "https://api.anthropic.com/v1/messages",
          "authentication": "genericCredentialType",
          "genericAuthType": "httpHeaderAuth",
          "sendHeaders": true,
          "headerParameters": {
            "parameters": [
              {
                "name": "anthropic-version",
                "value": "2023-06-01"
              }
            ]
          },
          "sendBody": true,
          "specifyBody": "json",
          "jsonBody": "={{ JSON.stringify({ model: 'claude-haiku-5-5', max_tokens: 10, system: 'Classifique a mensagem em uma palavra: comercial, suporte ou duvida. Responda só a palavra.', messages: [{ role: 'user', content: $json.mensagem }] }) }}",
          "options": {}
        },
        "id": "11111111-0000-4000-8000-000000000003",
        "name": "IA opcional (Claude)",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 4.2,
        "position": [
          440,
          0
        ],
        "disabled": true
      },
      {
        "parameters": {
          "jsCode": "// Usa a resposta da IA se o nó opcional estiver ligado; senão mantém a regra.\nconst base = $('Classificar').item.json;\nlet categoria = base.categoria;\nif ($json.content && $json.content[0] && $json.content[0].text) {\n  const t = $json.content[0].text.trim().toLowerCase();\n  if (['comercial', 'suporte', 'duvida'].includes(t)) categoria = t;\n}\nconst limpa = (v) => '\"' + String(v).replace(/\"/g, '\"\"').replace(/\\r?\\n/g, ' ') + '\"';\nconst linha = [new Date().toISOString(), limpa(base.nome), categoria, limpa(base.mensagem)].join(',') + '\\n';\nreturn { json: { linha, categoria } };"
        },
        "id": "11111111-0000-4000-8000-000000000004",
        "name": "Montar linha",
        "type": "n8n-nodes-base.code",
        "typeVersion": 2,
        "position": [
          660,
          0
        ]
      },
      {
        "parameters": {
          "operation": "toText",
          "sourceProperty": "linha",
          "binaryPropertyName": "data",
          "options": {
            "fileName": "contatos.csv"
          }
        },
        "id": "11111111-0000-4000-8000-000000000005",
        "name": "Converter em arquivo",
        "type": "n8n-nodes-base.convertToFile",
        "typeVersion": 1.1,
        "position": [
          880,
          0
        ]
      },
      {
        "parameters": {
          "operation": "write",
          "fileName": "/home/node/.n8n-files/contatos.csv",
          "dataPropertyName": "data",
          "options": {
            "append": true
          }
        },
        "id": "11111111-0000-4000-8000-000000000006",
        "name": "Gravar no CSV",
        "type": "n8n-nodes-base.readWriteFile",
        "typeVersion": 1,
        "position": [
          1100,
          0
        ]
      },
      {
        "parameters": {
          "respondWith": "json",
          "responseBody": "={{ JSON.stringify({ ok: true, categoria: $('Montar linha').item.json.categoria }) }}",
          "options": {}
        },
        "id": "11111111-0000-4000-8000-000000000007",
        "name": "Responder",
        "type": "n8n-nodes-base.respondToWebhook",
        "typeVersion": 1.1,
        "position": [
          1320,
          0
        ]
      }
    ],
    "connections": {
      "Webhook": {
        "main": [
          [
            {
              "node": "Classificar",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Classificar": {
        "main": [
          [
            {
              "node": "IA opcional (Claude)",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "IA opcional (Claude)": {
        "main": [
          [
            {
              "node": "Montar linha",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Montar linha": {
        "main": [
          [
            {
              "node": "Converter em arquivo",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Converter em arquivo": {
        "main": [
          [
            {
              "node": "Gravar no CSV",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Gravar no CSV": {
        "main": [
          [
            {
              "node": "Responder",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "settings": {
      "executionOrder": "v1"
    },
    "active": false,
    "id": "contatoIauaiEstudos1"
  }
]

Cuidados antes de colocar em uso real

  • O webhook de produção é público para quem conhecer a URL. Em um servidor exposto, proteja com autenticação no nó Webhook (Header Auth) e use HTTPS.
  • Mensagens de clientes têm dados pessoais. Defina por quanto tempo o CSV é guardado e quem acessa.
  • Automação com IA sem revisão humana erra. Comece com a IA só sugerindo a categoria, como acima, e deixe uma pessoa ver o resultado.
  • Quando a automação passar de classificar para decidir e agir, leia agentes de IA em produção, que trata de limites de passos, custo e repetição.

Resumo

  • O n8n liga nós que passam dados entre si, e o fluxo inteiro cabe em um JSON.
  • Com Docker, uma pasta montada em /home/node/.n8n-files é obrigatória para gravar arquivos.
  • O webhook de produção responde em /webhook/<caminho> com o fluxo ativo.
  • O nó de IA é opcional e entra com credencial, nunca com a chave dentro do JSON.
  • Mantenha uma regra de reserva para quando a IA falhar.

Fontes

Versões testadas

Em 09/10/2026, imagem n8nio/n8n:latest com n8n 2.42.6, container com --cpus=2, importação por CLI, publicação e reinício, três chamadas ao webhook de produção e leitura do CSV resultante. O container foi removido ao final. O nó de IA (HTTP para a API da Anthropic), a criação da conta de administrador e a importação pela interface web (nomes de menu descritos de memória) não foram executados.

Aprenda jogando

Pipeline em Pânico

Roteie registros sujos pelas estações certas antes que a esteira te engula.

Jogar Pipeline em Pânico

Teste seu conhecimento

Teste o que você aprendeu sobre n8n

Pergunta 1 de 6

Por que o comando docker run do artigo monta uma pasta em /home/node/.n8n-files?

Um conteúdo prático por quinzena

Deixe o seu e-mail para receber um conteúdo prático de IA e cloud a cada quinzena. Sem spam, e você pede a exclusão quando quiser.

Continue lendo