Conectando ao Supabase…

Hoje

Seu cockpit diário de prospecção
conectado

Registro rápido do dia

Bateu o telefone? Clique. Cada toque registra uma atividade de hoje contra a meta.

Funil de prospecção

Follow-ups

próximos contatos

Fila do dia

ligar agora

Rascunho

EmpresaDecisorCanalStatus EstágioPesquisaValorFollow

Gargalos de conversão — taxa por etapa

Fechamentos por mês

Motivos de perda

Investimentos por campanha

Nenhuma campanha cadastrada.

Canal de aquisição

Segmentos com mais leads

Leads por mês (entrada no pipeline)

Como usar este painel

Três telas, um ritmo. O painel foi desenhado em volta do seu método de prospecção, não o contrário.

  1. Hoje é o cockpit do telefone. Antes de discar, sua meta diária está no topo: 100 ligações → 50 conexões → 20 decisores → 5 reuniões marcadas → 4 realizadas → 3 vendas. A cada atividade, clique no + do contador. O funil abaixo mostra suas taxas de conversão reais contra o método.
  2. Pipeline é onde cada lead vive. Arraste o card entre as colunas conforme ele avança: Pesquisa, Prospecção, Decisor, Reunião marcada, Reunião realizada, Cliente. Use as setas do card se preferir não arrastar.
  3. Leads é a lista completa, com a ficha e o checklist de pesquisa individual (CNPJ, sócios, capital social e presença digital nos 5 pontos do método).

O checklist de pesquisa

Cada lead carrega 5 marcadores de presença digital: site, social media, anúncio Meta, anúncio Google e Google Meu Negócio. Eles aparecem como cinco quadradinhos na lista. Quanto menos verde, mais buraco digital, mais espaço para a Nettu's entrar.

Honestidade dos dados

Os contadores de atividade começam em zero, porque número de prospecção não se inventa. As metas (100 / 50 / 20 / 5 / 4 / 3) são as do método do Rugido.

Status do banco de dados

O painel está conectado ao Supabase. Todos os leads, atividades e metas são salvos e lidos do banco em tempo real.

Supabase · xwnkmzrycvcwwoqnzulb

Passo 1 — Criar as tabelas (obrigatório)

Se o painel está dando erro ao carregar ou ao salvar, as tabelas ainda não existem. Acesse Supabase → SQL Editor → New query, cole o SQL abaixo e clique em Run.

-- ═══════════════════════════════════════════
-- NETTU'S · Criar tabelas
-- Execute no Supabase → SQL Editor → Run
-- ═══════════════════════════════════════════

-- 1. Leads
create table if not exists leads (
  id              uuid primary key default gen_random_uuid(),
  criado_em       timestamptz default now(),
  empresa         text not null,
  decisor         text,
  cargo           text,
  canal           text,
  telefone        text,
  segmento        text,
  capital_social  text,
  estagio         text default 'pesquisa',
  valor_potencial numeric default 0,
  proximo_follow  date,
  canal_follow    text,
  obs             text,
  tem_site        boolean default false,
  faz_social      boolean default false,
  anuncia_meta    boolean default false,
  anuncia_google  boolean default false,
  gmn_ok          boolean default false
);

-- 2. Atividades diárias (uma linha por dia)
create table if not exists atividades (
  data                 date primary key,
  ligacoes             int default 0,
  conexoes             int default 0,
  decisores            int default 0,
  reunioes_marcadas    int default 0,
  reunioes_realizadas  int default 0,
  vendas               int default 0
);

-- 3. Metas (linha única — id = 1)
create table if not exists metas (
  id                   int primary key,
  ligacoes             int default 100,
  conexoes             int default 50,
  decisores            int default 20,
  reunioes_marcadas    int default 5,
  reunioes_realizadas  int default 4,
  vendas               int default 3
);

-- Inserir metas padrão (só executa se a linha não existir)
insert into metas (id, ligacoes, conexoes, decisores, reunioes_marcadas, reunioes_realizadas, vendas)
values (1, 100, 50, 20, 5, 4, 3)
on conflict (id) do nothing;

-- ═══════════════════════════════════════════
-- FASE 1.1 · Migração (rode se as tabelas já existem)
-- ═══════════════════════════════════════════

