13 KiB
C213 — Analytics da Central de Conteúdos — uso, downloads e compartilhamentos
Status: rascunho Atualizado em: 2026-09-22 Issue: #1258 Priority: P2 Impeccable: B — encaixe na lista de peças do C211 (contadores) sem tela nova Design UI: docs/plans/central-conteudos-analytics-ui-design.html Appetite: ~1–1,5 dia eng; um outcome verificável — contadores por peça na lista do C211, sem serviço novo de analytics Responsável: —
Intenção
A Central de Conteúdos (C211 + S27) existe para a assessoria publicar peças e o público abrir, baixar e compartilhar. Mas hoje ninguém sabe se isso acontece: o self-hosted não tem analytics ativo (@vercel/analytics só rende com VERCEL === '1'; o Meta Pixel é mídia paga, não serve) e não há coleção de eventos. O dono pediu "acompanhar a utilização dos usuários e quanto compartilhamentos e downloads estão sendo feitos" — e a pergunta embutida é se vale criar algo próprio ou integrar algo existente.
Esta fatia responde de forma mínima e anônima: cada peça ganha contadores na lista interna que já existe, sem dashboard novo e sem serviço para operar. A assessoria precisa saber quais peças são abertas, baixadas e compartilhadas; a coordenação precisa saber se o esforço de manter a Central está valendo. Nada além disso.
Persona e fluxo
- Persona / contexto: assessoria e coordenação de comunicação (role
communicator;coordinator/candidateveem o mesmo), na mesa, decidindo o que reforçar e o que produzir. Quem gera os eventos é o visitante anônimo da página pública — que nunca é identificado. - Job principal: ler, por peça, o que foi aberto, baixado e compartilhado, e decidir o próximo passo de produção sem abrir outra ferramenta.
- Fluxo desejado: entra na lista de peças → lê os contadores de cada linha → "muito aberta e pouco compartilhada" pede novo gancho/capa; "muito compartilhada" pede continuação → decide o que reforçar/reeditar e o que produzir em seguida.
- Anti-goals de produto: não é analytics de site (sem pageview, funil, origem, heatmap); não é perfil de visitante (sem cookie de identidade, sem IP persistido, sem rastreio entre páginas ou entre peças); não é dashboard novo nem gráfico de vaidade; não rastreia o que acontece depois do clique — fora do site, nada.
Esboço de fluxo (B)
[visita anônima abre a peça] → abertura · download · compartilhar (WhatsApp | link) contam na peça
[assessoria] lista interna de peças (C211) → contadores por linha → "abriu muito, compartilhou pouco"
→ reforça/reedita gancho, capa ou chamada → decide a próxima peça
[coordenação] lê as peças mais servidas → decide se a Central vale o esforço de catalogar/publicar
[falha na contagem] a página pública segue idêntica — download e compartilhar nunca dependem do contador
Design UI (B)
- Design UI (gate):
docs/plans/central-conteudos-analytics-ui-design.html— cenas: lista de peças do C211 com a coluna de contadores (com e sem dados) e o recorte por canal no detalhe da peça. Encaixe na lista existente; sem tela nova.
Objetivo e aceite
- A lista interna de peças do C211 mostra, por peça, contadores absolutos de aberturas, downloads e compartilhamentos (WhatsApp e link), anônimos e agregados.
- A assessoria responde "qual peça reforçar/reeditar e o que produzir em seguida" e a coordenação responde "a Central está valendo o esforço" lendo a própria lista, sem ferramenta nova.
- Fail-soft: se a contagem falhar, a página pública não quebra nem atrasa; nada bloqueia abertura, download ou compartilhamento — contador a menos é aceitável, dado de visitante não.
- Privacidade: sem PII (sem IP persistido, sem cookie de identidade, sem user-agent completo), sem rastreio entre páginas/peças e sem qualquer dado de eleitor; contagem estritamente anônima.
- Nenhum serviço novo no homeserver para operar/backup; nada de dashboard, gráfico ou rota de analytics.
Dados (intenção)
- Vou apresentar dados? Sim, superfície neste item — contadores anônimos por peça (abertura · download · compartilhamento) na lista interna de peças do C211.
- Decisões desbloqueadas:
- Assessoria de comunicação: qual peça reforçar/reeditar e o que produzir em seguida (aberta e pouco compartilhada = rever gancho/capa; muito compartilhada = desdobrar).
- Coordenação de comunicação: se a Central está valendo o esforço de catalogar/publicar — as peças estão sendo servidas e circulando?
- Assessoria: qual canal entrega circulação (WhatsApp × link copiado) para concentrar o CTA onde a rede responde.
- Forma: adiada ao plano de implementação — restrições: contagens absolutas por peça (sem %; a base é anônima e desconhecida), nunca somadas num índice único de "uso", sem série/tendência no v1, sem KPI de vaidade (tempo, scroll, ranking).
Dados da decisão (literais)
- Eventos v1 (rótulos): "Abertura da peça" · "Download" · "Clique em compartilhar (WhatsApp)" · "Clique em compartilhar (link)" — WhatsApp e link contam separados (o canal é a pergunta de produto; somar esconde onde a circulação para).
- "Uso" não vira um número só: os contadores aparecem lado a lado, por peça, sem total "usos" e sem média.
- Nada de PII: sem IP persistido, sem cookie de identidade, sem user-agent completo; contagem anônima e agregada, nunca associável a pessoa; sem rastreio entre páginas ou entre peças.
- Sem
Consentnovo — não há dado pessoal a consentir; qualquer identificação de visitante está fora de escopo (fail-closed de privacidade). - Superfície: contadores na lista interna de peças (C211) — sem dashboard novo, sem gráfico, sem rota de analytics.
- Decisão própria vs existente: A — coleção mínima de eventos anônimos no próprio Payload, escrita por endpoint público fail-soft e agregada na lista do C211; sem serviço novo, sem cookie, atribuição por peça garantida. Alternativas avaliadas: B
@10x-media/analytics(0.1.0-beta.0, adapternative()self-hosted, rollups no próprio Postgres, superfície no/admin) e C serviço externo self-hosted (Umami/Plausible — mais um serviço para operar e ainda exigiria eventos customizados). Reavaliar B/C só se a pergunta virar funil/pageview agregado. - Fail-soft: se a contagem falhar, a página pública não quebra nem atrasa; nada de bloquear abertura, download ou compartilhamento por telemetria.
Direção no codebase (hipótese)
- Áreas prováveis:
src/collections/(eventos anônimos por peça),src/utilities/(agregação para os contadores),src/components/campaign/shared/(coluna/célula naCampaignTable) e uma rota pública de escrita emsrc/app/(frontend)/api/chamada pela página do S27. - Precedente a olhar:
src/app/(frontend)/api/revalidate/route.tsesrc/app/(frontend)/api/social-feed/sync/route.ts(rota JSON pública, allowlist, fail-soft),src/components/campaign/shared/CampaignTable.tsx+CampaignListOmnibox+src/utilities/campaignListUrl.ts(a superfície),src/collections/CampaignVoteSummarySnapshot.ts(contagem/rollup, não dashboard),src/lib/campaignPageChrome.ts+src/components/campaign/shell/nav.ts(chrome). O rate limit existente (src/utilities/ai/rateLimit.ts) é poruserIde não serve para o público. - Risco de acoplamento: a contagem é acessória — o download/compartilhar e a página do S27 não podem depender dela; a peça é a do C211 (nada de segundo modelo de peça); nenhum identificador de visitante pode nascer daqui.
Dependências
- S27 (dura) — sem a página pública não há evento a contar.
- C211 (dura) — a peça catalogada e a lista interna são a superfície dos contadores.
- Soft: S28 (busca por tema) é ortogonal; os contadores entram como colunas, como as demais.
Fora de escopo
- Funil/pageview agregado do site (visitantes, origem, rejeição) — se pedido, reavaliar plugin (B) ou serviço self-hosted (C) em item próprio.
- Heatmap, scroll depth, tempo na página e A/B de título/capa/CTA.
- Rastrear visitante entre páginas ou entre peças (sessão, device, identidade anônima) — o modelo é evento solto.
- Dashboard, rota de analytics, gráfico de série, exportação e alertas.
- Meta Pixel (mídia paga na home/abaixo-assinado), analytics de terceiros no self-hosted e plataformas externas (Instagram/YouTube).
- UTM/encurtador e medição fora do site — o que acontece depois do
wa.meou do link copiado não é medível aqui (já adiado em S4/C166).
Rabbit holes de produto
- Virar analytics de site. Se alguém "só completar": pageview, origem, cookie, banner de consent. Corte neste item: só eventos de peça, anônimos e sem identidade.
- Medir a circulação depois do clique. Se alguém "só completar": encurtador, redirect com token, "quantas pessoas receberam no WhatsApp". Corte neste item: o clique é o teto do que o site sabe; pós-clique é fora.
- Placar único de "uso" / dashboard de vaidade. Se alguém "só completar": somar tudo num número e desenhar tendência. Corte neste item: contadores separados, lado a lado, sem índice composto.
- Adotar o plugin só pelo widget. Se alguém "só completar": superfície no
/admin(errada para a comunicação) e migrations de pacote beta. Corte neste item: A; reavaliação B/C só para funil/pageview. - Guardar tudo para sempre. Se alguém "só completar": eventos crus com IP/user-agent e retenção infinita — vira perfil de visitante. Corte neste item: mínimo anônimo, sem identificador persistido.
Questões em aberto (produto)
- Própria, plugin existente ou serviço self-hosted? Opções: A) coleção mínima própria | B)
@10x-media/analytics(beta) | C) Umami/Plausible self-hosted. Recomendação: A — atribuição por peça garantida e superfície onde a assessoria já está, sem serviço novo para operar/backup; B está em beta e vive no/admin; C somaria um serviço e ainda exigiria eventos customizados. Reavaliar se a pergunta virar funil/pageview agregado. (assumido — validar com produto) - O que conta como "uso"? Opções: A) só download + compartilhar | B) os quatro contadores lado a lado | C) um número "usos" por peça. Recomendação: B — a pergunta é "esta peça circula?" e cada contador mostra onde ela para; C esconde a decisão; A descarta o sinal de que a peça foi encontrada. (assumido — validar com produto)
- Granularidade temporal? Opções: A) acumulado por peça desde a publicação | B) janela de 7 dias | C) série diária. Recomendação: A no v1 — responde "reforçar/reeditar" e "vale a pena" sem virar dashboard; janela de 7 dias é o próximo passo registrado se a pergunta virar "o que está circulando agora". (assumido — validar com produto)
- Onde a assessoria vê? Opções: A) coluna na lista de peças do C211, com recorte por canal no detalhe | B) bloco no topo da Central | C) rota de analytics. Recomendação: A — a lista já é a mesa de trabalho; B/C criam superfície nova e puxam para dashboard. (assumido — validar com produto)
Referências
- Design UI (gate):
docs/plans/central-conteudos-analytics-ui-design.html(+ assets emcentral-conteudos-analytics-ui-design-assets/) - Planos irmãos:
docs/plans/central-conteudos-publica.md(S27 — a página que gera os eventos),docs/plans/central-conteudos-ingestao.md(C211 — a lista/superfície),docs/plans/compartilhar-conteudos-home-whatsapp.md(S4 — "nada é coletado neste item"),docs/plans/c166-compartilhar-trecho-link.md(C166 — "sem telemetria de compartilhamento") - Plugins avaliados (não adotados):
@10x-media/analytics(10x-media/payload-plugins,0.1.0-beta.0, adapternative()self-hosted, superfície no/admin) e os serviços Umami/Plausible - Arquivos como pista, não contrato:
src/app/(frontend)/layout.tsx(analytics Vercel inerte),src/components/MetaPixel.tsx,src/app/(frontend)/api/revalidate/route.ts,src/app/(frontend)/api/social-feed/sync/route.ts,src/components/campaign/shared/CampaignTable.tsx,src/utilities/campaignListUrl.ts,src/collections/CampaignVoteSummarySnapshot.ts,src/utilities/documents.ts AGENTS-campaign.md/AGENTS.md— vertical Comunicação, LGPD fail-closed, naming eoverrideAccess: false
Self-score (shaping)
5/5 — (1) fatia = um outcome verificável (contadores anônimos por peça na lista interna, sem serviço novo); (2) appetite ~1–1,5 dia cabe num encaixe de coluna; (3) persona, job e aceite legíveis sem stack; (4) direção no codebase é hipótese com precedentes abertos; (5) zero decisão dura de engenharia — schema, rota e agregação ficam para a implementação.