Description
n8n-nodes-tavio-crm 0.2.1
Pacote privado oficial de integração entre o n8n e o Tavio
CRM. Inclui um nó regular para operações comerciais e um trigger de webhooks
com validação HMAC-SHA256.
Compatibilidade
| Componente | Versão validada |
| ————— | ———————————– |
| n8n self-hosted | 2.34.5 |
| n8n-workflow | 2.34.2 (usado pelo n8n 2.34.5) |
| Node.js | 22.22 ou superior |
| Tavio CRM API | /api/v1 do monorepo em 13/08/2026 |
O pacote usa somente n8n-workflow como peer dependency e não inclui runtime
externo. O peer permanece aberto para usar a cópia fornecida pelo n8n; os tipos
e testes de desenvolvimento ficam fixados em n8n-workflow 2.34.2, a versão
resolvida pelo n8n 2.34.5. A implementação foi validada com @n8n/node-cli.
Credenciais
Crie uma credencial Tavio CRM API com:
- URL da API:
https://crm.tavio.com.br/api/v1por padrão; - chave de API no formato emitido pelo Tavio CRM.
A chave fica marcada como segredo no n8n. O teste de credencial consulta
GET /auth/session. Não há e nunca deve haver campo workspaceId: o Tavio CRM
deriva o tenant exclusivamente da chave.
Escopos necessários dependem das operações usadas:
| Função | Escopos |
| ——————— | ————————————————- |
| Contatos e empresas | contacts:read/write, organizations:read/write |
| Leads e negócios | leads:read/write, deals:read/write |
| Funis e opções | pipelines:read |
| Atividades e produtos | activities:read/write, products:read/write |
| Notas e tags | notes:write, tags:read/write |
| Campos e seletores | custom-fields:read, users:read, teams:read |
| Trigger | webhooks:manage |
Use o conjunto mínimo. Revogue a chave no CRM ao desativar definitivamente a
integração.
Operações
| Recurso | Operações |
| ——— | ———————————————————————————————————————— |
| Contato | Criar, Obter, Obter Muitos, Pesquisar, Atualizar, Criar ou Atualizar |
| Empresa | Criar, Obter, Obter Muitos, Pesquisar, Atualizar, Criar ou Atualizar |
| Lead | Criar, Obter, Obter Muitos, Pesquisar, Atualizar, Arquivar, Restaurar, Qualificar, Desqualificar, Converter |
| Negócio | Criar, Obter, Obter Muitos, Pesquisar, Atualizar, Mover, Ganho, Perdido, Reabrir, Arquivar, Restaurar, Adicionar Produto |
| Atividade | Criar, Obter, Obter Muitas, Atualizar, Concluir |
| Nota | Criar |
| Produto | Criar, Obter, Obter Muitos, Atualizar |
| Funil | Obter Muitos, Obter Etapas |
| Tag | Obter Muitas, Adicionar ao Item, Remover do Item |
| Avançado | Requisição customizada restrita à origem da credencial |
Funis, etapas, produtos, tags, usuários e equipes são carregados dinamicamente.
Listagens oferecem paginação automática, limite e saída simplificada ou bruta.
Cada item de saída mantém pairedItem; Continue On Fail usa o contrato
nativo do n8n.
Versões e campos visuais
Nodes novos usam automaticamente o typeVersion 3. Em Negócio → Criar, a
tela inicial contém apenas Título, Associar a e a coleção **Campos
adicionais**. A associação pode ser Contato, Empresa ou Nenhum — o contrato do
Tavio CRM permite um negócio sem vínculo. Valor, moeda, funil, etapa,
responsável, equipe, probabilidade, origem, ID externo, observações, Tags e
Campos personalizados só aparecem após Adicionar campo; somente os itens
escolhidos entram no payload.
A v3 preserva a interface visual tipada de contato, empresa, lead, atividade e
produto, os seletores de contatos, empresas, funis, etapas, produtos,
responsáveis, equipes, tags e campos personalizados e o uso de expressões do
n8n. Tags e Campos personalizados aparecem uma única vez por operação aplicável.
Funil e Etapa são obrigatórios na criação de negócio e a lista de Etapa é filtrada
pelo Funil selecionado.
Nodes existentes da versão 0.1.1 continuam carregando como typeVersion 1. A
v1 preserva Campos (JSON), a chave de idempotência legada, os nomes internos e
a serialização dos workflows existentes. Não há migração silenciosa de valores.
Workflows salvos pela 0.2.0 continuam como typeVersion 2: os mesmos nomes e
caminhos de parâmetros são executados sem migração. A v2 recebeu apenas a remoção
das definições repetidas de Tags e Campos personalizados e os carregadores
corrigidos. A v3 usa um normalizador interno para os caminhos dentro de **Campos
adicionais**.
Os textos Renovação Acme e 25000.00 eram placeholders da v2, não defaults ou
dados enviados pela API. Eles não são copiados para a v3 e nenhum valor salvo do
usuário é apagado. BRL e 0 só são mostrados depois que o respectivo campo é
adicionado à coleção; 0 e false explicitamente escolhidos são preservados.
Seletores e erros
Os resource locators usam a API listSearch do n8n com paginação por cursor. Tags
e Campos personalizados chamam respectivamente /tags?entity= e
/custom-fields?entity= com a entidade válida do registro; TAG não é
uma entidade aceita pelo CRM. Todas as respostas são desembrulhadas de
{ data, meta } e retornam IDs como valor interno e nomes legíveis como rótulo.
Erros de opções são convertidos em mensagens acionáveis para credencial inválida
(401), escopo ausente (403), URL/recurso (404), configuração inválida (422) e API
indisponível (5xx), sem serializar objetos HTTP, chaves, headers ou workspaceId.
Campos JSON (typeVersion 1)
Operações de escrita recebem os campos documentados pela API no parâmetro
Campos (JSON). Expressões n8n são aceitas. Exemplos:
{
"firstName": "Ana",
"lastName": "Silva",
"emails": [{ "email": "ana@example.com", "primary": true }],
"phones": [],
"customData": {}
}
{
"title": "Renovação Acme",
"value": "25000.00",
"currency": "BRL",
"externalId": "erp-deal-984",
"customData": {}
}
Dinheiro deve ser string decimal. Updates usam a version retornada pelo CRM;
atividade e produto usam updatedAt. Informe uma Chave de Idempotência
estável ao criar ou alterar dados. No upsert, contato permite selecionar
externalId, matchEmail ou matchPhone; empresa usa document. Campos
personalizados podem ser escolhidos dinamicamente ou enviados em customData
dentro de Campos (JSON).
Requisição avançada
Aceita método, caminho, query e corpo JSON. O caminho deve começar com / e é
resolvido contra a URL da credencial. URLs absolutas, protocol-relative e
tentativas de trocar a origem são rejeitadas antes do HTTP. A autenticação é
sempre aplicada pela credencial e nunca aparece na saída.
Idempotência na v2
Nas operações de escrita da v2, Idempotência: Automática é o padrão. A chave
determinística considera workflow, node, execução, item, recurso e operação e é
reutilizada em retries da mesma execução/item, sem ser registrada em logs. Em
Opções avançadas, é possível escolher uma chave personalizada ou desativar o
cabeçalho quando o contrato permitir. externalId continua sendo a deduplicação
de negócio para eventos de execuções diferentes e não substitui a chave HTTP.
Gatilho webhook
Ao ativar o workflow, o Tavio CRM Trigger cria um endpoint no CRM e guarda o
ID e o segredo de uso único nos dados estáticos do workflow. Ao desativar,
desabilita o endpoint remoto.
O trigger:
X-Tavio-Signature sobre timestamp.eventId.corpoBruto;eventId, event, occurredAt, resourceId, data e raw;Eventos: contato criado/atualizado, empresa criada, lead criado/convertido,
negócio criado/atualizado/movido/ganho/perdido e atividade criada/concluída.
A URL pública do n8n precisa ser HTTPS e estar corretamente configurada; o CRM
recusa destinos locais ou privados em produção.
Instalação self-hosted
Pela interface do n8n
1. Gere ou disponibilize o pacote em um registro npm acessível pela instância.
2. Em Settings → Community Nodes, escolha Install.
3. Informe n8n-nodes-tavio-crm e reinicie os workers se usar queue mode.
Para pacote privado em registro, configure a autenticação npm no ambiente do
container por secret do orquestrador; não grave token em imagem ou repositório.
Artefato local
npm ci
npm run lint
npm run build
npm pack
Instale o .tgz resultante no diretório de community nodes da instância e
reinicie main e workers. O tarball não contém testes, fontes temporárias ou
credenciais.
Exemplos rápidos da v2
Contato → Criar, Nome ={{$json.nome}}, E-mail ={{$json.email}} e Telefone ={{$json.telefone}}.Contato → Criar ou Atualizar, escolha External ID e informe ={{$json.id_cliente}}.Lead → Criar, Título, Contato, Empresa, Valor e Moeda; a conversão seleciona Funil e depois Etapa.Negócio → Mover, selecione Negócio, Funil e Etapa e informe a versão retornada pelo CRM.Atividade → Concluir, selecione a Atividade e informe o resultado opcional.Docker e EasyPanel
O Dockerfile versionado gera o pacote em um estágio Node 22 Alpine e o instala
por padrão sobre a imagem oficial exata docker.n8n.io/n8nio/n8n:2.34.5:
docker build -t n8n-tavio-crm:2.34.5-0.2.0 .
Se docker.n8n.io responder HTTP 429, preserve a mesma versão e use a imagem
espelhada no Docker Hub por meio do argumento N8N_IMAGE:
docker build --build-arg N8N_IMAGE=docker.io/n8nio/n8n:2.34.5 -t n8n-tavio-crm:2.34.5-0.2.0 .
No EasyPanel, use este repositório e o Dockerfile da raiz para construir uma
imagem própria. Aponte o serviço principal e todos os workers n8n para a mesma
imagem imutável n8n-tavio-crm:2.34.5-0.2.0; uma mistura de versões entre main
e workers não é suportada. Preserve integralmente o banco, os volumes, o
domínio, todas as variáveis existentes e, em especial, N8NENCRYPTIONKEY.
Não recrie nem limpe esses recursos durante a troca da imagem. Não é necessário
expor porta adicional. Não adicione a chave Tavio à imagem: cadastre-a como
credencial pela UI do n8n.
A imagem define N8NCUSTOMEXTENSIONS para um caminho imutável fora de
/home/node/.n8n. Assim, o volume persistente do n8n não oculta o pacote e não
é necessário executar npm install no startup.
Faça um workflow de smoke antes de promover. Para atualizar, faça checkout do
commit desejado, construa uma nova tag imutável e aplique exatamente a mesma
imagem ao main e aos workers. Para rollback, reaplique a tag imutável anterior
nos mesmos serviços, sem alterar nem apagar banco, volumes, domínio, variáveis
ou encryption key. Nunca use latest como imagem-base ou tag de release.
Exemplos importáveis
examples/01-webhook-lead-contato-empresa.jsonexamples/02-lead-qualificado-negocio.jsonexamples/03-etapa-criar-atividade.jsonexamples/04-negocio-ganho-onboarding.jsonApós importar, selecione sua credencial e substitua IDs de exemplo.
Solução de problemas
401: chave inválida/revogada ou assinatura rejeitada; recrie a credencialou reative o trigger para obter um novo segredo remoto.
403: falta escopo na API key ou permissão no papel de quem criou a chave.409: version/updatedAt obsoleto, chave idempotente reutilizada com corpodiferente ou upsert ambíguo. Leia novamente o registro antes de repetir.
429: reduza concorrência e aplique retry com backoff.WEBHOOK_URL do n8n e webhooks:manage.
Desenvolvimento
npm ci
npm run format:check
npm run lint
npm run typecheck
npm test
npm run build
npm pack --dry-run
Consulte CONTRIBUTING.md, SECURITY.md e a
matriz auditada da API.
Licença
MIT. Consulte LICENSE.