CRM web de prospecção multicanal. Encontre leads no Google Maps, Instagram e LinkedIn (via Apify), organize-os em campanhas, trabalhe um funil de cadência no Kanban, agende retornos, dispare campanhas de e-mail e acompanhe tudo em um dashboard — com controle de acesso por equipe.
Stack: React + Vite + TypeScript · Tailwind CSS · Supabase (PostgreSQL + Auth + RLS) · Funções serverless na Vercel · Resend (e-mail) · Apify (scraping)
Toda a documentação detalhada está na pasta docs/:
| Documento | Conteúdo |
|---|---|
| Arquitetura | Visão geral, frontend, backend, multi-tenant e fluxo de dados |
| Banco de dados | Tabelas, funções, triggers, RLS e migrations |
| Funcionalidades | Campanhas, leads, funil, dashboard, equipe, e-mail, CSV |
| Integrações | Apify (Google/Instagram/LinkedIn), Resend e localidades |
| Deploy e setup | Variáveis de ambiente, Supabase, Vercel e execução local |
| Histórico do projeto | Linha do tempo da construção do CRM e decisões de design |
- Busca de leads (Apify): Google Maps, Instagram (com filtro por cidade/país, bairros e DDD, cruzamento por hashtag e método "local") e LinkedIn (decisores com cargo, empresa e e-mail).
- Campanhas: agrupam leads por origem e nicho; deduplicação automática (telefone / link do perfil) ao importar.
- Funil de cadência: Kanban com as etapas A contatar → Dia 1..7 → Respondeu → Reunião marcada → Virou cliente / Perdido.
- Painel do lead: todas as informações, histórico de atividades, status, prioridade e agendamento de retorno.
- Para contatar: leads com retorno vencido aparecem com alerta e contagem no menu.
- Dashboard: métricas do funil, taxa de conversão e performance por membro.
- Equipe e permissões: papéis
admin/membere acesso por campanha. - Localidades: base editável (admin) de cidades → apelidos, DDDs e bairros, usada para refinar as buscas do Instagram.
- Campanhas de e-mail: disparo em massa via Resend para os leads filtrados.
- Importar/Exportar CSV.
# 1. Instalar dependências
npm install
# 2. Configurar o Supabase (ver docs/DEPLOY.md)
cp .env.example .env # preencha VITE_SUPABASE_URL e VITE_SUPABASE_ANON_KEY
# 3. Rodar localmente
npm run dev # http://localhost:5173O passo a passo completo (criar o projeto Supabase, rodar o schema + migrations, publicar na Vercel) está em docs/DEPLOY.md.
/api
enviar-emails.ts → função serverless (Vercel) que envia e-mails via Resend
/src
/components → Layout, LeadDrawer, ApifySearchModal, CsvImportModal,
EmailMassaModal, ManualLeadsModal, StatusBadge, ...
/pages → Login, Dashboard, Campaigns, CampaignDetail, Retornos,
Equipe, Localidades, RedefinirSenha
/hooks → useAuth (Supabase Auth + perfil), useEquipe
/lib → supabase (client), apify (buscas), localidades (filtro),
utils (funil, datas, links), csv (parse/export)
/types → tipos TypeScript do domínio
/supabase
schema.sql → schema base (rodar primeiro no SQL Editor)
migration-*.sql → migrations incrementais (ver docs/BANCO-DE-DADOS.md)
npm run dev # desenvolvimento local (Vite)
npm run build # build de produção (tsc -b && vite build)
npm run preview # pré-visualizar o buildO Dockerfile faz um build multi-stage (Node para compilar, Nginx para servir a SPA):
# Build da imagem (passe as suas chaves do Supabase como build-args)
docker build \
--build-arg VITE_SUPABASE_URL=https://xxxx.supabase.co \
--build-arg VITE_SUPABASE_ANON_KEY=sua-anon-key \
-t mapeia .
# Rodar
docker run -p 8080:80 mapeia # http://localhost:8080O container serve apenas a SPA. A função serverless de e-mail (
api/enviar-emails.ts) é específica da Vercel e não roda no container.
Um workflow do GitHub Actions (.github/workflows/ci.yml) roda a cada push e pull request na main, validando o build (checagem de tipos + Vite). O status aparece no badge no topo deste README e em cada commit.
| Variável | Onde | Para quê |
|---|---|---|
VITE_SUPABASE_URL |
Vercel + .env local |
URL do projeto Supabase |
VITE_SUPABASE_ANON_KEY |
Vercel + .env local |
Chave pública (anon) do Supabase |
RESEND_API_KEY |
Vercel (serverless) | Envio de e-mails via Resend |
EMAIL_REMETENTE |
Vercel (serverless) | Remetente das campanhas de e-mail |
O token da Apify não é variável de ambiente — cada usuário informa o próprio token na tela de busca, salvo apenas no navegador (localStorage).
Deploy contínuo na Vercel: todo push na branch main publica automaticamente. Detalhes e solução de problemas (inclusive quando a Vercel "perde" um push) em docs/DEPLOY.md.
⚠️ Commits precisam do e-mail de autor autorizado no projeto da Vercel, senão o deploy é bloqueado.
Distribuído sob a licença MIT — veja LICENSE. Você pode usar, copiar, modificar e distribuir livremente, inclusive comercialmente, mantendo o aviso de copyright. O software é fornecido "como está", sem garantias.
Ao copiar este projeto, use a sua própria infraestrutura (seu Supabase, suas chaves). Os dados de cada instalação ficam no banco de quem a hospeda — o código é público, os dados não.