Lição 4 de 9: Analytics real
- PostHog (ou Plausible) instalado e rodando em produção
- 4-6 eventos disparando: pelo menos
landing_view,signup_started(se houver),wedge_consumed(já existia da L06/M3),weekly_return(placeholder) - Dashboard mostrando os primeiros eventos chegando em produção
- Commit
feat(analytics): real provider wired + funnel events live
Até agora analytics.track() só escrevia console.log (M3/L06). Esta lição troca isso por um provider real, com os eventos chegando num dashboard.
De console.log pra "X pessoas atravessaram o funil"
No M3/L06 você instalou analytics.track() como no-op (só console.log). Esta lição substitui o no-op por chamada real ao ou . No helper, muda só uma linha, e os eventos começam a aparecer no dashboard. Depois, você instala os outros 3-5 eventos do funil que listou no M2/L07 e adiou, porque ainda não tinha contexto pra dispará-los.
A pergunta que esta lição responde: quantas pessoas atravessam cada estágio do funil? Com os eventos chegando no dashboard, você mede cada estágio em vez de supor.
Vai passar por:
- Decidir PostHog ou Plausible com critério (free tier maior vs privacidade-first)
- Criar conta + instalar o SDK (~10 min)
- Configurar o helper do M3/L06 pra chamar a ferramenta real
- Instalar 3-5 eventos do funil (landing_view, signup_started, weekly_return)
- Boas práticas LGPD: desligar captura de IP, nunca passar PII, aviso no rodapé
Passo 1 — Decida PostHog ou Plausible
Antes de instalar, decide. Esta lição usa PostHog como default: o free tier cobre os primeiros meses, e funil + session replay é onde o valor mora. Se você prefere Plausible, ajuste os comandos. O pattern é igual.
Quero decidir entre PostHog e Plausible. Responde:
1. Vou querer ver session replay (gravação de sessão pra entender bug ou friction)? Se sim, PostHog.
2. Privacidade é argumento de venda do produto (público B2B europeu, ou compliance LGPD agressivo)? Se sim, Plausible (sem cookies, sem PII).
3. Quero feature flags integrados com analytics (testar variação A/B)? Se sim, PostHog.
4. Quero menor custo total nos primeiros 6 meses? PostHog free tier é maior, mas o painel é mais complexo. Se tempo é mais escasso que dinheiro, Plausible (5 min de setup).
Não responde por mim — só dá guidance. Eu decido.Esta lição assume PostHog daqui em diante. Se você escolheu Plausible, a única diferença é o SDK e a função; o resto (eventos, propriedades, LGPD) é idêntico.
Passo 2 — Crie conta + projeto no PostHog
- Vai em posthog.com, cria conta (free tier)
- Cria projeto novo. Anota a Project API Key (formato
phc_xxxxxxxxxxxxx) e o Host (geralmentehttps://app.posthog.com) - Adiciona ao
.env.example(e ao.env.localcom o valor real, e ao Vercel viavercel env add):
NEXT_PUBLIC_POSTHOG_KEY=<<chave-do-posthog>>
NEXT_PUBLIC_POSTHOG_HOST=https://app.posthog.comNote o prefixo NEXT_PUBLIC_: analytics é Client Component, precisa estar disponível no JS do browser.
Passo 3 — Instale o SDK + atualize o helper
Cole no Claude:
Instala o PostHog SDK e atualiza o helper de analytics. Requisitos:
1. `npm install posthog-js`
2. Cria um `PostHogProvider` (Client Component) que faz `posthog.init(...)` na primeira render usando `NEXT_PUBLIC_POSTHOG_KEY` e `NEXT_PUBLIC_POSTHOG_HOST`. Encapsula com `'use client'`.
3. Adiciona o provider no `app/layout.tsx` envolvendo o `children`.
4. Atualiza o `lib/analytics.ts` (criado no M3/L06): `analytics.track(name, props)` agora chama `posthog.capture(name, props)` em vez de só `console.log`. Mantém o `console.log` em desenvolvimento (`if (process.env.NODE_ENV !== 'production') console.log(...)`) pra você continuar vendo no terminal local.
5. **NÃO captura nenhum dado pessoal** (regra LGPD da L06). Adiciona um comentário no topo do `lib/analytics.ts` lembrando: "Nunca passe CPF, CNPJ, email, nome ou telefone como propriedade de evento."
Mostre o diff antes de aplicar.Aprove. Roda local pra confirmar que não quebrou:
Roda `npm run dev`. Abre o browser e clica no fluxo da fatia 1 — submete um recibo. Confere:
1. No terminal: `[analytics] recibo_emitido { ... }` aparece (dev fallback)
2. No browser DevTools Console: sem erros vermelhos
3. No PostHog dashboard (app.posthog.com → projeto → Events): evento "recibo_emitido" chega em ~30sSe os 3 itens passam, o pipeline está funcionando. Próximo passo: cobrir o funil inteiro.
Passo 4 — Instale os 3-5 eventos restantes do funil
No M2/L07 você listou 4 eventos: landing_view, signup_started, wedge_consumed, weekly_return. O wedge_consumed já existe (M3/L06). Os outros 3:
Adiciona os 3 eventos restantes do funil:
1. **landing_view** — dispara quando a página inicial pública carrega. Adiciona em `app/page.tsx` (ou rota equivalente da landing). Use `useEffect` ou `PostHog`'s autocapture.
2. **signup_started** — dispara quando o usuário começa o signup (clica no botão "começar", ou abre o modal de signup). Se não há signup ainda (fatia 1 sem autenticação), pula este evento por agora e me avisa.
3. **weekly_return** — dispara quando um usuário que já criou conta volta após 7 dias da última visita. Implementa via flag no localStorage (`last_visit` timestamp) + comparação na primeira render do app. Se `last_visit` passou de 7 dias, dispara `weekly_return`. (Atenção: localStorage é por-dispositivo e some se o usuário limpa o cache, então isso é um proxy de retenção, não a métrica exata. Quando tiver auth/conta, troca por `last_visit` no banco.)
Propriedades de cada evento: documentar em `docs/analytics.md` (já criado no M3/L06). Sem PII. Mostre o diff antes de aplicar.Aprove. Testa cada um:
landing_view: recarrega a página principal, confere PostHogsignup_started: se aplicável, clica no fluxo de signupweekly_return: manipulalocalStorage.last_visit(comDate.now() - 8 * 24 * 3600 * 1000) e recarrega; deve disparar
Se um evento depende de contexto que ainda não existe (ex: signup), marca como "instalado mas não dispara ainda" em docs/analytics.md e segue.
Passo 5 — Configure o funil no dashboard do PostHog
No PostHog: Insights → Funnels → New funnel. Adiciona os 4 eventos em ordem (landing_view → signup_started → wedge_consumed → weekly_return). Salva como "Funil principal".
Esse é o dashboard que você vai abrir todo dia/semana pra ver:
- Quantas pessoas viram a landing
- Que % delas começou signup
- Que % concluiu o wedge
- Que % voltou em 7 dias
O funil que você desenhou no M2/L07 era hipótese; agora cada estágio tem um número medido em produção.
Passo 6 — Deploy e faça o commit
Roda `npm run doctor` pra confirmar 6/6 OK. Faça commit das mudanças. Mensagem: `feat(analytics): real provider wired + funnel events live`. Depois roda `vercel --prod` pra publicar (skill `deploy-and-verify` ajuda).Aprove. Depois do deploy, espera 5 minutos e abre o dashboard do PostHog; eventos de produção devem começar a chegar.
Build Diary — o CEAP mediu só o que respondia à pergunta do produto
O CEAP é puro front-end estático (zero auth, zero forma, conforme ADR-001), então o analytics dele é mais simples: Cloudflare Web Analytics no site. A parte interessante é a decisão do que medir. Trecho real do MAINTENANCE.md:
Cloudflare Analytics
- Real-time visitors
- Page views
- Top pages
- Referrers
- Browser/device breakdown
Update Frequency: real-time
Note o que não está medindo: tempo médio na sessão, bounce rate, conversion rate (não há conversão, o produto não vende nada). O autor pegou só os eventos que respondem à pergunta central do produto ("essa análise está sendo lida e por quem") e deixou os outros 20 disponíveis no painel da Cloudflare como ruído ignorável.
O mesmo critério vale pro seu PostHog: se você instalou 4 eventos no funil e não vai abrir o dashboard ao menos semanalmente, instala 2, ou nenhum, e adia até ter tração. PostHog cobra (eventualmente) por volume, e coletar evento que ninguém olha custa dinheiro e atenção sem retorno. Pra estimar quando esse custo começa a pesar, veja o apêndice Quando começa a custar.
Takeaways
- PostHog default (free tier 1M/mês, funil + session replay). Plausible se privacy-first é argumento de venda.
posthog.init({ ip: false })+ privacy disclosure no rodapé = LGPD trivial.- Nunca PII como propriedade de evento. Use IDs internos e contagens agregadas.
- Só instale eventos que você vai consultar (cada um custa volume e atenção). Comece com 2-4, não 10.
Você terminou quando
Quatro coisas:
- PostHog (ou Plausible) instalado em produção
- Pelo menos
wedge_consumed+landing_viewdisparando no dashboard docs/analytics.mdatualizado listando os eventos instalados + privacidade (LGPD)- Funil principal criado no dashboard do provider