name: chatwoot-painel-kanban-sync
description: Chatwoot + Painel do Corretor (Trindade) + Kanban board sync — architecture, auth, table schema, workflow, and debug commands
triggers:
- chatwoot painel kanban integration
- chatwoot-painel-map sync
- n8n chatwoot painel workflow
Chatwoot + Painel do Corretor + Kanban Sync
Context
Sistema de integração entre:
- - Painel do Corretor (Trindade Tecnologia) — GraphQL API, gestão de leads
- - Chatwoot (chat.rochasalesseguros.com.br) — conversations, contacts
- - Kanban board (chat.rochasalesseguros.com.br/kanban/) — visualização em board
- - Telefone deve estar normalizado (DDD + número, sem espaços/caracteres)
- - Chatwoot não guarda email em contatos (0 contatos com email)
- - Telefone do lead no Painel fica em TEXTO LIVRE dentro de
anotacoes[].mensagem("Telefone informado: XX...") - - Código:
/var/www/chatwoot-kanban/ - - Build:
npm run build→ output emdist/ - - Servido por nginx em
https://chat.rochasalesseguros.com.br/kanban/ - - Lê dados via REST Supabase (
fetchKanbanDataemsrc/services/api.ts) - - Card click abre conversa no Chatwoot:
window.open(https://chat.rochasalesseguros.com.br/app/account/1/conversations/${id})
Arquitetura de Dados
`
Painel do Corretor (GraphQL)
↓ (n8n workflow)
Chatwoot (conversations, contacts)
↓ (n8n workflow)
chatwoot_painel_map (Supabase table)
↓ (HTTP polling)
Kanban Board (React app)
`
Autenticação
| Sistema | Credencial | |
| --------- | ----------- | |
| Supabase | Project: dauftiqcvgaydddoxqhh — ⚠️ anon key invalidado 2026-05-18. Buscar atual: grep SUPABASE /var/www/comercialrs/.env | |
| Chatwoot API | Token: 2AfB8VhS79FTmxG1dL8774RJ, Account ID: 1 | |
| Chatwoot REST | https://chat.rochasalesseguros.com.br/api/v1/accounts/1 | |
| Painel GraphQL | Endpoint: https://api.paineldocorretor.net/graphql | |
| Painel Auth | Auth0: contato@rochasalesseguros.com.br / 221109, client_id MtCJ0_REDACTED, audience https://paineldocorretor.com.br/api/, tenant a1af7a2f-7ec6-40cd-b257-86c045875979 | |
| Coluna | Tipo | Descrição |
| -------- | ------ | ----------- |
id | uuid | PK — ID do negócio no Painel |
chatwoot_contact_phone | text | NOT NULL — telefone (ou placeholder SEMFONE-...) |
chatwoot_conversation_id | integer | ID da conversa no Chatwoot |
painel_negocio_id | text | ID do negócio no Painel |
etapa | text | Etapa atual (valores normalizados abaixo) |
contact_name | text | Nome do lead |
contact_email | text | Email do lead |
updated_at | timestamptz | Última atualização |
painel_negocio_nome | text | Nome do negócio (lead) |
| etapaId (GraphQL) | etapa (Kanban) | |
| --- | --- | |
60008110-e9b1-4512-b514-ab1539ea1a1e | novos_leads | |
885d4f95-99e5-42a0-8150-b494c42c0e34 | qualificacao | |
6699997d-6978-4679-8b4c-eaab9917fefd | remarketing | |
4646a3e9-b21a-4339-b75b-6997fa3dbb76 | reuniao_agendada | |
4e61480b-b4dc-4b80-b0c8-dd3ddf8e43b2 | proposta_enviada | |
29511da1-1e40-4e9c-8b14-a268ccbdc1d0 | analise_seguradora | |
2584da59-4c1e-4fcb-8cba-8374acd896a7 | aguardando_pagamento | |
df8db361-5b4c-4e66-baac-afcfd9fbe50a | fechado | |
70150b84-6864-4cff-aae1-83195a182d8d | declinado | |
63f4b9df-55d6-4ff0-a42c-af5ff2ff367b | sem_interesse | |
| Painel | Kanban etapa | |
| -------- | ---------------- | |
| Novos Leads | novos_leads | |
| Qualificação | qualificacao | |
| Remarketing | remarketing | |
| Reunião Agendada | reuniao_agendada | |
| Proposta Enviada | proposta_enviada | |
| Análise Seguradora | analise_seguradora | |
| Aguardando Pagamento | aguardando_pagamento | |
| Negócios Fechados | negocios_fechados | |
| Declinado | declinado | |
| Sem Interesse | sem_interesse |
Match de Leads
Prioridade: telefone (principal) → nome → email
Workflow n8n Necessário
O workflow atual "RS - Automação CRM Rocha Sales" (id: fuVLvmFke1C7GskY) NÃO atualiza chatwoot_painel_map corretamente — leads caem em sem_interesse.
Workflow necessário:
1. Trigger: Poll a cada 1 minuto
2. Buscar leads do Painel: GraphQL query negocios { ... } com etapa
3. Para cada lead:
- Normalizar telefone
- Upsert na tabela chatwoot_painel_map (match por telefone)
- Atualizar etapa, contact_name, painel_negocio_id
4. Se lead inicia conversa no Chatwoot: Webhook Chatwoot → n8n → buscar etapa do Painel → atualizar chatwoot_painel_map
Kanban Board
Debug
`bash
Ver logs n8n
docker logs n8n-postgres --tail 50
Query direta na tabela
docker exec n8n-postgres psql -U n8n -d n8n -c "SELECT id, etapa, chatwoot_conversation_id FROM chatwoot_painel_map LIMIT 10"
Testar API Chatwoot
curl -H "api_access_token: 2AfB8VhS79FTmxG1dL8774RJ" \
https://chat.rochasalesseguros.com.br/api/v1/accounts/1/conversations?filter=open
Build Kanban
cd /var/www/chatwoot-kanban && npm run build
`
Problemas Conhecidos
1. Aguardando Pagamento count=0: Kanban mostra 0 mas existem 2 registros na tabela — mismatch no valor de etapa
2. Chatwoot não guarda email: 0 contatos com email, match por telefone é crítico
3. Telefone em texto livre: Telefone do lead está dentro de anotacoes[].mensagem, não como campo estruturado
4. HTTP 401 Invalid API key no Supabase: Anon key pode ser regerada invalidando a atual. Buscar chave atual no VPS: grep -i "SUPABASE" /var/www/comercialrs/.env. O Kanban também tem a chave em /var/www/chatwoot-kanban/src/services/api.ts.
5. chatwoot_contact_phone NOT NULL: Não pode ser null. Quando GraphQL não retorna telefones, usar placeholder SEMFONE- (ex: SEMFONE-78cad48e).
6. Cloudflare AUTH_NOT_AUTHORIZED: IP do servidor bloqueado. Userscript Tampermonkey no browser do usuário é a única solução viável.