-- Status de tentativa nos leads
alter table leads add column if not exists status_tentativa text default 'A contatar';

-- Timeline de anotações
create table if not exists anotacoes (
  id        uuid primary key default gen_random_uuid(),
  lead_id   uuid references leads(id) on delete cascade,
  tipo      text default 'geral',
  texto     text not null,
  criado_em timestamptz default now()
);

-- Canal WhatsApp nas atividades diárias
alter table atividades add column if not exists wpp_disparos            int default 0;
alter table atividades add column if not exists wpp_enviados            int default 0;
alter table atividades add column if not exists wpp_respostas           int default 0;
alter table atividades add column if not exists wpp_decisores           int default 0;
alter table atividades add column if not exists wpp_reunioes_marcadas   int default 0;
alter table atividades add column if not exists wpp_reunioes_realizadas int default 0;
alter table atividades add column if not exists wpp_vendas              int default 0;

-- Metas do canal WhatsApp
alter table metas add column if not exists wpp_disparos            int default 200;
alter table metas add column if not exists wpp_enviados            int default 150;
alter table metas add column if not exists wpp_respostas           int default 50;
alter table metas add column if not exists wpp_decisores           int default 20;
alter table metas add column if not exists wpp_reunioes_marcadas   int default 5;
alter table metas add column if not exists wpp_reunioes_realizadas int default 4;
alter table metas add column if not exists wpp_vendas              int default 3;

Passo 1b — Migração Módulo 3 · Pipeline ⚠ rode uma vez

Se você já tinha leads cadastrados com o pipeline antigo, este SQL converte as etapas antigas para as 8 novas e adiciona os campos de reunião, feedback e histórico.

-- ═══════════════════════════════════════════
-- MÓDULO 3 · Pipeline reformulado
-- Execute no Supabase → SQL Editor → Run
-- ═══════════════════════════════════════════

-- Converter estágios antigos para os novos
update leads set estagio = 'potencial'         where estagio = 'pesquisa';
update leads set estagio = 'ligar'             where estagio in ('prospeccao','decisor');
update leads set estagio = 'reuniao_agendada'  where estagio = 'marcada';
update leads set estagio = 'reuniao_realizada' where estagio = 'realizada';
update leads set estagio = 'fechado'           where estagio = 'cliente';
update leads set estagio = 'desqualificado'    where estagio = 'perdido';

-- Novos campos no lead
alter table leads add column if not exists motivo_perda           text;
alter table leads add column if not exists data_reuniao_marcada   timestamptz;
alter table leads add column if not exists feedback_reuniao       text;
alter table leads add column if not exists data_reuniao_realizada date;
alter table leads add column if not exists tipo_lead              text default 'outbound';

-- Tabela de histórico de etapas
create table if not exists historico_lead (
  id               uuid primary key default gen_random_uuid(),
  lead_id          uuid references leads(id) on delete cascade,
  estagio_anterior text,
  estagio_novo     text not null,
  obs              text,
  criado_em        timestamptz default now()
);

Passo 1c — Migração Módulo 4 · Ficha expandida ⚠ rode uma vez

Adiciona todos os campos novos da ficha do lead (tipo, closer, dados de reunião, faturamento, contrato etc.).

-- ═══════════════════════════════════════════
-- MÓDULO 4 · Ficha do lead expandida
-- Execute no Supabase → SQL Editor → Run
-- ═══════════════════════════════════════════
alter table leads add column if not exists closer                 text;
alter table leads add column if not exists faturamento_medio      text;
alter table leads add column if not exists produtos_ofertados     text;
alter table leads add column if not exists criterios_produto      text;
alter table leads add column if not exists criterio_nao_cumpre    text;
alter table leads add column if not exists capacidade_produtiva   text;
alter table leads add column if not exists valor_contrato         numeric;
alter table leads add column if not exists forma_pagamento        text;
alter table leads add column if not exists data_aquisicao         date;
-- (tipo_lead, data_reuniao_marcada, feedback_reuniao, data_reuniao_realizada
--  já foram adicionados no SQL do Módulo 3)

Passo 1f — Migração Módulo 8 · Dashboard Estratégico ⚠ rode uma vez

Cria a tabela campanhas para registrar investimentos de marketing e calcular CAC e ROI.

