A pergunta que quase todo site pequeno precisa responder é uma só: quais páginas trazem contato?
Para responder isso, a ferramenta padrão instala cookie de identificação, monta perfil de visitante, acompanha a navegação entre sessões e envia tudo para uma empresa de publicidade. É desproporcional — e, num site que vende adequação à LGPD, é contraditório.
A tabela inteira
CREATE TABLE visitas (
id INT UNSIGNED AUTO_INCREMENT,
criado_em DATETIME NOT NULL,
caminho VARCHAR(160) NOT NULL,
referencia VARCHAR(120), -- so o dominio
dispositivo ENUM('celular','tablet','computador'),
faixa_tela VARCHAR(12), -- faixa, nao medida exata
PRIMARY KEY (id)
);
O que não está aí é a decisão: sem IP, sem identificador de visitante, sem cookie de medição, sem impressão digital. Não existe forma de reconstruir a navegação de uma pessoa a partir dessa tabela.
Dois detalhes que parecem pequenos
O referenciador vai reduzido ao domínio
A URL completa de uma busca pode conter o que a pessoa pesquisou — às vezes o nome dela, às vezes coisa pior. Guardar google.com responde "de onde vieram" igualmente bem:
$host = parse_url($url, PHP_URL_HOST);
$host = preg_replace('/^www\./', '', strtolower($host));
A largura da tela vira faixa
Resolução exata, combinada com fuso e idioma, é um dos vetores clássicos de impressão digital de navegador. "641-900" responde a pergunta de layout sem contribuir para identificar ninguém.
Atribuição sem rastreamento
Saber que /regiao/uberaba/ teve 40 visitas é pouco. O que importa é saber que dois leads começaram a visita por ali.
Isso normalmente exige acompanhar a pessoa entre páginas. Mas existe um caminho mais simples: guardar a página de entrada em sessionStorage e enviá-la junto com o formulário, quando a pessoa decidir se identificar de qualquer forma.
if (!sessionStorage.getItem('entrada')) {
sessionStorage.setItem('entrada', location.pathname);
}
sessionStorage morre ao fechar a aba. Não acompanha ninguém entre visitas, não sai do navegador — exceto quando a própria pessoa envia o formulário. A atribuição existe; o rastreamento, não.
Valide esse campo no servidor. Ele vem do navegador, então aceita apenas caminho simples: ^/[a-z0-9\-/]*$. Sem isso, você criou um campo livre que alguém vai usar para injetar coisa.
O que você perde — e é bom dizer em voz alta
- Visitante único. Não existe: contar pessoas exige identificar pessoas.
- Taxa de retorno. Idem.
- Tempo na página e funil por sessão. Exigem ligar eventos ao mesmo visitante.
- O número total. A medição só roda para quem autoriza, então o valor é um piso, não o total.
Essa última merece destaque no painel, não uma nota de rodapé. Um número que parece exato e não é vale menos que um número declaradamente parcial.
Quando essa escolha não serve
Se o seu negócio vive de otimizar conversão, testar variações e calcular retorno por canal, você precisa de identificação de sessão e a conversa é outra — aí o caminho é fazer direito: base legal definida, aviso claro, retenção curta e ferramenta que você controla.
Para um site institucional que quer saber quais textos trazem cliente, contar página resolve. E resolve sem transformar cada visitante em dado pessoal armazenado.