🎯 Hunter CRM

Technical Reference v2.0 Março 2026

Hunter CRM - Technical Reference

Versão: 2.0 | Data: Março 2026 | Status: Production


1. Visão Geral

Hunter CRM é um sistema completo de gestão comercial B2B desenvolvido para times de SDRs e Closers. O sistema gerencia todo o ciclo de vendas desde a captação de leads até o fechamento de negócios (deals).

1.1 Stack Tecnológica

CamadaTecnologia |--------|------------| FrontendVite + React 18 + TypeScript UI Frameworkshadcn/ui + Tailwind CSS + Radix UI EstadoTanStack Query (React Query) BackendSupabase (PostgreSQL + Edge Functions + Auth) AutenticaçãoSupabase Auth (email/password) RealtimeSupabase Realtime (WebSockets)

1.2 Métricas do Codebase (Março 2026)

MétricaQuantidade |---------|------------| Arquivos TSX670 Arquivos TS289 Hooks customizados235 Edge Functions67 Migrations SQL434 Páginas/Routes36

1.3 Repositório

  • Lovable Project: https://lovable.dev/projects/67c92fb0-dd2d-4c56-9020-2e6c760b2166
  • Localização: /root/clawd/focus-hunt

  • 2. Arquitetura de Dados

    2.1 Entidades Principais

    `` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ LEADS │────▶│ DEALS │────▶│ CONTACTS │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ LEAD_LISTS │ │ PIPELINES │ │ ACCOUNTS │ └─────────────┘ │ (stages) │ └─────────────┘ └─────────────┘ `

    2.2 Schema: Leads (Tabela Principal)

    A tabela leads é o coração do sistema de prospecção.

    `sql leads { -- Identificação id: UUID (PK) name: TEXT (required) email: TEXT phone: TEXT -- Empresa company_name: TEXT (required) company_cnpj: TEXT company_website: TEXT company_industry: TEXT company_size: TEXT -- '1-10', '11-50', '51-200', '201-500', '500+' company_address: TEXT company_city: TEXT company_state: TEXT -- Status e Fluxo status: TEXT DEFAULT 'new' -- 'new', 'contacted', 'qualified', 'disqualified', 'converted' status_changed_at: TIMESTAMP priority: TEXT -- 'low', 'medium', 'high', 'urgent' -- Atribuição assigned_to: UUID → profiles.id list_id: UUID → lead_lists.id list_assigned_at: TIMESTAMP list_first_contact_at: TIMESTAMP list_sla_deadline: TIMESTAMP list_row_number: INTEGER -- Scoring score: NUMERIC demographic_score: NUMERIC behavioral_score: NUMERIC fit_score: NUMERIC effective_score: NUMERIC decay_multiplier: NUMERIC DEFAULT 1 score_breakdown: JSONB score_updated_at: TIMESTAMP skip_score_calculation: BOOLEAN DEFAULT FALSE -- Qualificação/Desqualificação qualification_notes: TEXT disqualification_reason: TEXT disqualification_reason_id: UUID disqualification_notes: TEXT rejection_reason: TEXT rejected_at: TIMESTAMP rejected_by: UUID -- Recovery (Leads perdidos) in_recovery_cadence: BOOLEAN DEFAULT FALSE recovery_cadence_started_at: TIMESTAMP recovery_assigned_to: UUID recovery_notes: TEXT -- Conversão converted_at: TIMESTAMP converted_to_contact_id: UUID → contacts.id -- Agrupamento (Company Groups) company_group_id: UUID → lead_company_groups.id champion_of_group: BOOLEAN DEFAULT FALSE is_manual_champion: BOOLEAN DEFAULT FALSE -- Reuniões scheduled_meeting_id: UUID scheduled_with_user_id: UUID -- UTM Tracking utm_source: TEXT utm_medium: TEXT utm_campaign: TEXT utm_term: TEXT utm_content: TEXT gclid: TEXT fbclid: TEXT msclkid: TEXT landing_page_url: TEXT referrer_url: TEXT first_visit_at: TIMESTAMP -- Relacionamentos source_id: UUID → lead_sources.id account_id: UUID → accounts.id created_by: UUID → profiles.id -- Metadata custom_fields: JSONB tags: TEXT[] last_activity_at: TIMESTAMP last_contact_at: TIMESTAMP created_at: TIMESTAMP updated_at: TIMESTAMP } `

    2.3 Schema: Deals (Negócios)

    A tabela deals gerencia todo o pipeline de vendas.

    `sql deals { -- Identificação id: UUID (PK) title: TEXT (required) company: TEXT (required) company_cnpj: TEXT -- Contato Principal contact: TEXT (required) contact_email: TEXT contact_phone: TEXT contact_position: TEXT contact_notes: TEXT contact_id: UUID → contacts.id primary_contact_id: UUID → contacts.id -- Pipeline stage_id: UUID (required) → pipeline_stages.id sub_status_id: UUID → deal_sub_statuses.id position: INTEGER -- Ordenação no Kanban days_in_current_stage: INTEGER -- Valores value: NUMERIC -- Valor total do deal mrr: NUMERIC -- Monthly Recurring Revenue list_value: NUMERIC -- Probabilidade e Risco win_probability: NUMERIC (0-100) probability_breakdown: JSONB probability_updated_at: TIMESTAMP risk_level: TEXT -- 'low', 'medium', 'high', 'critical' risk_factors: JSONB -- Tipo de Deal deal_type: TEXT DEFAULT 'new_business' -- 'new_business' | 'recovery' recovery_source_deal_id: UUID → deals.id -- Se recovery, aponta para o deal original recovery_context: TEXT -- Financeiro/Contrato billing_type: TEXT -- 'one_time', 'recurring', 'usage_based' contract_duration_months: INTEGER discount_percent: NUMERIC discount_value: NUMERIC installments: INTEGER payment_method: TEXT contract_link: TEXT -- Discovery/Proposta discovery_acceptance_status: TEXT -- 'pending', 'accepted', 'rejected' discovery_call_link: TEXT proposal_call_link: TEXT -- Status status: TEXT -- 'active', 'won', 'lost', 'archived' is_active: BOOLEAN DEFAULT TRUE won_at: TIMESTAMP lost_at: TIMESTAMP loss_reason_id: UUID → deal_loss_reasons.id loss_notes: TEXT -- Datas expected_close_date: DATE original_expected_close_date: DATE close_date_change_count: INTEGER DEFAULT 0 next_contact_date: DATE last_activity_at: TIMESTAMP -- Atribuição user_id: UUID (required) → profiles.id -- Closer responsável sdr_id: UUID → profiles.id -- SDR que originou squad_id_at_close: UUID → squads.id visible_to: TEXT -- UTM Tracking (herdado do lead) utm_source, utm_medium, utm_campaign, utm_term, utm_content: TEXT gclid, fbclid, msclkid: TEXT landing_page_url, referrer_url: TEXT first_visit_at: TIMESTAMP -- Relacionamentos lead_id: UUID → leads.id account_id: UUID → accounts.id product_id: UUID → products.id source_id: UUID → lead_sources.id -- Metadata notes: TEXT tags: TEXT created_at: TIMESTAMP updated_at: TIMESTAMP } `

    2.4 Schema: Profiles (Usuários)

    `sql profiles { id: UUID (PK) → auth.users.id full_name: TEXT (required) email: TEXT (required) avatar_url: TEXT contact_phone: TEXT job_title: TEXT email_signature: TEXT functional_area: TEXT -- 'vendas', 'marketing', 'operações' reports_to: UUID → profiles.id is_active: BOOLEAN DEFAULT TRUE theme_preference: TEXT DEFAULT 'system' created_at: TIMESTAMP updated_at: TIMESTAMP } `

    2.5 Schema: User Roles (Permissões)

    `sql user_roles { id: UUID (PK) user_id: UUID (required) → profiles.id role: app_role (required) -- Enum created_at: TIMESTAMP }

    -- Enum app_role 'admin' -- Acesso total 'head_comercial' -- Head da área comercial 'lider_tribo' -- Líder de tribo 'lider_prospeccao'-- Líder de prospecção (SDRs) 'lider_closers' -- Líder de closers 'squad_leader' -- Líder de squad 'squad' -- Membro de squad 'closer' -- Closer 'sdr' -- SDR 'bdr' -- BDR 'leader' -- Líder genérico `

    2.6 Schema: Squads (Times)

    `sql squads { id: UUID (PK) name: TEXT (required) description: TEXT color: TEXT -- Hex color functional_area: TEXT matrix_type: TEXT leader_id: UUID → profiles.id is_active: BOOLEAN DEFAULT TRUE created_at: TIMESTAMP updated_at: TIMESTAMP }

    user_squads { id: UUID (PK) user_id: UUID (required) → profiles.id squad_id: UUID (required) → squads.id created_at: TIMESTAMP } `

    2.7 Schema: Pipeline e Stages

    `sql pipelines { id: UUID (PK) name: TEXT (required) description: TEXT color: TEXT is_active: BOOLEAN DEFAULT TRUE created_at: TIMESTAMP updated_at: TIMESTAMP }

    pipeline_stages { id: UUID (PK) pipeline_id: UUID (required) → pipelines.id name: TEXT (required) description: TEXT order: INTEGER (required) -- Ordem no pipeline color: TEXT probability: NUMERIC -- Probabilidade padrão de ganho is_active: BOOLEAN DEFAULT TRUE created_at: TIMESTAMP updated_at: TIMESTAMP } `

    2.8 Schema: Activities (Atividades)

    `sql deal_activities { id: UUID (PK) deal_id: UUID (required) → deals.id activity_type: TEXT (required) -- 'call', 'email', 'meeting', 'whatsapp', 'task', 'note' title: TEXT (required) description: TEXT scheduled_at: TIMESTAMP completed_at: TIMESTAMP completed_by: UUID → profiles.id outcome: TEXT call_disposition: TEXT meeting_type: TEXT no_show_count: INTEGER DEFAULT 0 reschedule_count: INTEGER DEFAULT 0 last_no_show_at: TIMESTAMP last_reschedule_at: TIMESTAMP cancellation_reason: TEXT cancelled_at: TIMESTAMP google_event_id: TEXT google_event_link: TEXT calendar_sync_enabled: BOOLEAN DEFAULT FALSE assigned_users: UUID[] auto_scheduled: BOOLEAN DEFAULT FALSE automation_execution_id: UUID created_by: UUID (required) → profiles.id created_at: TIMESTAMP updated_at: TIMESTAMP }

    lead_activities { -- Mesma estrutura, mas para leads lead_id: UUID (required) → leads.id ... } `

    2.9 Schema: Lead Lists (Listas de Prospecção)

    `sql lead_lists { id: UUID (PK) name: TEXT (required) description: TEXT source_type: TEXT -- 'csv_upload', 'manual', 'api', 'form' status: TEXT -- 'draft', 'processing', 'ready', 'distributed' -- Importação file_name: TEXT file_size_bytes: INTEGER total_rows: INTEGER valid_count: INTEGER error_count: INTEGER duplicate_count: INTEGER progress_percent: INTEGER -- Distribuição distributed_at: TIMESTAMP distributed_by: UUID → profiles.id distribution_rules: JSONB scheduled_distribution_at: TIMESTAMP scheduled_distribution_method: TEXT scheduled_by: UUID -- SLA sla_hours: INTEGER -- Rollback can_rollback: BOOLEAN DEFAULT FALSE rollback_expires_at: TIMESTAMP rolled_back_at: TIMESTAMP -- Metadata created_by: UUID (required) → profiles.id created_at: TIMESTAMP updated_at: TIMESTAMP }

    lead_list_items { id: UUID (PK) list_id: UUID (required) → lead_lists.id lead_id: UUID → leads.id row_number: INTEGER (required) raw_data: JSONB (required) mapped_data: JSONB validation_status: TEXT -- 'valid', 'error', 'duplicate' validation_errors: JSONB duplicate_of_id: UUID duplicate_of_type: TEXT -- 'lead', 'contact', 'deal' created_at: TIMESTAMP } `


    3. Hierarquia e Permissões

    3.1 Estrutura Organizacional

    ` ┌────────────────┐ │ Admin │ └───────┬────────┘ │ ┌───────▼────────┐ │ Head Comercial │ └───────┬────────┘ │ ┌──────────────────┼──────────────────┐ │ │ │ ┌────────▼────────┐ ┌──────▼──────┐ ┌───────▼───────┐ │ Líder Tribo │ │Líder Closers│ │Líder Prospecção│ └────────┬────────┘ └──────┬──────┘ └───────┬───────┘ │ │ │ Squads/Tribos Closers SDRs/BDRs `

    3.2 Regras de Visibilidade

    RolePode VerPode Editar |------|----------|-------------| adminTudoTudo head_comercialTudoTudo lider_triboSua triboSua tribo lider_closersTodos closersClosers sob sua gestão lider_prospeccaoTodos SDRsSDRs sob sua gestão squad_leaderSeu squadSeu squad closerSeus dealsSeus deals sdrSeus leadsSeus leads

    3.3 Command Centers por Role

  • Admin/Head Comercial: Acesso a todos os dashboards
  • Líder Closers: CloserCommandCenter (/closer-command)
  • Líder Squad: SquadCommand (/squad-command)
  • SDR/Closer: MyCommandCenter (/my-command)

  • 4. Fluxos de Negócio

    4.1 Ciclo de Vida do Lead

    ` ┌─────────┐ ┌───────────┐ ┌────────────┐ ┌───────────┐ │ NEW │──▶│ CONTACTED │──▶│ QUALIFIED │──▶│ CONVERTED │ └─────────┘ └───────────┘ └────────────┘ └───────────┘ │ │ │ ▼ │ ┌──────────────┐ └───────▶│ DISQUALIFIED │ └──────────────┘ `

    Status Possíveis:

  • new: Lead recém criado/importado
  • contacted: Primeiro contato realizado
  • qualified: Lead qualificado, pronto para virar deal
  • disqualified: Lead não qualificado (com motivo)
  • converted: Convertido em deal/contato
  • 4.2 Ciclo de Vida do Deal

    ` Pipeline Stages (exemplo): ┌──────────────┐ ┌──────────┐ ┌─────────────┐ ┌───────┐ │ Qualificação │──▶│ Proposta │──▶│ Negociação │──▶│ Ganho │ └──────────────┘ └──────────┘ └─────────────┘ └───────┘ │ │ │ └────────────────┴───────────────┘ │ ▼ ┌─────────┐ │ Perdido │ └─────────┘ `

    Status do Deal:

  • active: Deal em andamento
  • won: Deal ganho (fechado)
  • lost: Deal perdido
  • archived: Deal arquivado
  • 4.3 Sistema de Recovery

    O sistema de Recovery permite reativar deals perdidos há 90+ dias.

    Critérios de Elegibilidade: 1. status = 'lost' 2. lost_at há mais de 90 dias 3. Não existe deal ativo apontando para ele via recovery_source_deal_id

    Campos de Recovery no Deal:

  • deal_type: 'new_business' ou 'recovery'
  • recovery_source_deal_id: ID do deal original perdido
  • recovery_context: Contexto/motivo da reativação
  • Fluxo: ` Deal Original (perdido 90+ dias) │ ▼ [Check Elegibilidade] │ ▼ Criar Recovery Deal ├── deal_type = 'recovery' ├── recovery_source_deal_id = original.id └── recovery_context = "motivo" `

    Nota: Recovery deals podem gerar outros recovery deals (cadeia infinita).

    4.4 Sistema de SLA

    Campos no Lead:

  • list_sla_deadline: Prazo para primeiro contato
  • list_first_contact_at: Data do primeiro contato
  • Campos na Lead List:

  • sla_hours: Horas de SLA configuradas
  • Edge Function: check-sla-expired

  • Roda periodicamente
  • Identifica leads com SLA vencido
  • Gera notificações/alertas
  • 4.5 Sistema de Scoring

    Tipos de Score:

  • demographic_score: Score baseado em dados demográficos (cargo, empresa)
  • behavioral_score: Score baseado em comportamento (abertura de emails, cliques)
  • fit_score: Score de fit com ICP
  • effective_score: Score efetivo (após decay)
  • Decay (Decaimento):

  • decay_multiplier: Fator de decaimento (0-1)
  • last_decay_calculation: Última vez que decay foi calculado
  • Leads sem interação perdem score ao longo do tempo

  • 5. Integrações

    5.1 Google Calendar

    Funcionalidades:

  • Criação de eventos de reunião
  • Sincronização bidirecional
  • Detecção de conflitos
  • Edge Functions:

  • create-google-calendar-event
  • update-google-calendar-event
  • delete-google-calendar-event
  • retry-calendar-sync
  • Campos nas Activities:

  • google_event_id
  • google_event_link
  • calendar_sync_enabled
  • 5.2 Gmail

    Funcionalidades:

  • Sincronização de inbox
  • Tracking de emails enviados
  • Vinculação automática com leads/deals
  • Edge Functions:

  • sync-gmail-inbox
  • send-email
  • receive-email-webhook
  • email-event-webhook
  • 5.3 Mautic (Marketing Automation)

    Funcionalidades:

  • Sincronização de leads
  • Tracking de campanhas
  • Automação de marketing
  • Edge Functions:

  • sync-to-mautic
  • mautic-webhook
  • mautic-proxy
  • mautic-oauth-callback
  • 5.4 WhatsApp (WAHA)

    Funcionalidades:

  • Envio de mensagens
  • Recebimento de mensagens (webhook)
  • Status de visualização
  • Edge Functions:

  • waha-send-message
  • waha-send-seen
  • waha-session
  • waha-webhook
  • waha-debug-groups
  • waha-update-groups
  • 5.5 Twilio VOIP

    Funcionalidades:

  • Ligações telefônicas via browser
  • Gravação de chamadas
  • Transcrição automática
  • Edge Functions:

  • voip-initiate-call
  • voip-end-call
  • voip-recording
  • voip-transcribe-recording
  • voip-download-recording
  • voip-token
  • voip-balance
  • voip-twiml
  • voip-webhook
  • voip-log-call
  • 5.6 GTM (Google Tag Manager)

    Funcionalidades:

  • Tracking de eventos de conversão
  • Batching de eventos
  • Edge Functions:

  • receive-gtm-batch

  • 6. Edge Functions (Backend)

    6.1 Lista Completa (67 funções)

    CategoriaFunçãoDescrição |-----------|--------|-----------| Lead Managementcapture-leadCaptura leads via formulário | delete-leadSoft delete de lead | preview-lead-deletionPreview de deleção | check-lead-recovery-eligibleVerifica elegibilidade para recovery Deal Managementdelete-dealSoft delete de deal | delete-deals-bulkDeleção em massa | preview-deal-deletionPreview de deleção | purge-deleted-dealsPurga permanente | check-recovery-eligibleVerifica elegibilidade List Managementdelete-lead-listDeleta lista de leads | import-leads-batchImportação em batch | process-import-jobProcessa job de importação | finalize-import-scoresFinaliza scores de importação | validate-exportValida exportação User Managementinvite-userConvida novo usuário | reset-user-passwordReset de senha | preview-user-deletionPreview de deleção | cleanup-test-userRemove usuário de teste | upload-signup-avatarUpload de avatar no signup Calendarcreate-google-calendar-eventCria evento | update-google-calendar-eventAtualiza evento | delete-google-calendar-eventDeleta evento | retry-calendar-syncRetry de sincronização Emailsync-gmail-inboxSincroniza inbox | send-emailEnvia email | receive-email-webhookWebhook de email | email-event-webhookEventos de email | process-scheduled-emailsProcessa emails agendados Mauticsync-to-mauticSincroniza com Mautic | mautic-webhookWebhook do Mautic | mautic-proxyProxy para Mautic | mautic-oauth-callbackOAuth callback WhatsAppwaha-send-messageEnvia mensagem | waha-send-seenMarca como visto | waha-sessionGerencia sessão | waha-webhookWebhook WAHA | waha-debug-groupsDebug de grupos | waha-update-groupsAtualiza grupos VOIPvoip-initiate-callInicia chamada | voip-end-callEncerra chamada | voip-recordingGravação | voip-transcribe-recordingTranscrição | voip-download-recordingDownload gravação | voip-tokenToken de autenticação | voip-balanceSaldo | voip-twimlTwiML | voip-webhookWebhook VOIP | voip-log-callLog de chamada Automationprocess-automationsProcessa automações | check-automation-sequencesVerifica sequências | auto-no-show-cronNo-show automático | auto-no-show-general-cronNo-show geral Enrichmentenrich-company-dataEnriquece dados empresa | monitor-enrichment-healthMonitora saúde Distributionprocess-scheduled-distributionsDistribui leads Scoringrecalculate-decay-scoresRecalcula scores SLAcheck-sla-expiredVerifica SLA expirado Meetingsreceive-meeting-analysisAnálise de reunião | transcript-qaQA de transcrição Rankingsnapshot-rankingsSnapshot de rankings GTMreceive-gtm-batchBatch de eventos GTM Accountget-account-by-nameBusca conta por nome Misclead-form-widgetWidget de formulário | heartbeat-receiverHeartbeat | cleanup-orphaned-attachmentsLimpa anexos órfãos


    7. Hooks Principais

    7.1 Organização por Categoria

    Leads (30+ hooks):

  • useLeads, useLead, useCreateLead, useUpdateLead, useDeleteLead
  • useLeadsByListId, useLeadListMetrics, useLeadScoringRules
  • useLeadTimeline, useLeadNotes, useLeadWatchers
  • useLeadEmails, useLeadPhones (multi-contact)
  • Deals (25+ hooks):

  • useDeals, useDeal, useCreateDeal, useUpdateDeal
  • useRecoveryDeals, useArchivedDeals, useArchiveDeal
  • useDealProbability, useDealStakeholders
  • useMarkDealAsLost, useDealActivities
  • Pipeline (10 hooks):

  • usePipelines, usePipelineStages, useAllPipelineStages
  • useDealsByStage, usePipelineMetrics
  • Atividades (15 hooks):

  • useAllActivities, useActivityTracking, useActivityReminders
  • useActivityNotifications, useActivityLiveFeed
  • useActivityHeatmap, useActivityStreak
  • Ranking & Performance (20 hooks):

  • useSDRRanking, useCloserRanking
  • useSquadPerformance, useTeamGoalsPerformance
  • useScorecards, useGoalProgress, useForecast
  • Command Centers (10 hooks):

  • useTeamFunnelMetrics, useCloserPipelineFunnel
  • useManageableClosers, useDealsInLimbo
  • useSquadCommandCompanyBreakdown
  • Analytics (15 hooks):

  • useConversionFunnelData, useAgingAnalysis
  • useAcceptanceTrend, useCallMetrics
  • useOverviewMetrics, useUserAnalytics
  • Integrações (20 hooks):

  • useCalls, useCallTranscriptionSearch
  • useEmails, useGlobalSearch
  • useGoogleCalendar, useCheckCalendarConflicts

  • 8. Contextos e Providers

    8.1 AuthContext

    `typescript interface AuthContextType { user: User | null; profile: Profile | null; roles: AppRole[]; isAdmin: boolean; isLoading: boolean; signIn: (email: string, password: string) => Promise; signOut: () => Promise; hasRole: (role: AppRole) => boolean; hasAnyRole: (roles: AppRole[]) => boolean; } `

    8.2 ViewAsContext

    Permite "ver como" outro usuário (para admins/líderes).

    `typescript interface ViewAsContextType { viewAsUserId: string | null; setViewAsUserId: (id: string | null) => void; effectiveUserId: string; // viewAsUserId ou user.id } `

    8.3 VoIPContext

    Gerencia estado do sistema de VOIP.

    `typescript interface VoIPContextType { isConnected: boolean; currentCall: CallState | null; initiateCall: (phone: string, dealId?: string) => Promise; endCall: () => Promise; mute: () => void; unmute: () => void; } `

    8.4 TimezoneContext

    `typescript interface TimezoneContextType { timezone: string; setTimezone: (tz: string) => void; formatDate: (date: Date, format: string) => string; } `


    9. Páginas e Rotas

    9.1 Mapa de Rotas (36 páginas)

    RotaPáginaDescrição |------|--------|-----------| /DashboardDashboard principal /authAuthLogin/Signup /leadsLeadsGestão de leads /negociosNegociosKanban de deals /negocios-arquivadosNegociosArquivadosDeals arquivados /contatosContatosLista de contatos /contasContasGestão de accounts /atividadesAtividadesTimeline de atividades /conversasConversasChat/mensagens /emailsEmailsInbox de emails /lead-listsLeadListsListas de prospecção /lead-lists/:idLeadListDetailsDetalhes da lista /lead-lists/:id/analyticsLeadListAnalyticsAnalytics da lista /rankingRankingRanking de usuários /closer-commandCloserCommandCenterDashboard de closers /squad-commandSquadCommandDashboard de squad /my-commandMyCommandCenterDashboard pessoal /call-intelligenceCallIntelligenceAnalytics de calls /analisesAnalisesAnalytics geral /analytics/usuariosAnalyticsUsuariosAnalytics de usuários /analytics/enriquecimentoAnalyticsEnriquecimentoAnalytics de enrichment /produtividadeProdutividadeMétricas de produtividade /automacoesAutomacoesGestão de automações /metas-funilMetasFunilMetas do funil /custos-apiCustosAPICustos de API /logs-enriquecimentoLogsEnriquecimentoLogs de enrichment /company-groupsCompanyGroupsGrupos de empresas /company-groups/analyticsCompanyGroupsAnalyticsAnalytics de grupos /organogramaOrganogramaEstrutura organizacional /configuracoesConfiguracoesConfigurações /perfilPerfilPerfil do usuário /ajudaAjudaCentral de ajuda /account-basedAccountBasedDashboardABM Dashboard /marketingMarketingDashboardDashboard marketing /lead-capture/:formIdPublicLeadCaptureFormulário público


    10. Fluxos de UI

    10.1 Kanban de Deals

    Componentes:

  • DealKanban → Container principal
  • DealColumn → Coluna por stage
  • DealCard → Card do deal
  • DealActionBar → Ações em massa
  • Funcionalidades:

  • Drag & Drop entre stages
  • Seleção múltipla
  • Ações em massa (mover, atribuir, arquivar)
  • Filtros (período, closer, status)
  • Ordenação (valor, data, nome)
  • 10.2 Action Bar

    Ações disponíveis:

  • Mover para stage
  • Atribuir para usuário
  • Adicionar tags
  • Arquivar
  • Exportar
  • Deletar (com confirmação)
  • 10.3 Deal Drawer

    Seções:

  • Header (título, empresa, valor)
  • Contato principal
  • Timeline de atividades
  • Notas
  • Stakeholders
  • Documentos
  • Histórico de stages
  • 10.4 Recovery Flow

    1. Acessa lista de deals elegíveis (/recovery-candidates) 2. Seleciona deal para reativar 3. Modal de confirmação com contexto 4. Criação automática do recovery deal 5. Atribuição para closer disponível


    11. Setup para Desenvolvimento

    11.1 Requisitos

  • Node.js 18+
  • npm ou pnpm
  • Conta Supabase (projeto configurado)
  • Variáveis de ambiente
  • 11.2 Variáveis de Ambiente

    `env VITE_SUPABASE_URL=https://xxx.supabase.co VITE_SUPABASE_ANON_KEY=eyJxxxx VITE_GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com VITE_TWILIO_ACCOUNT_SID=ACxxxx `

    11.3 Comandos

    `bash

    Instalar dependências

    npm install

    Desenvolvimento

    npm run dev

    Build

    npm run build

    Preview do build

    npm run preview

    Type check

    npm run typecheck

    Lint

    npm run lint
    `

    11.4 Estrutura de Diretórios

    ` src/ ├── components/ # Componentes React │ ├── ui/ # Componentes base (shadcn) │ ├── Layout/ # Header, Sidebar, etc │ ├── Dashboard/ # Widgets do dashboard │ ├── Leads/ # Componentes de leads │ ├── Deals/ # Componentes de deals │ └── ... ├── contexts/ # React Contexts ├── hooks/ # Custom hooks ├── integrations/ # Supabase client e types ├── lib/ # Utilidades ├── pages/ # Páginas/Routes ├── providers/ # Providers (QueryClient, etc) ├── types/ # TypeScript types └── utils/ # Funções auxiliares `

    11.5 Convenções de Código

  • Hooks: use prefix (ex: useDeals)
  • Componentes: PascalCase (ex: DealCard)
  • Arquivos: camelCase para hooks, PascalCase para componentes
  • Types: Interfaces com I prefix ou sufixo descritivo
  • Formatters: Usar lib/formatters.ts para formatação
  • 11.6 Padrões TanStack Query

    `typescript // Query padrão const { data, isLoading, error } = useQuery({ queryKey: ['deals', filters], queryFn: async () => { const { data, error } = await supabase .from('deals') .select('*') .eq('is_active', true); if (error) throw error; return data; }, staleTime: 5 60 1000, // 5 minutos });

    // Mutation padrão const mutation = useMutation({ mutationFn: async (deal: CreateDealInput) => { const { data, error } = await supabase .from('deals') .insert(deal) .select() .single(); if (error) throw error; return data; }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['deals'] }); toast.success('Deal criado!'); }, }); `


    12. Referências

    12.1 Arquivos Importantes

    ArquivoDescrição |---------|-----------| src/integrations/supabase/types.tsTypes gerados do Supabase (9638 linhas) src/types/accounts.tsTypes de accounts, contacts, roles src/hooks/useRecoveryDeals.tsLógica de recovery src/hooks/useCloserRanking.tsRanking de closers src/pages/CloserCommandCenter.tsxDashboard de closers src/pages/Negocios.tsxKanban de deals src/pages/Leads.tsxGestão de leads

    12.2 Documentação Adicional

  • Local: /root/clawd/apex/arcosscale/tools/hunter/DOCS/`
  • Lovable: https://lovable.dev/projects/67c92fb0-dd2d-4c56-9020-2e6c760b2166

  • Documento gerado em Março 2026 | Hunter CRM v2.0

    📋 REGRAS DE NEGÓCIO

    Ciclo de Vida do Lead

    
    NEW (Novo)
      │
      ▼ [SDR faz primeiro contato]
    CONTACTED (Contatado)
      │
      ├──▶ QUALIFIED (Qualificado) ──▶ Vira DEAL
      │
      └──▶ DISQUALIFIED (Desqualificado)
           - Motivo obrigatório
           - Pode ir para Recovery após 90 dias
    

    Regras:

    Ciclo de Vida do Deal

    
    QUALIFICAÇÃO ──▶ PROPOSTA ──▶ NEGOCIAÇÃO ──▶ WON ✅
          │              │             │
          └──────────────┴─────────────┴──────▶ LOST ❌
                                                  │
                                                  ▼ [após 90 dias]
                                               RECOVERY (pode virar novo deal)
    

    Regras:

    Sistema de Recovery


    👥 TIPOS DE USUÁRIOS E ROLES

    Hierarquia Organizacional

    
                        ┌─────────────────┐
                        │      ADMIN      │ ◀── Acesso TOTAL
                        └────────┬────────┘
                                 │
                        ┌────────▼────────┐
                        │  HEAD_COMERCIAL │ ◀── Vê todos os times
                        └────────┬────────┘
                                 │
             ┌───────────────────┼───────────────────┐
             │                   │                   │
    ┌────────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐
    │  LIDER_TRIBO    │ │ LIDER_CLOSERS   │ │LIDER_PROSPECCAO │
    │ (Vê sua tribo)  │ │ (Vê closers)    │ │ (Vê SDRs)       │
    └────────┬────────┘ └────────┬────────┘ └────────┬────────┘
             │                   │                   │
        ┌────▼────┐         ┌────▼────┐         ┌────▼────┐
        │ SQUAD   │         │ CLOSER  │         │   SDR   │
        │ LEADER  │         │         │         │   BDR   │
        └────┬────┘         └─────────┘         └─────────┘
             │
        ┌────▼────┐
        │  SQUAD  │ (membros do squad)
        └─────────┘
    

    Enum: app_role

    RoleDescriçãoAcesso
    adminAdministradorTUDO - todas as funcionalidades
    head_comercialHead ComercialTodos os times, todas as métricas
    lider_triboLíder de TriboSua tribo completa
    lider_closersLíder de ClosersTodos os closers, CloserCommandCenter
    lider_prospeccaoLíder de ProspecçãoTodos os SDRs/BDRs
    squad_leaderLíder de SquadSeu squad, SquadCommand
    closerCloserSeus deals, MyCommandCenter
    sdrSDRSeus leads, MyCommandCenter
    bdrBDRSeus leads (outbound)
    squadMembro de SquadDados do seu squad
    leaderLíder genéricoVaria conforme configuração

    Tabelas de Permissão


    🔐 MATRIZ DE PERMISSÕES

    Leads

    Açãoadminheadlider_prospsdr
    Ver todos leads
    Ver leads do time
    Ver próprios leads
    Criar lead
    Editar qualquer lead
    Deletar lead
    Distribuir leads
    Importar lista

    Deals

    Açãoadminheadlider_closerscloser
    Ver todos deals
    Ver deals do time
    Ver próprios deals
    Criar deal
    Mover deal de stage✅ (próprios)
    Marcar como Won/Lost✅ (próprios)
    Reatribuir deal
    Deletar deal
    Criar Recovery

    Command Centers

    DashboardQuem acessa
    /closer-commandadmin, head_comercial, lider_closers
    /squad-commandadmin, head_comercial, squad_leader, lider_tribo
    /my-commandTodos (visão individual)
    /rankingTodos (própria posição destacada)
    /analisesadmin, head_comercial, líderes

    🔄 FLUXOS PRINCIPAIS

    1. Importação de Lista de Leads

    1. Upload CSV → cria lead_list (status: processing)
    2. Edge function import-leads-batch processa linhas
    3. Validação: duplicatas, campos obrigatórios, formato
    4. Leads válidos → criados com list_id preenchido
    5. Status muda para "ready"
    6. Distribuição: manual ou automática (round-robin, por capacidade)
    7. SLA começa a contar a partir de list_assigned_at

    2. Conversão Lead → Deal

    1. SDR qualifica lead (status = 'qualified')
    2. Agenda reunião com closer
    3. Sistema cria Deal automaticamente ou manualmente
    4. Lead.converted_at = NOW()
    5. Lead.converted_to_contact_id = contato criado
    6. Deal.lead_id = lead original
    7. Deal.sdr_id = SDR que qualificou (para comissão)

    3. Fechamento de Deal (Won)

    1. Closer move deal para stage final
    2. Marca como Won
    3. Sistema registra: won_at, squad_id_at_close
    4. Cálculo de comissão (SDR + Closer)
    5. Deal aparece nos rankings

    4. Recovery de Deal Perdido

    1. Deal perdido há 90+ dias aparece em "Candidatos Recovery"
    2. Líder/Admin seleciona e cria Recovery
    3. Novo deal criado com deal_type='recovery'
    4. recovery_source_deal_id aponta para original
    5. Distribuído para closer (pode ser diferente do original)
    6. Ciclo de venda recomeça

    📊 CÁLCULOS IMPORTANTES

    Win Rate

    win_rate = deals_won / (deals_won + deals_lost) * 100

    Ticket Médio

    ticket_medio = soma_valores_won / quantidade_deals_won

    Ciclo de Venda

    ciclo = AVG(won_at - created_at) em dias

    Score do Lead

    effective_score = (demographic_score + behavioral_score + fit_score) * decay_multiplier

    Receita Ponderada (Ranking)

    real_revenue = value * (contract_duration_months > 1 ? mrr * duration : 1) * (1 - discount_percent/100)

    Documentação completa Hunter CRM | ArcosScale © 2026