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:

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.

Painel do Meta Events Manager mostrando eventos reais recebidos via Pixel e via API de Conversões
O painel do Meta Events Manager, alguns dias depois: PageView (via navegador) e Programar (via API de Conversões) chegando de verdade.

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.