-- ═══════════════════════════════════════════
-- MÓDULO 8 · Dashboard Estratégico
-- Execute no Supabase → SQL Editor → Run
-- ═══════════════════════════════════════════

create table if not exists campanhas (
  id          uuid primary key default gen_random_uuid(),
  nome        text not null,
  canal       text,
  valor       numeric not null default 0,
  data_inicio date,
  data_fim    date,
  criado_em   timestamptz default now()
);

-- Também garante que leads tem campo canal_aquisicao e segmento
alter table leads add column if not exists canal_aquisicao text;
alter table leads add column if not exists segmento        text;

Passo 1e — Migração Módulo 7 · Atividades CRM ⚠ rode uma vez

Cria a tabela atividades_crm para follow-ups, lembretes e cobranças gerados manual ou automaticamente pelas etapas do pipeline.

-- ═══════════════════════════════════════════
-- MÓDULO 7 · Atividades e Notificações
-- Execute no Supabase → SQL Editor → Run
-- ═══════════════════════════════════════════

create table if not exists atividades_crm (
  id         uuid primary key default gen_random_uuid(),
  lead_id    uuid references leads(id) on delete cascade,
  tipo       text not null default 'follow_up',
             -- follow_up | reuniao | cobranca | lembrete | outro
  canal      text,
             -- ligacao | whatsapp | email | linkedin
  data_prev  date not null,
  hora_prev  time,
  obs        text,
  status     text default 'pendente',
             -- pendente | concluida | reagendada
  auto       boolean default false,
  criado_em  timestamptz default now()
);

create index if not exists idx_ativ_crm_lead_id  on atividades_crm(lead_id);
create index if not exists idx_ativ_crm_status   on atividades_crm(status);
create index if not exists idx_ativ_crm_data     on atividades_crm(data_prev);

Passo 1d — Migração Módulo 6 · Listas de Prospecção ⚠ rode uma vez

Cria as tabelas listas e leads_lista para o sistema de importação de planilhas.

-- ═══════════════════════════════════════════
-- MÓDULO 6 · Sistema de Listas de Prospecção
-- Execute no Supabase → SQL Editor → Run
-- ═══════════════════════════════════════════

-- Tabela: listas de prospecção importadas
create table if not exists listas (
  id           uuid primary key default gen_random_uuid(),
  nome         text not null,
  descricao    text,
  data_inicio  date,
  total_leads  int default 0,
  criado_em    timestamptz default now()
);

-- Tabela: leads dentro de cada lista
create table if not exists leads_lista (
  id           uuid primary key default gen_random_uuid(),
  lista_id     uuid references listas(id) on delete cascade,
  empresa      text,
  decisor      text,
  cargo        text,
  telefone     text,
  segmento     text,
  cidade       text,
  email        text,
  site         text,
  status       text default 'pendente',  -- pendente | importado | descartado
  lead_id      uuid references leads(id) on delete set null,
  criado_em    timestamptz default now()
);

-- Índices para performance
create index if not exists idx_leads_lista_lista_id on leads_lista(lista_id);
create index if not exists idx_leads_lista_status   on leads_lista(status);

Passo 2 — Ativar RLS (login) — opcional por enquanto

Quando quiser trancar o painel com login por e-mail, rode o SQL abaixo no Supabase (SQL Editor) e depois ative a autenticação por Magic Link ou senha em Authentication → Providers.

-- Ativa proteção por linha (RLS)
alter table leads enable row level security;
alter table atividades enable row level security;
alter table metas enable row level security;

-- Permite acesso só para usuários autenticados
create policy "dono" on leads
  for all using (auth.role() = 'authenticated');
create policy "dono" on atividades
  for all using (auth.role() = 'authenticated');
create policy "dono" on metas
  for all using (auth.role() = 'authenticated');

Sistema de design

Este painel segue o manual da marca à risca. A regra 60/30/10:

60% noite
30% creme
10% roxo
Roxo#6E23D7
Noite#15101F
Preto#0E0E0E
Creme#F9F3E9
Roxo claro#8B4FDF

Tipografia: Fraunces nos títulos, Nunito no corpo, JetBrains Mono nos rótulos e números.

Atividades urgentes
Sem atividades pendentes para hoje.