CRM, prospecção, metas, propostas e IA em uma única plataforma. Construído para equipes que vendem todo dia.
Dashboard
Receita do mês
Pipeline
R$ 482k
Fechado
R$ 127k
Meta
R$ 150k
Acme Ltda
Proposta enviada
R$ 18.400
Vértice S.A.
Negociação
R$ 32.900
Norte Digital
Fechamento
R$ 9.750
Plataforma
Pare de pular entre planilhas, CRMs antigos e chatbots avulsos. A INFINDA conecta o fluxo inteiro — do lead frio ao contrato assinado.
Clientes, deals e histórico em um Kanban rápido, focado em quem vende todo dia.
Enriqueça leads por CNPJ, CEP e bairro com dados públicos e score automático.
Briefings, propostas e tarefas geradas por IA — menos digitação, mais fechamento.
Acompanhe metas individuais e do time com indicadores em tempo real.
Formulários inteligentes com link público para o cliente preencher em minutos.
Visão clara de receita, pipeline, conversão e produtividade do time.
Por que INFINDA
Construído lado a lado com gestores comerciais que cansaram de adaptar ferramentas genéricas. A INFINDA já vem com os processos certos prontos para usar.
Setup em 1 semana
Importe leads e ative o time rápido.
Multi-tenant seguro
Isolamento por empresa e papel.
Indicadores em tempo real
Decisões com dados quentes.
IA nativa
Atende, qualifica e propõe por você.
4 perfis com atividade real, 13.064 prospects na organização:
| Perfil (id abreviado) | Disparos | Registros de status | Leads disparados com duplicata ainda na fila |
|---|---|---|---|
| e3c71f7e… | 840 | 1.278 | 260 |
| f8ff286c… | 139 | 202 | 42 |
| 95d2bcef… (Juliana) | 176 | 312 | 45 |
| 18ca99db… | 36 | 70 | 3 |
A tabela prospects tem 1.716 CNPJs repetidos (2.066 linhas extras) e 1.714 nomes de empresa repetidos. O status de contato é privado por linha de prospect, não por empresa. Então, quando o operador dispara na linha A, a linha B da mesma empresa continua como "Não contatado" e reaparece na fila — é exatamente o "cliente disparado que está retornando". Isso atinge ~1 em cada 3 leads disparados do perfil mais ativo.
Além disso, a trava de 24h é por prospect_id, então a duplicata não é travada: o operador dispara de novo no mesmo WhatsApp e queima o lead.
Dos 1.858 registros de status, 1.374 foram gravados com texto humano (Status alterado para "Perdido", "Fechado / Ganho", "Qualificado"…) e só 484 no formato canônico status:<chave>. O leitor só reconhece o formato canônico, então 100 leads marcados como Perdido e outros marcados como Qualificado/Fechado voltam a ser lidos como "Primeiro contato". Simulação sobre a base real: 1.090 pares usuário/lead com disparo, 0 caem em "Não contatado" (a trava atual funciona), mas os desfechos manuais são apagados na leitura.
loadPrivateStatesFromTouchpoints percorre 13k prospects em ~66 lotes sequenciais e, em qualquer erro de rede, faz return out com o mapa parcial. Todo lead não coberto volta a aparecer como "Não contatado" naquele carregamento — sintoma intermitente de "voltou tudo pra fila".
prospects: para cada grupo com o mesmo CNPJ (raiz de 8 dígitos quando não há 14) ou mesmo nome+cidade, manter a linha mais antiga como canônica, repontar prospect_touchpoints, cad_leads e dados de enriquecimento para ela e marcar as extras como arquivadas (nova coluna merged_into uuid — nada é apagado, dá para reverter).Perdido, Fechado / Ganho, Qualificado, Agendado, Em andamento…) para as chaves internas, com precedência para o registro mais recente; toda gravação nova usa somente status:<chave>. Backfill idempotente reescreve os 1.374 registros antigos no formato canônico./usuarios (Owner/Admin): por membro, disparos, leads em cadência, duplicatas ainda pendentes e último disparo — para conferir depois da correção.scripts/migrations/2026xxxx_prospects_dedupe_identity.sql: coluna merged_into, função de normalização de CNPJ, merge idempotente com repontamento de FKs, índice único parcial (organization_id, cnpj_norm) where merged_into is null, mais GRANTs preservados.src/lib/prospect-identity.ts (novo): identityKey(prospect) compartilhado por prospecção, mapa e trava.src/lib/dispatch-lock.ts: resolve os prospect_id irmãos da mesma identidade antes de checar as últimas 24h.src/lib/prospects-api.ts: normalizePrivateStatus aceita rótulos humanos; leitura com precedência do evento mais recente; loader paralelo com retry e erro propagado; filtro merged_into is null na listagem.src/routes/prospeccao.tsx: hideDispatched e a ordenação de bloqueio usam a identidade da empresa.