← Projetos

Movimento

Analytics que criei do zero para os sites dos meus clientes: sem cookie, sem custo mensal e com o número que importa pro dono do negócio.

O cliente quer saber se o site traz gente. As opções prontas não cabiam no meu modelo.

No ar desde 24/09/2026

Resultado

R$ 0 por mêsde infraestrutura, no plano grátis do Cloudflare. As alternativas custavam a partir de US$ 6 por mês ou limitavam a 3 sites.
33% para 13%de diferença para o GoatCounter depois que adicionei um filtro de robôs de nuvem, com a meta abaixo de 15%.
3 sitesmedidos hoje: 2 de clientes e o meu. Cada cliente vê só o próprio site, com o login Google.
Painel Movimento no computador e no celular, com visitantes por dia, de onde vieram e cliques no WhatsApp
O painel que o cliente vê, com números de exemplo.

Como funciona

Problema

Eu vendo site sem mensalidade. O Pirsch cobra a partir de US$ 6/mês, o Umami grátis aceita só 3 sites e o Google Analytics exige banner de cookies e é confuso pra quem não é de tecnologia. Nenhuma opção grátis juntava muitos sites, link pro cliente e contagem de cliques no WhatsApp.

Solução

Um Worker no Cloudflare que recebe as visitas, grava no D1 e mostra um painel simples com o que o dono do negócio entende: visitas, de onde vieram, quantas pelo celular e quantas pessoas clicaram no WhatsApp.

Site do clientet.js · 39 linhas
723 bytes com gzip
Worker /efiltro de robô
hash do visitante
D1 (SQLite)eventos sem IP
datas em UTC
Área do clientelogin Google
Service Binding (RPC)

O t.js também registra sozinho os cliques em links wa.me, o número que mais importa pro cliente.

Decisões que tomei

Privacidade

Visitante único sem cookie

sha256(sal_do_dia + ip + user_agent + site), com sal_do_dia = HMAC(segredo, data). O IP nunca é gravado e o hash muda todo dia, então não dá pra seguir ninguém. Mesma técnica do Plausible e do Pirsch.

Segurança

Números só por dentro

O Movimento não tem rota pública de números: só uma entrada RPC (WorkerEntrypoint) que o Service Binding do site alcança. O site confere o login Google e, a cada pedido, se aquele e-mail pode ver aquele site.

Confiabilidade

Números que batem com a realidade

Filtro de robô pelo user-agent e de datacenter pela rede de origem (ASN), recarregar a mesma página em menos de 10 s não conta de novo, datas gravadas em UTC e mostradas no fuso de Fortaleza. Um comando de conferência manda uma visita de teste em produção, confere no banco e apaga só essas linhas.

Como validei

Piloto em 2 sites de clientes, comparando dia a dia e hora a hora com o GoatCounter pela API. Meta: diferença de visitantes abaixo de 15%. Num deles o Movimento contava 33% a mais. Hora a hora, a sobra eram 6 visitas de madrugada vindas de servidores na França, nos EUA e na Alemanha, com user-agent de navegador comum: robôs que o filtro por user-agent deixava passar. Entrou um filtro pela rede de origem (ASN de nuvem e hospedagem), essas visitas saíram da conta e a diferença caiu pra 13%.

Com 1 a 3 visitantes por dia, uma pessoa a mais ou a menos já muda vários pontos da porcentagem: o piloto mostrou mais onde os números divergem do que uma taxa final.

Alternativas avaliadas

OpçãoGrátis?Por que não
PirschNãoA partir de US$ 6/mês
Umami CloudSimSó 3 sites
Google AnalyticsSimCookies, banner LGPD, confuso pra leigo
Cloudflare Web AnalyticsSimSem link pro cliente, sem evento de WhatsApp
MovimentoSimEscolhido
Feito comCloudflare WorkersD1TypeScriptHonoVitestWrangler· cerca de 1.300 linhas e 117 testes automáticos