Isso não é teoria. É o log real de quando instalei o rastreamento completo no site da própria Atencio Digital: Pixel de Meta, API de Conversões, e um webhook que captura quando alguém realmente completa um agendamento, não só quando clica no link. Levou uma tarde, e no meio do caminho apareceram três erros reais que, se você for fazer isso sozinho, provavelmente também vai encontrar.
O que eu queria resolver
Ter só o Pixel instalado mostra visitas e cliques, mas depende do navegador de quem visita, e some se a pessoa usa bloqueador de anúncios ou apaga cookies. Eu queria três coisas ao mesmo tempo: saber quando alguém clica no WhatsApp, saber quando alguém realmente completa um agendamento na minha agenda (Cal.com), e ter um segundo caminho do lado do servidor, pra não depender só do navegador da pessoa.
Pixel + Google Tag Manager: a base
O Pixel eu instalei dentro do Google Tag Manager, não direto no código do site: assim ele fica no mesmo lugar onde já tinha o Google Analytics 4, e dá pra trocar sem mexer em código depois. Criei uma tag do tipo "HTML personalizado" com o código-base do Pixel, acionador "All Pages", publiquei. Isso sozinho já manda um evento de "PageView" toda vez que alguém abre o site.
A API de Conversões: o segundo caminho
O Pixel roda no navegador de quem visita. A API de Conversões roda no meu próprio servidor e manda os mesmos eventos direto pra Meta, então continua funcionando mesmo se o bloqueador de anúncios da pessoa tiver travado o Pixel. Fiz um arquivo em PHP que recebe o clique (por exemplo, "clicou no WhatsApp") e reenvia pra Meta usando o Pixel ID e um token de acesso.
O erro real: a validação que sempre falhava
Construí uma tela pra ativar o Pixel ID e o token direto pelo navegador, sem precisar mexer em arquivo no servidor toda vez. O problema: a validação que eu tinha escrito primeiro tentava simplesmente consultar o Pixel (um GET simples), e isso sempre falhava, mesmo com dados certos. O motivo: um token gerado pra API de Conversões só tem permissão pra mandar eventos, não pra consultar o Pixel dessa forma. A correção foi validar mandando um evento de teste de verdade (um POST), e usando o navegador e o IP reais de quem estava preenchendo o formulário: a primeira tentativa usava um valor inventado tipo "teste" no lugar do navegador, e a Meta rejeitava isso com o erro "Invalid parameter", porque não parecia um navegador de verdade.
Erro "Invalid parameter" na API de Conversões: como resolver
Se você caiu direto nessa parte porque está travado nesse mesmo erro, aqui vai o resumo: a Meta rejeita o evento de teste com "Invalid parameter" quando algum campo do user_data, principalmente o client_user_agent, não parece um navegador de verdade. Checklist rápido pra resolver:
- Nunca mande um valor fixo tipo
"teste"ou"validation"no campo de user-agent, use o valor real de$_SERVER['HTTP_USER_AGENT']. - Mande também o
client_ip_addressreal, não um IP inventado. - Confirme que está usando o endpoint certo:
/eventscomPOST, não uma consultaGETno objeto do Pixel. - Lembre que um token da API de Conversões só tem permissão pra enviar eventos, não pra consultar dados do Pixel.
O webhook: pegando o agendamento de verdade
Clicar no link da agenda mostra intenção, mas não confirma que a pessoa realmente marcou um horário, e não me dá o nome e o e-mail dela, porque esse formulário é preenchido dentro do site do Cal.com, não no meu. Pra resolver isso, criei um endpoint novo (cal-webhook.php) que o Cal.com avisa toda vez que um agendamento é criado de verdade. Esse aviso vem com nome, e-mail e telefone reais, que eu transformo em hash (SHA-256) antes de mandar pra Meta, nunca em texto puro.
Protegendo contra reservas falsas
Um endpoint que aceita qualquer aviso de "reserva criada" sem verificar nada seria fácil de forjar. A correção: o Cal.com assina cada aviso com uma chave secreta, e meu código confere essa assinatura antes de processar qualquer coisa: se não bate, rejeita na hora.
A armadilha do painel da Meta
Depois de tudo funcionando, testei com um agendamento real, e o evento não aparecia no painel da Meta. Antes de sair mexendo no código achando que tinha algo quebrado, fui direto na fonte: mandei o evento de novo e conferi a resposta bruta da própria API da Meta, não o painel visual. A resposta veio limpa: "events_received":1. O evento tinha chegado certinho, o painel do Meta só demorou muito mais do que os "até 30 minutos" que ele mesmo avisa (nesse caso, várias horas). Lição: quando algo parece não estar funcionando, confere na fonte (a resposta da API) antes de sair reescrevendo código que já está certo.
Conclusão
O resultado final: cinco eventos configurados (clique no WhatsApp, abertura do chat, mensagem enviada, clique na agenda, e visualização da seção de planos), mais o webhook capturando agendamentos reais com dados verdadeiros. Se você já tem um Pixel instalado mas nunca configurou a API de Conversões ou um webhook de agendamento, é provavelmente o próximo passo que mais falta no seu rastreamento.