Analytics · Dados nos 3 níveis
Um único motor de agregação por baixo, três lentes por cima: L1 vê a rede, L2 a carteira, L3 o próprio negócio. Mesma base de dados (contatos, deals, atividades, eventos, faturas, uso de AI) — cada nível filtra o que pode ver. Regra dura: L3 = só conversão + funil (sem Stripe/Square, sem invoice/quote/estimate).
Um motor, três lentes
A mesma base alimenta os três níveis — o que muda é o escopo do filtro, não o cálculo.
L1Plataforma
Soma da rede toda (cross-workspace). Foco: rodar o SaaS — receita, escala, economia de AI.
L2Agência
Soma dos clientes da carteira (um workspace). Foco: gerir e provar ROI — funil, pipeline, receita, SLA.
L3Cliente
Um cliente, só leitura. Foco: ver o resultado — conversão + funil. Sem billing / quote / estimate.
L1 — Plataforma rede
Rodar o negócio SaaS. Drill: rede → agência → (impersona) workspace.
| Métrica | Fonte | Visualização |
|---|---|---|
| Escala de rede | account · workspace · client · contact · app_user | KPIs + série de crescimento |
| Receita da plataforma (MRR/ARR) | account.subscription (plano, status) | KPI + tendência + mix de plano |
| Trials · churn · past_due | subscription.status | Faixa "needs attention" + funil de assinatura |
| Economia de AI (custo × margem/take) | usage_event (tokens/custo/margem) | KPI take-rate + por agência |
| Agências ativas (WAU/MAU) | audit_log / event outbox (atividade) | Linha de engajamento |
| Leads & deals ganhos na REDE | contact + deal (soma cross-workspace) | KPIs agregados da rede |
L2 — Agência carteira
Gerir a carteira e provar ROI. Drill: agência → cliente → lead/deal.
| Métrica | Fonte | Visualização |
|---|---|---|
| Volume de leads + mix de canal | contact.source.channel + custom.channel/utm | Barras por canal (Google Ads/Organic/Meta/GBP/LSA/Direct) + tendência |
| Funil de conversão + taxas | contact.lifecycle_stage/lead_status + eventos | Funil Captado→MQL→SQL→Deal→Won com % entre etapas |
| Pipeline (aberto · ponderado · win rate) | deal.value_amount/stage.probability/status | Valor aberto, ponderado, win rate, ticket médio, ciclo |
| Receita faturada (pago/aberto) | client_invoice.total_micros/status | KPI receita + por cliente — só L2 |
| SLA / tempo de 1ª resposta | contact.first_response_due_at + activity(inbound/outbound) | % dentro do SLA + tempo médio, por cliente/dono |
| Custo/margem de AI por cliente | usage_event (client-scoped) | P&L de AI por cliente |
| Rollup por cliente + tendências | tudo acima agregado por client_id | Tabela por cliente (drill) + séries temporais |
L3 — Cliente analytics-only
Ver o resultado do trabalho da agência. Só conversão + funil.
| Métrica | Fonte | Visualização |
|---|---|---|
| Leads no tempo | contact.created_at (do cliente) | Linha de volume + comparativo período |
| Fonte / canal dos leads | contact.source.channel + custom.channel | Rosca/barras por canal |
| Funil (captado → qualificado → ganho) | contact.lifecycle_stage + deal.status | Funil + taxas de conversão |
| Tempo de resposta aos leads | first_response_due_at + activity | Tempo médio + tendência |
| Top serviços / segmentos | contact.custom (service, budget, …) | Ranking dos campos custom do nicho |
| Deals ganhos (contagem + valor) | deal.status=won, value_amount | KPI + valor do próprio pipeline (dado de conversão, não fatura) |
Fundação de dados — a camada de agregação
Uma tabela de rollup diário por cliente serve os 3 níveis com uma soma. MVP começa on-read; rollup entra para escala + séries.
▤Tabela analytics_daily
Chave (workspace_id, client_id, day). Cada linha = um dia de um cliente. L3 lê suas linhas; L2 soma as do workspace; L1 soma tudo. Fluxos (o que aconteceu no dia) + snapshots (estado no dia).
◔Como é alimentada
MVP: agregação on-read direto das tabelas base (como o dashboard.summary já faz). Escala: job noturno no worker lê o event outbox + snapshots e grava analytics_daily — barato e com histórico.
Colunas de analytics_daily
| Coluna | Tipo | Significado |
|---|---|---|
| leads_captured | int | leads criados no dia |
| by_channel / by_source | jsonb | {canal: contagem} — mix de aquisição |
| promoted_mql / promoted_sql | int | transições de lifecycle no dia (fluxo) |
| converted_deal / unqualified | int | lead→deal e descartes no dia |
| deals_won / deals_lost | int | fechamentos no dia |
| won_value_cents / open_value_cents | bigint | valor ganho (fluxo) e pipeline aberto (snapshot) |
| first_response_sum_sec / _count | int | para o tempo médio de 1ª resposta |
| sla_met / sla_total | int | % dentro do SLA |
| ai_cost_micros / ai_margin_micros | bigint | P&L de AI — L1/L2 |
| invoiced_paid / invoiced_due_micros | bigint | receita — só L2 (nunca exposto ao L3) |
Fontes que alimentam (já existem no schema)
| Fonte | O que fornece |
|---|---|
| event outbox | crm.lead.captured · crm.lead.converted · crm.deal.stage_changed — a espinha temporal das séries |
| contact | lifecycle_stage · lead_status · score · source.channel · custom(channel/utm/budget) · first_response_due_at |
| deal | value_amount · stage/probability · status(open/won/lost) · won_at/lost_at |
| activity | type · direction(inbound/outbound) · occurred_at — tempo de resposta e toques |
| client_invoice | total_micros · status — receita da agência (L1/L2 apenas) |
| usage_event | custo/margem de AI (AgentOps) — L1 rede, L2 por cliente |
| account / subscription | plano · status — MRR/trial/churn (L1) |
Ordem de build
Do que já dá pra montar hoje ao que precisa de rollup.
AL3 primeiro (on-read)
Funil + canal + volume + tempo de resposta de um cliente, direto das tabelas base. Entrega valor visível ao cliente já, sem infra nova.
BL2 (on-read + rollup por cliente)
Reusa o L3 por cliente + agrega a carteira: mix de canal, win rate, pipeline, SLA, receita, rollup por cliente.
CL1 + analytics_daily
Job de rollup noturno (séries + escala da rede) e as lentes de plataforma (MRR, AI take, engajamento).
Referências: Modelo de Dados · Estrutura de Acessos · Hierarquia (L1/L2/L3) · Protótipo Reports · Decisões CRM · Roadmap.