Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Extensão do Chrome + servidor que transformam a conversa de prospecção em um relatório de handoff em PDF para o closer — com um clique, direto do WhatsApp Web ou do Instagram Direct, lendo o histórico inteiro e transcrevendo os áudios.
Em volta do report, a ferramenta virou a mesa de trabalho do pré-vendedor: mostra a ficha do lead no RD Station ao lado da conversa, resume onde a conversa parou, abre um painel lateral com o lead e as negociações (um clique leva ao card no CRM), move o card no CRM quando o lead responde e acumula dados para responder, com número, qual closer fecha com qual tipo de lead e o que funciona na prospecção.
Sem bot, sem QR code e sem biblioteca não oficial: a extensão só lê a página que o SDR já tem aberta e logada.
| Para quem | O quê |
|---|---|
| Pré-vendedor (SDR) | Report em PDF com um clique; ficha do lead do RD ao abrir a conversa; resumo rápido para retomar um lead; painel lateral com as negociações do lead, cada uma com link para o card no CRM; .zip com os reports do dia. |
| Closer | Handoff de até 2 páginas: resumo, perfil do lead e como conduzir, nível de consciência, sinais de compra, como foi a conversa e a fala pronta para abrir a reunião. |
| Gestão | Custo por report e por SDR, PDFs de toda a equipe, resultado de cada reunião, matriz closer × perfil de lead, padrões da prospecção que fecha e insights escritos por IA gratuita. |
Custo: só a geração do report (Anthropic) é paga. Transcrição de áudio, leitura de print, insights, ficha do CRM e a automação do cartão não têm custo por uso.
WhatsApp Web / Instagram Direct
│ extensão (content script): lê o DOM, rola o histórico, captura os áudios no mudo
▼
service worker da extensão ── x-cr-key ──▶ servidor (Express, na Vercel)
│
├─ transcreve os áudios ........ Groq (Whisper)
├─ normaliza a conversa ........ src/conversation-normalizer.js
├─ gera o report ............... Anthropic (prompt em cache, saída estruturada)
├─ confere as citações sem IA .. src/citacoes.js
├─ monta o PDF ................. pdfkit, até 2 páginas
└─ registra custo e leitura .... src/stats.js
▼
PDF em base64 ──▶ a extensão oferece o download (e o painel guarda uma cópia)
server.js, exposto por api/index.js. Dados no Vercel KV /
Upstash Redis (o disco da Vercel não persiste). Áudio sempre pelo Groq.npm start): dados em data/*.json; áudio pelo Groq se houver GROQ_API_KEY,
senão pelo faster-whisper em Python.src/db.js escolhe o modo sozinho, olhando se KV_REST_API_URL e KV_REST_API_TOKEN existem.
npm install
cp .env.example .env # preencha pelo menos ANTHROPIC_API_KEY e ADMIN_PASSWORD
npm start # http://localhost:3000
Abra http://localhost:3000, entre com a ADMIN_PASSWORD e crie o primeiro acesso na aba
Acessos (papel Master). Cada acesso é um nome + uma chave pnx_… — não há e-mail nem senha.
GUIA-SDR.md.chrome://extensions → Modo do desenvolvedor → Carregar sem
compactação → pasta extension/. No popup, cole a chave; para apontar para o servidor local,
troque o endereço para http://localhost:3000.Para usar: abra a conversa do lead, clique no ícone da extensão e em Gerar Report da conversa aberta. Um aviso no canto acompanha a leitura e, no fim, oferece o PDF. Dá para responder outros leads enquanto a IA escreve — só não troque de conversa durante a leitura.
| Usuário (SDR) | Gestor | Master | |
|---|---|---|---|
| Gerar report (extensão e painel) | ✓ | ✓ | ✓ |
| Reports do dia — os próprios (.zip) | ✓ | ✓ | ✓ |
| Reports do dia — equipe inteira (.zip com uma pasta por SDR) | ✓ | ✓ | |
| Reports gerados (números, custo, closer e resultado) | ✓ | ✓ | |
| Arquivos (PDFs guardados, download em massa) | ✓ | ✓ | |
| Base de conhecimento | ✓ | ✓ | |
| Aba Extensão (download, teste do RD) | ✓ | ✓ | |
| Acessos (criar, editar, remover chaves e permissões) | ✓ | ||
| Resultados da reunião e inteligência | ✓ | ||
| Closers (adicionar e remover) | ✓ | ||
| Escolher o closer no aviso "Report pronto!" | ✓ |
O papel é só o ponto de partida. Na aba Acessos o master marca, pessoa por pessoa, quais abas do painel ela abre (Reports gerados, Resultados da reunião, Closers, Arquivos, Base, Extensão e os reports do dia da equipe) — a aba Acessos é sempre só do master. Quem recebe a aba Resultados sem ser gestor vê e edita apenas os próprios reports. O servidor confere a mesma permissão em cada rota.
Além do papel, o master liga quatro recursos por pessoa na aba Acessos:
| Recurso | Padrão | O que libera |
|---|---|---|
| Popup do lead | ligado para todos | Ficha do CRM, painel lateral e resumo rápido no WhatsApp. |
| Automação RD | só o master | Etiqueta "Qualificado" e agendamento. O "Respondeu" automático vale para todos com a ficha do lead (desde 27/10/2026). |
| Etiquetas | só o master | No cartão, o investimento do formulário ("R$ 3 a 5k", "R$ 5k+") e se o lead já vende. |
| Cor na agenda | master: Banana; demais: nenhuma | A cor com que as reuniões dos leads da pessoa são pintadas no Google Agenda. O master já começa na Banana sem configurar; "Não pintar" escolhido à mão é respeitado. |
Regras do cadastro (src/usuarios.js): o único master não pode ser rebaixado nem removido; enquanto
não houver nenhum, o usuário cujo nome é MASTER_NOME é promovido uma vez. A ADMIN_PASSWORD é o acesso
reserva (cria o primeiro master).
src/perfil.js).src/dores.js).src/consciencia.js) e cada nível
exige prova: sem ela, a IA desce um degrau.Tom só positivo. O report existe para "vender" o lead ao closer: nenhum ponto real é omitido
(objeção, decisor ausente, orçamento apertado), mas tudo é escrito como próximo passo, nunca como
alerta. Fala do lead que desanima fica fora das citações — pelo prompt e por um filtro sem IA
(citacaoDesanimadora).
Editável e de graça. Qualquer campo pode ser corrigido no popup da extensão ou no painel; o
PDF é refeito sem chamar a IA (POST /api/pdf).
<conversa> e </conversa>; marcas
parecidas escritas por alguém na conversa são neutralizadas.verificarCitacoes): a fala precisa estar na conversa, ou ter
≥ 80% das palavras na mesma ordem e todos os números iguais. A que não passa sai do report.src/aquecimento.js, POST /api/cache/aquecer). ~55 min depois de um
report, a extensão bate no servidor; se o cache está para vencer e houve report nas últimas
2 h, o servidor manda o mesmo prefixo com 1 token de saída (paga só a leitura, ~20x menos que
a reescrita) e o cache fica valendo até ~2h50 depois do último report. Nunca bate com o cache
já vencido. AQUECER_CACHE=nao desliga; AQUECER_JANELA_MIN (120) muda a janela. O gasto das
batidas e quantos reports acharam o cache quente aparecem nos números do painel.[10:05]) e um cabeçalho por dia
com o dia da semana, em vez do carimbo ISO em UTC — menos tokens e a hora certa do WhatsApp.reportKey é o hash da conversa normalizada + versão do prompt + modo de
qualidade (src/idempotencia.js). Conversa igual não chama a IA de novo: a extensão pergunta
entre Abrir o existente e Gerar de novo. Uma trava por chave impede duas gerações
simultâneas da mesma conversa.src/conversation-normalizer.js): remove vazios e ecos longos, agrupa falas
seguidas e, só acima de MAX_CONVERSATION_CHARS, corta preservando o mais recente e todo
trecho com sinal comercial. Quando corta, o report avisa.qualidade: "eco" | "standard" | "premium" troca só o modelo; nunca é
automático. POST /api/estimar-custo mostra a estimativa no painel sem chamar a IA.src/precos.js calcula o custo real de cada report (com cache) e
src/stats.js guarda o número da época — recalcular depois daria outro valor.Versão do prompt: PROMPT_VERSAO = 'v6' em src/report.js. Subir a versão permite gerar de
novo uma conversa já feita.
Aba Meus closers (só o master): para o mês escolhido (padrão: o atual) e o SDR (você, alguém do time do Match ou o
time todo), por closer: reuniões realizadas no mês, vendas no mês, ticket médio, conversão (vendas ÷
reuniões) e no-show, com o total e o destaque "você converte mais com …" (entre os closers com 3+ reuniões).
Clique num closer para ver os leads. Lê do CRM os cards em que o SDR é o SDR e que mudaram no mês, nos funis que têm
reunião realizada e nos dos closers, e fica com os que foram para um closer (o dono do card). As regras de "a reunião
aconteceu", da data da reunião e da venda são as do Match (src/painelClosers.js usa src/matchCloser.js). Só o
CRM conta (como a coluna "Vendido" do CRM): report que o CRM não traz não entra — as duas abas mostram os mesmos
números para o mesmo closer. Lê em
partes (continua sozinha) e guarda o resultado por 20 min (GET /api/master/closers-do-sdr?sdr=&mes=).
Aba do master (src/matchCloser.js, GET /api/master/match, PUT /api/master/match/meta). Mostra,
desde 01/07/2026 (MATCH_DESDE) e com o closer Paulo Henrique (MATCH_CLOSER; dá para trocar na tela),
as reuniões realizadas e as vendas em que você foi o SDR — mês a mês, com o mês atual.
src/matchAnalises.js). Conversão (vendas ÷ reuniões realizadas daquele
tipo de lead), vendas e faturamento por: profissão, quanto disse que pode investir (até R$ 3 mil, R$ 3 a
5 mil, mais de R$ 5 mil), faturamento, se já vende, o que busca, perfil e nível de consciência do report,
dia da semana e origem do card; e, das vendas, o produto, quanto tempo levou para fechar e os motivos de
quem não comprou. Os destaques apontam o tipo que mais converte contra a média (só com 3+ reuniões).
Os campos vêm do card; sem eles, da anotação do formulário no RD, lida uma vez por card (até 60 por
atualização) e guardada por 60 dias.Ao abrir uma conversa no WhatsApp Web, um cartão aparece encostado na borda direita da conversa e, na borda direita da tela, o painel lateral do CRM. O cartão flutuante some quando a opção "Mostrar o cartão flutuante" está desmarcada no menu da extensão — só ele: a ficha no painel lateral, o "Respondeu" automático, as etiquetas e a contagem de recontatos continuam. – minimiza e × fecha o cartão só naquela conversa.
Áudios abertos com a conversa. O WhatsApp novo baixa os áudios assim que a conversa é clicada na lista, antes de o nome dela aparecer no topo. Cada arquivo de áudio fica com a conversa da "rodada" do clique (o nome que aparece no topo em seguida), e o report usa os da sua conversa — áudio ouvido em outra conversa continua de fora.
↻ Atualizar (no topo do painel, desde a 1.6.17) faz a aba ler de novo a conversa aberta e buscar o lead no CRM;
sem resposta da aba, o painel pede para recarregar o WhatsApp (F5). Cada aba do WhatsApp guarda o seu lead
(painelLead:<aba> no chrome.storage.session): outra aba ou janela sem conversa aberta não apaga mais o lead do painel.
É o painel lateral do próprio Chrome (chrome.sidePanel), como o da extensão do RD Station: abre pelo botão
▤ no cartão do lead ou por Abrir painel lateral do CRM no popup da extensão, e mostra o lead da conversa
aberta no WhatsApp Web:
Fecha pelo × do próprio Chrome. Lead não achado: o painel tem a mesma busca do cartão, que roda na aba do
WhatsApp. Só link do próprio CRM vira link, e nada do CRM vira HTML (extension/sidepanel.html, sidepanel.js
e painel.js; o cartão publica o estado pelo service worker em chrome.storage.session). Sem a ficha do CRM liberada, o painel não aparece.
Mais rápido. A extensão percebe a troca de conversa em até 0,4 s (antes 1,5 s), espera 0,25 s antes de buscar (antes 0,7 s) e guarda na aba a última ficha de cada conversa por 10 minutos: voltar a uma conversa mostra o lead na hora, e a busca nova só redesenha se algo mudou. No servidor, contato, negociações, anotações, campos e usuários do CRM são pedidos em paralelo, e a automação do cartão, a agenda e o pintar a reunião no Google Agenda também correm juntos.
Na aba Gerar report, o bloco "Complementar um report do WhatsApp com a ligação": qualificou pelo WhatsApp e
depois ligou? Escolha um report seu (o texto vem sozinho — guardado 60 dias desde a geração; report mais antigo, cole
o texto do PDF), escreva o que veio da ligação e clique em Gerar report completo. A IA recebe os dois, marcados, e
vale a ligação quando divergir. O report novo fica preso ao mesmo lead (card, contato e telefone do report de origem)
e passa a ser o handoff do "Reunião realizada" (GET /api/report-base, POST /api/report-texto com baseId).
No cartão, ✨ Sugerir motivo e anotação lê as mensagens da tela. Lead sem resposta há 3 ou mais tentativas suas
(em dias diferentes) depois da última mensagem dele: escolhe o motivo de "não respondeu" e escreve a anotação com as
datas, sem IA. Nos outros casos, a IA gratuita (Groq, a do resumo rápido) escolhe um dos motivos do CRM e escreve a
anotação (src/sugestaoDesq.js, POST /api/crm/sugestao-desqualificacao). Sem custo por uso; o SDR confere e confirma.
Para quem tem o acesso do Desqualificar, o painel ganha três botões. Nada muda no CRM sem confirmar no painel.
trocar_responsavel e, para trocar de funil, mover_de_funil; sem
elas o painel avisa antes de mexer em qualquer coisa.Etapa e funil, responsável, as respostas do formulário (a anotação com linhas "Campo: valor"), campos personalizados, outras anotações e o link Abrir no RD Station.
send?phone=…) ou o painel "Dados do contato". O servidor tenta os formatos em que
o número pode estar no RD e só aceita contato cujos 8 últimos dígitos batem.Botão no cartão: lê a conversa e os áudios e devolve o cenário, onde parou, a última pergunta e o próximo passo. Mesma conversa = resumo do cache por 7 dias, sem custo.
Conversa com áudios longos não se reouve. Depois do Resumo rápido, o cartão ganha:
Usa a conversa que o resumo já leu (com os áudios transcritos), sem reler nem retranscrever; é IA gratuita
(Groq) e nada fica guardado (src/perguntasDaConversa.js, POST /api/conversa/mapa e
POST /api/conversa/perguntar, mesma permissão do resumo rápido). O trecho citado só aparece se está de
fato numa mensagem: o que a IA inventasse sai. Conversa muito longa é enxugada (as mensagens mais recentes
e as com sinal comercial ficam), e chegou mensagem nova depois do resumo, use Atualizar.
Três coisas, sem IA e sem custo, para quem o master ligou:
contatoDesde na ficha, inicioDaTentativa em src/crm.js) vem do histórico de etapas do card: a
entrada na sequência de etapas antes de "Respondeu" no funil atual, nunca antes da criação. Assim, num
card de recuperação (card antigo que voltou ao contato, ou que veio de outro funil), a resposta antiga
do lead que está no histórico da conversa não conta. A extensão manda a data da resposta
(respostaEm) e o servidor confere de novo: sem a data (extensão antiga), com data de antes da
tentativa ou no futuro, não move. A automação também espera 1,5 s depois de trocar de conversa e
confere que o contato no topo é o da ficha. É a única escrita automática que o sistema faz no RD (a outra é a limpeza do funil, pedida pelo master): nunca volta um card, não mexe em
card fechado nem em funil sem essa etapa, confere tudo de novo no RD na hora e registra cada
movimento. O RD só aceita se o dono do token for o responsável pelo card ou do mesmo time; se
recusar, o cartão mostra o motivo.extension/agenda.js lê, no navegador, a última mensagem sua
que confirma um compromisso com dia e hora ("reunião agendada para quinta às 15h",
"remarquei para 10/10 às 16h", "ficou para amanhã às 9h") — ou o lead escolhendo um horário
que você ofereceu, seguido do seu "Agendado!". Citar reunião, horário ou diagnóstico não
basta, e proposta ("posso agendar para amanhã às 15h?"), oferta de opções e duração ("2h por
dia") não contam. Agendamento dito em áudio entra quando o resumo ou o report leem
a conversa inteira. Depois do horário, vira "Estava agendado".O texto da conversa não vai ao servidor para isso — só o pedido de mover, a etiqueta e a data.
Etiqueta de perda. Se o card do lead foi dado como perdido no RD, o cartão mostra, em vermelho, DESQUALIFICADO · motivo (card na etapa de desqualificados) ou PERDIDO · motivo (perdido em outra etapa), com a anotação da perda ao passar o mouse. Vem da própria ficha do RD, então aparece para quem vê o cartão, sem depender da automação; cobre tanto a perda dada à mão quanto a da Limpeza do RD. Lead com outro card em aberto não ganha a etiqueta: a ficha mostra o card aberto.
Reunião pelo Google Agenda. Quando o master conecta a conta dele (aba Extensão → Google
Agenda), o servidor lê as agendas que essa conta enxerga — as dos closers, compartilhadas com
ela — e procura o evento em que o e-mail do lead é convidado (sem e-mail no RD, o nome inteiro
no título). O cartão mostra "Agendado: hoje às 14:00 · Vitor", e isso vale mais que o lido na
conversa. Remarcou pelo link? Vale a próxima reunião. Cache de 10 min por lead, e uma falha do Google nunca derruba a ficha (src/agendaGoogle.js).
Cor do pré-vendedor na agenda. O time marca de quem é cada lead pela cor do evento. Em Acessos, cada pessoa pode ter uma cor: ao abrir a conversa do lead, a reunião futura dele é pintada com ela, se o evento ainda não tiver cor (lead já marcado por outro não é trocado). É a única alteração que o sistema faz na agenda, e exige que a conta conectada possa editar os eventos dos closers.
O objetivo é decidir por dado, não por achismo: que closer pega que lead e que prospecção funciona.
src/inteligencia.js): matriz closer × perfil, conversão por
perfil e por nível, e o que difere na prospecção das reuniões que fecharam.Onde cada closer vai melhor, e por quê. A aba mostra, sem IA, frases como "Paulo vai melhor com lead cauteloso: fechou 3 de 4 (75%), contra 0 de 2 com os outros perfis", seguidas das anotações de "o que deu a reunião" — é delas que sai o porquê. Os insights da IA recebem os mesmos dados e não podem inventar motivo: sem anotação, dizem que falta anotar.
Closer preenchido sozinho. Ao abrir a conversa do lead, se o card no RD já está em "Reunião
Realizada" (ou no funil dos closers) com o closer como responsável, ou se a reunião está na agenda
de um closer, os handoffs daquele lead que estão sem closer são preenchidos (src/closerAuto.js).
Só vale closer cadastrado na aba Closers, e closer já marcado nunca é trocado.
Desfecho puxado do RD. O closer registra o fim no RD: vendido (com o produto e o valor), ou
perdido / etapa "Não compraram" com o motivo. O servidor lê isso (src/vendasRd.js) e preenche
a linha sozinho:
Só vale desfecho registrado depois de o report existir.
O resultado acompanha o estado do card. O que o RD deu (e não o que foi marcado à mão) muda
junto com o card: "Não compraram" vira "Não fechou"; perda com motivo de falta ("no-show", "não
compareceu") vira No-show; o lead que "não comprou" e voltou a negociar volta para Em
follow-up; e se ele comprar depois, vira Venda em follow-up. Resultado escolhido à mão nunca
é trocado (o report guarda de onde o resultado veio: resultadoOrigem).
Puxar do RD é retroativo. O botão confere todo o período escolhido em Resultados — um lote
por vez, até acabar (?varredura=) —, inclusive os reports com resultado à mão que estão sem
closer (ganham o closer; o resultado fica). Para preencher o mês, escolha o período e clique uma vez.
Trazer do Report Closer. Report gerado só no Report Closer (o sistema da empresa) fica só no banco de lá. Lá, em Resultados → Levar para o Report PRONIX (período, closer, só vendas), sai um .json com cada report e o PDF; aqui, em Resultados → , ele é importado (, ): só os reports do próprio usuário, o closer achado pelo nome no cadastro daqui, sem duplicar (mesmo report, ou o mesmo lead com até 3 dias de diferença).
Em Resultados, Trazer as vendas de um closer direto do RD (POST /api/master/trazer-vendas-rd,
src/vendasDoRd.js): lê os cards ganhos do closer desde a data escolhida em que o campo SDR é o seu
nome. Quem já tem report aqui é completado (closer, ticket, produto, data) sem trocar o que foi marcado à
mão; quem não tem ganha um report com a venda (origem "rd", sem PDF). Card sem o campo SDR preenchido fica
de fora (e a tela diz quantos). Só leitura no RD.
Na aba Reports do dia, o cartão Report automático monta o fechamento do dia no formato que se manda
à liderança (src/reportDoDia.js):
O texto sai pronto, editável, com o botão Copiar o report (GET/PUT /api/report-dia, POST /api/atividade).
Das datas das mensagens (sem IA), o resumo do report ganha, quando faz sentido:
src/linhaDoTempo.js).Conversa colada como texto, sem datas, não ganha essas linhas.
O Report PRONIX e o PRONIX Closer Report desenham o mesmo cartão e o mesmo painel lateral no WhatsApp Web. Com as
duas ligadas, o cartão pulava de lugar e desligar a "Popup do lead" de uma sumia com a do outro. O Report PRONIX
(1.5.3+) avisa na página (data-report-dono="pronix") que é ele quem desenha; o Closer Report (1.13.2+),
vendo o aviso, não consulta o RD nem desenha nada. Sem o Report PRONIX, o Closer Report volta a funcionar sozinho.
No cartão do lead, o botão Desqualificar (para quem tem a automação do cartão) mostra os motivos de
perda cadastrados no RD; escolhido o motivo e confirmado, o card do lead vira perda com esse motivo,
vai para "Desqualificados" (se o funil dele tiver essa etapa) e o campo SDR recebe o seu nome — sem abrir o
card no RD. Só vale o card em aberto do lead da conversa (o servidor confere na ficha), e a mudança entra
no registro da limpeza: aparece no relatório por motivo e dá para desfazer pelo painel
(GET /api/crm/motivos-perda, POST /api/crm/desqualificar, desqualificarCard em src/limpezaRd.js).
Card parado no começo do funil vira perda em "Desqualificados", com o motivo certo:
| Onde o card está | Parado há mais de | Motivo de perda |
|---|---|---|
| Contato iniciado | 15 dias (ajustável) | Nunca respondeu |
| Respondeu | 15 dias (ajustável) | Parou de responder |
O campo SDR do card recebe o nome de quem pediu a limpeza. Fica na aba Limpeza do RD do menu (Gestão comercial), só para o master, e nada acontece sozinho:
"Parado" conta do movimento mais recente entre a última atividade, a última atualização e a criação
do card. É uma leitura conservadora do "esfriando" da tela do RD: na dúvida, não mexe. Os outros
campos personalizados do card são reenviados como estavam (src/limpezaRd.js).
CRM_MOVER_ETAPA=0 desliga também esta escrita.
Cadastros duplicados. Na mesma aba, Procurar duplicados olha os cards em aberto do funil em que você é o responsável e acha o mesmo lead em mais de um card: e-mail igual ou telefone igual (DDD + 8 últimos dígitos, então "+55 71 99999-8888" e "(71) 9999-8888" são o mesmo). Um card fica e os outros vão para "Desqualificados" com a perda "Duplicado" e o campo SDR preenchido.
CRM_LIMPEZA_MOTIVO_DUPLICADO (padrão: qualquer motivo que contenha "duplic").Para cada closer com inteligência cadastrada (aba Closers → Inteligência), o popup da extensão ganha um botão "Analisar Match com {apelido}". Clicar gera só a análise — não gera report (não usa a IA paga nem cria report novo). Se o lead já tem report seu dos últimos 30 dias, o servidor aproveita o perfil e o nível de consciência dele, e a nota fica naquele report. O aviso traz a análise:
A análise são dois pedidos à IA gratuita — a avaliação e o plano da call —, porque cada pedido tem tamanho limitado. Se o plano falhar, o relatório sai com a avaliação e os passos curtos, e a próxima tentativa refaz o plano.
A nota cruza três coisas: a inteligência do closer (o que as calls dele ensinaram: com que tipo de
lead fecha — sozinho, casal, com sócio; perfil —, como conduz, onde trava), o histórico dele em
Resultados (vendas e reuniões por perfil de lead) e o que o report levantou do lead, mais o fim da
conversa. A inteligência é texto destilado, sem nome nem dado de lead; o material bruto
(transcrições) fica na pasta privado/, fora do Git.
Custo zero: a análise roda no Groq e o PDF é montado no servidor. Se a análise falhar, o report continua pronto e o aviso oferece tentar de novo. A nota fica guardada no report, para comparar depois com o que a reunião deu.
Casos das calls e padrão. Além do texto, a análise usa números medidos: cada negociação do
closer vira um caso com quem decidia (sozinho, casal, sócios, família), se todos os decisores
estavam na call, o momento do lead (loja física, já vende online, do zero), quantas reuniões e como
terminou. Os casos vêm de dois lugares (src/casos.js):
.json com o cadastro, o apelido, a
inteligência e os casos classificados das transcrições. Cria o closer se ele não existe; importar
de novo troca os casos das transcrições, sem duplicar. Os casos não levam nome nem contato de lead,
e o pacote, como as transcrições, fica em privado/, fora do Git;O padrão ("casal com os dois na call: 9 de 17") vai dentro do histórico no pedido à IA e aparece no painel, em Closers → Inteligência.
Conversa por ligação. Sem conversa escrita, a extensão não tem o que ler. No painel, aba Gerar report, o cartão Match com o closer recebe o PDF do handoff (o que o próprio sistema gera) ou o texto do report colado, e devolve o PDF do match (POST /api/afinidade/handoff, src/textoDoPdf.js). Report gerado ali mesmo nem precisa do PDF: é só clicar. O PDF enviado não fica guardado; "falas do lead" no plano só as que estão entre aspas no report.
Transcrições novas, direto do Drive. Em Closers → Inteligência, cole o link da pasta do Google
Drive onde caem as transcrições das calls do closer (as anotações do Google Meet) e a data a partir
da qual ler. Todo documento novo vira um caso dele, e o padrão se atualiza (src/transcricoes.js,
src/driveGoogle.js):
.docx), .txt e atalho para um deles; vídeo e o resto ficam de fora;TRANSCRICAO_ONBOARDING, padrão Carlos);Para funcionar: ative a Google Drive API no projeto do Google Cloud do aplicativo e conecte o
Google de novo no painel (a permissão drive.readonly é nova). A conta conectada precisa ter acesso à
pasta.
Ligar e desligar. Na aba Closers, cada closer com inteligência tem o botão Desligar análise
(e depois Ligar análise). Desligada, o botão some do popup de todo mundo e POST /api/afinidade
responde 403, sem chamar a IA; o texto da inteligência continua guardado, é só ligar de novo.
Seis campos na aba Base: empresa, oferta e valores, perfil de cliente, roteiro, régua de
qualificação (SPIN e BANT) e objeções. Entram no prefixo em cache de todo report. Campo nunca
escrito vem com o texto recomendado (src/baseInicial.js, versão 3), montado
com os scripts, apresentações, contratos e a análise de 12 reuniões que viraram venda
(docs/analise-calls-vendas.md). Uma versão nova só substitui o
campo que ninguém editou; Voltar aos textos anteriores desfaz a migração.
Em SUA_URL/. As abas aparecem conforme o papel.
| Aba | Para | O que faz |
|---|---|---|
| Gerar report | todos | Report sem a extensão, em formato de chat (abaixo). |
| Reports do dia | todos | Lista do dia e .zip para o líder; gestor e master veem a equipe. |
| Acessos | master | Chaves da equipe, papel e os três recursos por pessoa. |
| Reports gerados | gestor, master | Números, custo por SDR, closer e resultado de cada report. |
| Resultados da reunião | master | Resultado por reunião, inteligência e insights. |
| Closers | master | Lista de closers. |
| Arquivos | gestor, master | PDFs guardados; download individual, por SDR ou tudo em .zip. |
| Base | gestor, master | Base de conhecimento. |
| Extensão | gestor, master | Download do .zip e teste da ficha do RD. |
Report em formato de chat. Escreva fala por fala (Lead ou Eu), cole a conversa inteira ou anexe e arraste áudios (transcritos), prints (lidos como conversa) e arquivos de texto. Cada fala vira uma bolha removível; o texto final continua editável. PDF e Word ainda não são lidos.
Print e celular. O print é lido pelo modelo de visão do Groq (custo zero); o painel reduz a
imagem antes de enviar e o servidor confere o tipo pelos magic bytes. É o caminho para quem
atende pelo telefone, onde a extensão não roda: tira o print e abre o painel no navegador do
celular. Sem print, o Exportar conversa do WhatsApp gera um .txt para colar.
Reports do dia. Quando o SDR refaz o report de um lead, vale o último (src/diario.js
agrupa por SDR + dia + contato). Dá para marcar outra versão antes de baixar. O mesmo .zip sai
pelo botão Baixar meus reports de hoje do popup.
Autenticação por cabeçalho x-cr-key (a chave do usuário). gestor+ = master, gestor ou a
ADMIN_PASSWORD em x-admin-pass.
| Rota | Acesso | Para quê |
|---|---|---|
POST /api/report-direto | chave | Report a partir das mensagens lidas pela extensão. |
POST /api/report-texto | chave | Report a partir de texto (painel). |
POST /api/pdf | chave | Refaz o PDF de um report editado — sem IA. |
POST /api/transcrever | chave | Transcreve um áudio (cache pelo hash dos bytes). |
POST /api/ler-imagem | chave | Lê um print de conversa. |
POST /api/estimar-custo | chave | Estimativa de custo, sem IA. |
GET /api/reports/:id/pdf | chave | Reabre o PDF (o dono; gestor e master, qualquer um). |
POST /api/reports/:id/closer | chave | Define o closer do próprio report (gestor e master, de qualquer um). |
GET /api/closers | chave | Closers (id e nome) e a indicação para um perfil. |
| Rota | Acesso | Para quê |
|---|---|---|
POST /api/crm/lead | chave + popup do lead | Ficha do RD do lead da conversa. |
POST /api/crm/respondeu | chave + ficha do lead | Avança o card para "Respondeu" (todos os usuários; confere a data da resposta). |
GET /api/master/diagnostico | master | Confere, sem alterar nada, se a automação do "Respondeu" e a cor da agenda têm tudo no lugar, e mostra a última vez que cada uma funcionou. |
POST /api/master/trazer-vendas-rd | master | Traz as vendas de um closer direto do RD (cards ganhos em que o usuário é o SDR). |
GET /api/report-dia · PUT /api/report-dia | chave | Report automático do dia: contagem, desqualificados, o que foi digitado e o texto pronto. |
POST /api/conversa/mapa · POST /api/conversa/perguntar | chave com o popup do lead | Mapa da conversa e perguntas sobre ela, depois do resumo rápido (IA gratuita; a conversa vem do cartão). |
POST /api/atividade | chave com a automação do cartão | A extensão avisa o que viu numa conversa hoje (escrevi / havia histórico / o lead escreveu). |
GET /api/crm/motivos-perda · POST /api/crm/desqualificar | chave com a automação do cartão | Botão Desqualificar: os motivos de perda do RD e a perda no card do lead da conversa. |
GET /api/master/limpeza-rd/funis · GET …/previa · POST …/executar · POST …/desfazer · GET …/relatorio | master | Limpeza do funil no RD: prévia, lotes, desfazer e relatório por motivo. |
GET/POST /api/master/limpeza-rd/duplicados | master | Cadastros duplicados no funil: a busca (sem alterar nada) e o fechamento em lotes como "Duplicado". |
POST /api/rd/atualizar | chave | Batida de hora em hora da extensão: põe venda, follow-up, perda e closer dos reports em dia com o RD (no máximo a cada 30 min). |
POST /api/lead/marca | chave + automação | Etiqueta "Qualificado" e agendamento. |
| Rota | Acesso | Para quê |
|---|---|---|
GET /api/eu | chave | Nome, papel e recursos liberados. |
GET /api/meus-reports · POST /api/meus-reports/zip | chave | Reports do dia do próprio usuário. |
GET /api/equipe-reports · POST /api/equipe-reports/zip | gestor+ | Reports do dia da equipe. |
GET /api/admin/stats | gestor+ | Números e custo. |
PATCH /api/admin/reports/:id/resultado | gestor+ | Closer, resultado, datas e correções. |
DELETE /api/admin/reports/:id | gestor+ | Remove o report e o PDF. |
GET /api/admin/reports/:id/pdf · GET /api/admin/reports/pdf-zip | gestor+ | PDFs guardados. |
GET/POST /api/admin/base · …/recomendada · …/restaurar | gestor+ | Base de conhecimento. |
GET /api/admin/closers | gestor+ | Lista completa de closers. |
POST /api/admin/crm/teste | gestor+ | Busca no RD sem cache, com o passo a passo. |
POST/DELETE /api/admin/closers | master | Adiciona e remove closers. |
PATCH /api/admin/closers/:id | master | Apelido e inteligência do closer (alimenta a afinidade); analiseAtiva liga e desliga a análise. |
POST /api/admin/closers/importar | master | Pacote do closer: cadastro, apelido, inteligência e casos das calls. |
GET /api/admin/closers/:id/padrao | master | As contas dos casos do closer (transcrições + reuniões com resultado). |
POST /api/admin/closers/:id/drive/ler · GET …/drive | master | Lê os documentos novos da pasta do Drive do closer; lista os casos lidos e a última leitura. |
PATCH/DELETE /api/admin/closers/:id/casos/:caso | master |
Do RD Station CRM (API v1) o servidor lê /contacts, /deals/{id}, /activities, /users,
/custom_fields e /deal_pipelines, e escreve só PUT /deals/{id} com deal_stage_id.
Tudo tem padrão seguro no código; o .env.example traz a lista comentada.
| Variável | Quando | Descrição |
|---|---|---|
ANTHROPIC_API_KEY | sempre | Gera os reports. |
ADMIN_PASSWORD | sempre | Acesso reserva do painel; cria o primeiro master. |
GROQ_API_KEY | produção | Áudio, print e insights. Local sem ela: faster-whisper. |
KV_REST_API_URL · KV_REST_API_TOKEN | produção | Banco (Vercel KV / Upstash; também aceita UPSTASH_REDIS_REST_URL e UPSTASH_REDIS_REST_TOKEN). Vazias: data/*.json. |
CRM_API_TOKEN | ficha do lead | Token do CRM. Um token pcrm_… liga o PronixCRM (crm.pronixhub.com.br); outro valor, o RD Station. Tem prioridade sobre RDSTATION_CRM_TOKEN. |
RDSTATION_CRM_TOKEN | ficha do lead | Token do RD Station CRM (ou pcrm_…, do PronixCRM). Vazio, junto com CRM_API_TOKEN: ficha desligada. |
CRM_API_URL | ficha do lead | Força a base da API do CRM (padrão: pelo token). |
| Variável | Padrão | Descrição |
|---|---|---|
LLM_PROVIDER | anthropic | anthropic ou ollama (local, custo zero). |
ANTHROPIC_MODEL | claude-sonnet-5 | Modelo dos reports; precisa de preço em src/precos.js. |
ANTHROPIC_MODEL_ECO · ANTHROPIC_MODEL_PREMIUM | claude-haiku-4-5 · claude-opus-4-8 | Só com qualidade explícita no pedido. |
ANTHROPIC_MODEL_RESUMO | o dos reports | Modelo do resumo rápido. |
GROQ_MODEL | whisper-large-v3-turbo | Transcrição. |
GROQ_VISION_MODEL | qwen/qwen3.6-27b | Leitura de print (reserva: qwen/qwen3.8-27b). |
GROQ_COACH_MODEL | fila padrão | Modelo a tentar primeiro nas análises gratuitas (insights e afins). O nome ficou do antigo coach. |
OLLAMA_MODEL · OLLAMA_URL | llama3.1 · localhost:11434 | Só com LLM_PROVIDER=ollama. |
| Variável | Padrão | Descrição |
|---|---|---|
CRM_CACHE_TTL_SEG · CRM_TIMEOUT_MS | 300 · 8000 | Cache da ficha e tempo máximo por chamada. |
CRM_PALAVRAS_IGNORADAS | — | Etiquetas extras a tirar do nome salvo (separadas por vírgula). |
CRM_MOVER_ETAPA | ligado | 0 desliga a escrita no RD; as etiquetas continuam. |
CRM_ETAPA_RESPONDEU · CRM_ETAPA_QUALIFICADO | Respondeu · Qualificado | Nome das etapas, se o time renomear. |
CRM_ETAPA_NAO_COMPROU | Não compraram | Etapa dos closers que encerra o report como "não fechou". |
CRM_ETAPA_VENDIDO · CRM_ETAPA_FUP | Vendido · Fluxo de FUP | Etapas dos closers que viram "Vendido no RD" e "Em follow-up". |
CRON_SECRET | — | Segredo do agendador diário da Vercel que confere vendas e perdas no RD. |
| Variável | Padrão | Descrição |
|---|---|---|
GOOGLE_CLIENT_ID · GOOGLE_CLIENT_SECRET | — | Cliente OAuth do Google Cloud. Vazias: recurso desligado. |
GOOGLE_REFRESH_TOKEN | — | Opcional: a autorização da conta, em vez de conectar pelo painel. |
GOOGLE_TIMEOUT_MS | 8000 | Tempo máximo de cada chamada ao Google. |
| Variável | Padrão | Descrição |
|---|---|---|
MAX_CONVERSATION_CHARS | 24000 | Teto da conversa antes do prompt. |
MAX_REPORT_OUTPUT_TOKENS | 4000 | Teto de saída pedido à Anthropic. |
MAX_AUDIO_BYTES · MAX_AUDIO_TRANSCRIPTION_CHARS | 20971520 · 6000 | Tamanho do áudio e da transcrição. |
MAX_IMAGEM_BYTES | 4194304 | Tamanho do print. |
MAX_RESUMO_CHARS | 16000 | Conversa enviada ao resumo. |
TRANSCRIPTION_CACHE_TTL_SEG | 86400 | Cache da transcrição; 0 desliga. |
ANTHROPIC_TIMEOUT_MS · GROQ_TIMEOUT_MS | 50000 | A Vercel corta a função em 60 s. |
USD_BRL_RATE | 5.3 | Câmbio fixo, só para exibir a estimativa em reais. |
TZ_RELATORIO | America/Sao_Paulo | Fuso que define o "dia" de cada report. |
COMPANY_NAME · SDR_NAME | PRONIX · — | Nome no PDF; SDR_NAME é só reserva para uso sem chave. |
MASTER_NOME | Cauã Lima | Quem é promovido enquanto não houver master. |
PORT · CR_DATA_DIR | 3000 · data/ | Servidor local. |
PYTHON_BIN · WHISPER_MODEL_SIZE | python · small | Transcrição local, sem Groq. |
Tudo em src/db.js (Redis em produção, data/*.json local). A conversa não é guardada.
| Chave | Conteúdo |
|---|---|
usuarios | Acessos: nome, chave, papel e recursos. |
reports | Histórico (até 5.000): lead, contato, SDR, custo, leitura da IA, closer e resultado. |
consumo | Custo por geração — continua valendo se o report for removido. |
pdf_<id> | O PDF de cada report. |
base | Base de conhecimento (com os textos anteriores, para restaurar). |
closers | Lista de closers, com o apelido e a inteligência de cada um. |
crm_cards | Card escolhido para cada lead com mais de um. |
google_agenda | Autorização da conta conectada ao Google Agenda (só no servidor). |
lead_marcas | Etiqueta "Qualificado" e agendamento por lead (até 4.000). |
crm_movimentos | Registro de cada card movido para "Respondeu" (últimos 500). |
crm_transcricoes | Registro de cada transcrição mandada ao CRM (últimos 500: card, ok/erro — sem o texto da conversa). |
rd_limpeza_relatorios | Um relatório por execução da limpeza: quando, funil e quantos cards por motivo (últimos 400). |
rd_limpeza_log | Cada card desqualificado pela limpeza do funil: de que etapa saiu, o motivo e quando (últimos 8.000). É o que permite desfazer. |
aprendizado_consciencia | Correções do nível de consciência (até 200). |
insights_ultimo | Últimos insights gerados. |
cache:* | Temporários: transcrições, ficha do RD (5 min), funis (1 h), resumos (7 dias). |
scripts/migrar-dados.js copia todas as chaves permanentes de um banco Upstash/KV para outro
(usuários, reports, resultados, base de aprendizado...). As credenciais ficam só em variáveis de
ambiente da janela do terminal: ORIGEM_URL, ORIGEM_TOKEN, DESTINO_URL e DESTINO_TOKEN.
node scripts/migrar-dados.js # só lista o que seria copiado
node scripts/migrar-dados.js --copiar # copia de fato
Não apaga nada na origem; no destino, substitui a chave de mesmo nome. Chaves temporárias (cache e travas) ficam de fora.
npm test
393 testes, sem rede, sem chave real, sem custo e sem tocar em data/ (o banco é uma pasta
temporária). O jsdom roda os scripts reais da extensão e do painel.
| Arquivo | O que cobre |
|---|---|
servidor.test.js | A API com IA e Groq simulados: acessos, geração, duplicado, PDFs, resultado, áudio. |
qualidade.test.js | Conferência de citações e normalização da conversa, em casos sintéticos. |
report-rico.test.js | Nível de consciência, "Como foi a conversa", sinais de compra e o limite de 2 páginas. |
extensao-dom.test.js | Leitura da conversa no WhatsApp e no Instagram: ordem, remetente, áudios, troca de conversa. |
ficha-crm.test.js | O cartão no WhatsApp: ficha, busca, vários cards, resumo, painel lateral e a ficha guardada na aba. |
automacao-dom.test.js | Mover para "Respondeu", etiqueta e agendamento no cartão. |
automacao.test.js | A escrita no RD e as marcas do lead, com RD simulado. |
agenda.test.js | Leitura de dia e horário nas mensagens. |
crm.test.js | Busca do lead no RD: telefone, nome, duplicados, cache. |
resumo.test.js | Resumo rápido no servidor, com IA simulada. |
inteligencia.test.js | Perfil, closer × perfil, resultados, calibragem e base recomendada. |
diario.test.js | Regra do .zip do dia (vale o último report de cada lead). |
painel.test.js | O painel inteiro com API falsa. |
popup.test.js | Popup da extensão. |
audio-cliente.test.js · auditoria.test.js | Validador de áudio e correções da auditoria. |
Os testes não substituem o uso real: WhatsApp e Instagram mudam de layout sem avisar, e a qualidade do texto gerado pela IA só se confere em reports de verdade.
git push origin main — a Vercel publica sozinha (vercel.json manda tudo para
api/index.js, com limite de 60 s por função).Mudança só no servidor ou no painel: basta o push.
Qualquer mudança em extension/ exige versão nova:
version em extension/manifest.json.npm run empacotar — gera public/PRONIX-extensao.zip.Não é preciso sincronizar as duas publicações: recurso que o outro lado ainda não conhece fica desligado até ele ser atualizado.
localhost em desenvolvimento) e ignora endereço vindo da página.A política completa, exigida pela Chrome Web Store, está em /privacidade
(public/privacidade.html).
extension/content.js e
extension/content-instagram.js são os arquivos mais sensíveis do projeto.scrollTop. Por isso a leitura navega com scrollIntoView,
costura cada janela na anterior pela maior sobreposição de sequência e captura o áudio no
momento em que a bolha aparece.[áudio].server.js Rotas: páginas, report, cartão do lead, gestão
api/index.js · vercel.json Entrada e configuração da Vercel
src/
report.js Prompt do report, chamada à IA, validação da resposta
conversation-normalizer.js Limpa, agrupa e corta a conversa antes do prompt
citacoes.js Conferência das citações e filtro de falas, sem IA
consciencia.js · perfil.js Nível de consciência e perfil do lead (a mesma régua em tudo)
generatePdf.js PDF com a marca PRONIX, até 2 páginas
idempotencia.js Hash da conversa (reportKey)
precos.js · stats.js Preço por modelo; histórico, custo e resultados
pdfStorage.js · diario.js PDFs guardados; regra do .zip do dia
transcribe.js · groq.js Transcrição, visão e chat gratuito (com fila de modelos)
resumoRapido.js Resumo rápido da conversa
crm.js · leads.js RD Station (ficha e mover etapa); etiqueta e agendamento por lead
inteligencia.js Closer × perfil, padrões da prospecção, insights
aprendizado.js Correções que calibram o nível de consciência
base.js · baseInicial.js Base de conhecimento e o texto recomendado
usuarios.js · closers.js Acessos, papéis e recursos; lista de closers
db.js Redis em produção, arquivos localmente; cache e trava
extension/ Extensão MV3
content.js WhatsApp: leitura da conversa, áudios e cartão do lead
sidepanel.html · painel.js Painel lateral do Chrome: lead e negociações, cada uma com link para o card
agenda.js Leitura de agendamento e de "lead respondeu" (sem rede)
content-instagram.js Instagram Direct: leitura da conversa e dos áudios
inject.js Gancho de áudio no contexto da página
background.js Service worker: fala com o servidor
popup.html · popup.js Gerar, editar e baixar o report; chave e servidor
public/
dashboard.html O painel
dia.html Resumo do dia
privacidade.html Política de privacidade
PRONIX-extensao.zip Gerado por `npm run empacotar`
tests/ 22 arquivos; helpers/dom.js simula WhatsApp e Instagram
docs/ Sistema visual, auditoria, plano, checklist e análise das calls
scripts/transcribe.py faster-whisper local (só sem GROQ_API_KEY)
GUIA-SDR.md — instalação e uso para quem só gera reports.docs/design.md — o sistema visual (papel, tinta e marca-texto): tokens, regras e onde vale.docs/analise-calls-vendas.md — o que 12 reuniões que viraram
venda ensinam (sem dados de clientes).docs/checklist-pendencias.md — o que entrou em cada versão e
o que falta conferir.docs/auditoria-pronix.md — status de cada achado da auditoria.docs/plano-implementacao.md — o que falta, em etapas.O PronixCRM (crm.pronixhub.com.br/api/v1) é uma cópia da API v1 do RD, e o mesmo código (src/crm.js) fala
com os dois: o token pcrm_… decide. O que muda no PronixCRM, e já é tratado:
Authorization: Bearer (nunca na URL);/deals?contact_id e o
detalhe do contato (os e-mails são o que acha a reunião no Google Agenda, para pintar);POST /deals/:id/stage com a versao lida; perder/desqualificar é
POST /deals/:id/lost (a etapa "Desqualificado" vai junto quando é etapa de perda do funil);/deals ignora win, user_id e closed_at_period: quem lista (Match, vendas do closer,
report do dia) usa sdr_id, o funil dos closers e a janela updated_at_period, e confere o resto aqui;updated_at (só a que mudou é relida). O token age em nome de quem o gerou.A ficha olha todos os cards do lead (os cadastros repetidos também) e o histórico de etapas de cada um
(historicoComercial em src/crm.js): JÁ COMPROU (card ganho), JÁ FEZ REUNIÃO (passou por reunião realizada,
FUP, negociação ou venda), JÁ TEVE REUNIÃO MARCADA e JÁ PASSOU PELOS CLOSERS (funil com "closer" no nome) —
com a data, o closer (dono do card) e o card. Aparece em destaque no topo do painel lateral e no cartão, para todos.
Do card da conversa só contam fatos passados (a reunião marcada dele já está na ficha).
No card da conversa, Mudar etapa à mão: para quando a automação falha (ex.: não foi para "Respondeu"). Lista as
etapas do funil do card, sugere "Respondeu" quando o card está antes dela e move só ao confirmar. Para todos com a
ficha do lead. O servidor confere de novo que o card é do lead da conversa, está em aberto e a etapa é do mesmo
funil; reunião, FUP, negociação, venda, perda e etapas que pedem closer ficam de fora (têm botão próprio). Registra
em crm_movimentos com manual: true (POST /api/crm/etapas, POST /api/crm/etapa).
A cada report do WhatsApp, a conversa inteira (com os áudios já transcritos) vai para o card do lead no PronixCRM:
POST /deals/:id/whatsapp_transcripts com transcript ("[21/10/2026 10:05] Nome: …", hora de Brasília), started_at,
ended_at, phone e external_id (a impressão digital do texto: a mesma conversa mandada de novo não duplica).
Vai também como anotação no card (é o que aparece no Histórico do card; uma vez por conversa, em partes de
20 mil caracteres se o CRM recusar uma só). Roda em paralelo com o report, sem custo de IA (src/transcricaoCrm.js). Vai também quando o report já existia — é
assim que um lead de antes chega ao CRM: gerar o report de novo. A conversa não fica guardada no servidor, então
reports antigos só vão quando forem gerados de novo. Instagram não vai; sem card, CRM recusando ou CRM_TRANSCRICAO=0,
o report sai igual.
POST /api/master/importar-reportssrc/importarReports.jsDe hora em hora. A conferência roda sozinha: a extensão bate no servidor a cada hora enquanto o
Chrome está aberto (POST /api/rd/atualizar), a aba Resultados confere ao abrir, o agendador da
Vercel roda uma vez por dia (/api/cron/rd, com CRON_SECRET) e o botão Puxar do RD confere
na hora. Para não gastar consulta à toa: nunca roda mais de uma vez a cada 30 min, olha no máximo
10 a 25 leads por rodada, report recente conferido há menos de 50 min e report antigo conferido há
menos de 20 h ficam para a próxima. É só leitura no RD e não usa IA.
Achar o card certo. O nome do contato no WhatsApp não serve para achar o lead no RD. Ao gerar o report, a extensão manda o que o cartão aberto sabe do card — id do contato, e-mail e telefone — e o report fica vinculado. A busca vai pelo e-mail, depois pelo telefone (os dois enxergam os cadastros repetidos do mesmo lead, onde o card da reunião às vezes está), depois pelo id e, por último, pelo nome. Cada linha mostra o que o RD respondeu ("RD: Reunião Realizada · CLOSERS · Fulano"). Lead não achado aparece em vermelho com um campo para informar o e-mail ou o telefone: o sistema vincula e confere na hora. Reports antigos se vinculam sozinhos quando a conversa é reaberta com o cartão na tela.
Conferir uma pessoa. Em "Reports de", o master escolhe ver os resultados de um usuário.
Dados da venda. Na venda, a linha ganha produto (PRONIX Performance ou Acelera), ticket e forma de pagamento. O valor do card vendido no RD já vem como ticket, se o campo estiver vazio.
Etapas do funil dos closers. "FUP Agendado" e "Fluxo de FUP" marcam "Em follow-up" ("Em contato" e "Negociação Avançada" também, quando o card está no funil dos closers), "Vendido" vale como venda mesmo sem o card estar marcado como ganho, e o responsável do card que está com um closer vira o closer do report — mesmo que o lead tenha outro card ainda no funil do pré-vendedor.
No-show não é reunião. Sai da lista de resultados (volta com "Mostrar no-show"), fica fora do .zip do dia e não conta como venda perdida do closer.
Perfil com critério. A IA testa os perfis em ordem e exige prova na fala do lead; "cauteloso" só com hesitação dita, para não virar o perfil de todo lead educado.
Sem amostra, sem indicação. O closer só é indicado com 3 ou mais reuniões dele com aquele perfil, com taxa suavizada (1 de 1 não passa na frente de 8 de 10).
A IA aprende o nível de consciência de graça. Cada correção do master vira um exemplo no prompt dos próximos reports (os 8 mais recentes). Não há treino de modelo.
Escopo. Resultados e inteligência usam os reports de quem está olhando; o seletor "Toda a equipe" inclui os demais.
POST /api/resumo-rapido |
| chave + popup do lead |
| Resumo rápido da conversa. |
POST /api/afinidade | chave | Nota de 0 a 10 do lead para um closer, com motivos e o PDF. |
| Corrige ou apaga um caso lido do Drive. |
GET/POST/PATCH/DELETE /api/admin/usuarios | master | Acessos da equipe. |
GET /api/master/resultados · GET /api/master/inteligencia · POST /api/master/insights | master | Resultados, inteligência e insights. |
GET /api/status | pública | Verificação de conexão. |