name: painel-corretor-kanban-sync
description: Sync leads from Painel do Corretor (Trindade) to Chatwoot Kanban via Supabase â Tampermonkey userscript approach to bypass Cloudflare IP blocking
category: integrations
Painel do Corretor â Kanban Chatwoot Sync
Context
Rocha Sales â sync leads do Painel do Corretor (Trindade) para o Kanban Chatwoot no Supabase Cloud. O Painel Ă© bloqueado pelo Cloudflare quando acessado de IPs de servidor (VPS), mas funciona normalmente do browser do usuĂĄrio.
Problem
- - Cloudflare bloqueia requests GraphQL do Painel vindos de IPs de servidor (VPS)
- - Kanban Chatwoot (React) lĂȘ leads da tabela
chatwoot_painel_mapno Supabase - - Leads não apareciam no Kanban porque o workflow n8n (na VPS) também era bloqueado
- - Colunas: Id (UUID), Nome, Etapa, Valor, Contato.Nome, Contato.Telefones, source
- - Upsert:
POST /rest/v1/crm_leads_duplicate?on_conflict=Id - - Colunas: id (UUID, PK), painel_negocio_id, painel_negocio_nome, etapa, chatwoot_conversation_id, chatwoot_contact_phone
- - CRĂTICO:
chatwoot_contact_phonetem constraint NOT NULL â nĂŁo pode ser null - - Upsert:
POST /rest/v1/chatwoot_painel_map(sem on_conflict pois usa id como PK) - - Auth URL:
https://auth.paineldocorretor.com.br/oauth/token - - client_id:
MtCJ0_REDACTED - - audience:
https://paineldocorretor.com.br/api/ - - realm:
Username-Password-Authentication - - email:
contato@rochasalesseguros.com.br - - senha:
221109 - - x-tenant:
a1af7a2f-7ec6-40cd-b257-86c045875979 - - JWT expira ~3 dias (259200s) quando obtido via Auth0 API
- - Projeto:
dauftiqcvgaydddoxqhh - - Anon key:
eyJ_REDACTED - - REST:
https://dauftiqcvgaydddoxqhh.supabase.co - - GraphQL
negociosElasticNĂO retorna telefones do contato na query principal - - Se
contato.telefonesvier vazio/nulo â usar placeholder:'SEMFONE-' + id.replace(/-/g,'').slice(0,8) - - Exemplo:
SEMFONE-06c06862 - -
chatwoot_contact_phoneNOT NULL â se nĂŁo vier telefone, usar placeholder - - O script V2 falhou porque sĂł escrevia em
crm_leads_duplicate, nĂŁo emchatwoot_painel_map - - Copiar cĂłdigo pelo Discord corrompe o JavaScript â melhor instalar via URL ou colar direto no Tampermonkey
Solution
Tampermonkey userscript rodando no browser do usuĂĄrio:
1. Extrai JWT do localStorage do Painel (ou faz login via Auth0 API)
2. Busca leads via GraphQL negociosElastic com paginação (500 por page)
3. Escreve em DUAS tabelas Supabase:
- crm_leads_duplicate â para compatibilidade com CRM
- chatwoot_painel_map â para o Kanban Chatwoot
Arquitetura
Duas Tabelas Supabase
crm_leads_duplicate
chatwoot_painel_map â ESTA Ă A TABELA QUE O KANBAN LĂ
EtapaKey Mapping (Painel UUID â Kanban etapaKey)
| etapaId | etapaKey |
| --------- | ---------- |
| 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 |
GraphQL Query (negociosElastic)
`
query FetchLeads($etapaId: String!, $skip: Int!) {
negociosElastic(request: {
busca: null,
take: 500,
skip: $skip,
conditions: [{ field: "etapaId", operator: "", value: $etapaId }]
}) {
quantidade
items {
id nome valor fechamento criadoEm
contato { id nome avatar telefones }
etapa { id nome }
produto { nome }
etiquetas { nome }
}
}
}
`
Auth0 Credentials
Supabase
Telefone para chatwoot_painel_map
Tampermonkey Script â Regras de Sintaxe
ESLint do Tampermonkey Ă© estrito. Regras:
1. NĂO usar template literals (` `) que contenham ${...}` com cĂłdigo JS dentro â quebra o parser
2. NĂO usar arrow functions (=>) â nĂŁo sĂŁo aceitas
3. NĂO usar const/let â usar apenas var
4. String concatenation com '+...+' para HTML dinĂąmico dentro de event handlers
5. Sempre usar function() {} em vez de () => {}
Verificação
ApĂłs sync, verificar em ambas tabelas:
`bash
chatwoot_painel_map - contagem por etapa
curl -s "https://dauftiqcvgaydddoxqhh.supabase.co/rest/v1/chatwoot_painel_map?select=etapa,count&group=etapa" \
-H "apikey:
crm_leads_duplicate
curl -s "https://dauftiqcvgaydddoxqhh.supabase.co/rest/v1/crm_leads_duplicate?select=Etapa,count&group=Etapa" \
-H "apikey:
`
Kanban URL
https://chat.rochasalesseguros.com.br/kanban/