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.
- Webhook: recebe um POST com
nomeemensagem. - Classificar: um nó de código que decide a categoria por palavras-chave.
- IA opcional (Claude): uma chamada HTTP a um modelo de linguagem, desligada por padrão.
- Montar linha: prepara a linha do CSV.
- Converter em arquivo e 6. Gravar no CSV: acrescenta a linha em
contatos.csv. - 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:5678publica 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 erroENOENT: no such file or directory, realpath '/home/node/.n8n-files', que foi exatamente o que aconteceu no nosso primeiro teste.N8N_SECURE_COOKIE=falsesó é necessário porque você acessa porhttp://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:
- No n8n, abra Credentials e crie uma credencial do tipo Header Auth, com o nome do cabeçalho
x-api-keye como valor a sua chave da API da Anthropic. Nunca cole a chave dentro do JSON do fluxo. - Abra o nó "IA opcional (Claude)", escolha essa credencial em Authentication e clique em Enable (o nó vem desabilitado).
- 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
- n8n, documentação oficial de instalação com Docker, imagem
n8nio/n8n: docs.n8n.io/hosting/installation/docker (a página não foi reaberta nesta redação; o comando foi validado executando a imagem em 09/10/2026) - Anthropic, API de mensagens (
/v1/messages, cabeçalhosx-api-keyeanthropic-version): platform.claude.com/docs/en/api/messages
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.