Como o identificador do anúncio sai do Meta Ads, sobrevive à navegação até o checkout, fica gravado no pedido e é devolvido no webhook de venda.
Todo pedido gerado no checkout deve carregar os parâmetros UTM da visita que originou a compra. O campo mais importante é a utm_content, porque é ela que identifica qual anúncio gerou o clique. Essa informação precisa voltar no payload de todos os webhooks do pedido (criado, aguardando pagamento, aprovado, reembolsado).
No Meta Ads o valor é preenchido automaticamente pelas macros {{ad.name}}|{{ad.id}} no momento do clique. O nome é legível para o time de marketing; o ID é a chave única que não muda se o anúncio for renomeado. O sistema deve guardar o valor inteiro, sem cortar no |.
Valores neste documento são exemplos ilustrativos.
Em cada anúncio, no campo Parâmetros de URL, entra a string padrão abaixo. O Meta substitui as macros pelos valores reais do anúncio clicado.
utm_source=FB&utm_medium={{placement}}&utm_campaign={{campaign.name}}|{{campaign.id}}&utm_term={{adset.name}}|{{adset.id}}&utm_content={{ad.name}}|{{ad.id}}O Meta monta a URL final e acrescenta o fbclid automaticamente.
https://pagina.exemplo.com.br/desafio?utm_source=FB&utm_medium=Instagram_Reels &utm_campaign=DESAFIO_OUT26|120210000000001 &utm_term=PUBLICO_QUENTE|120211111111111 &utm_content=AD07_video-depoimento|120212345678901 &fbclid=IwAR2xYz...
utm_source, utm_medium, utm_campaign, utm_term, utm_content, fbclid e gclid da URL..dominio.com.br, validade de 30 dias) e também em localStorage como reserva.first_utm_content) para análise de primeiro toque.Todo link que leva ao checkout precisa ser "decorado" com os parâmetros salvos, porque o checkout costuma estar em outro domínio e não enxerga o cookie da página.
// Executar ao carregar a página e antes de cada clique no CTA const KEYS = ['utm_source','utm_medium','utm_campaign','utm_term','utm_content','fbclid','gclid']; document.querySelectorAll('a[href*="checkout"]').forEach(a => { const url = new URL(a.href); KEYS.forEach(k => { const v = getStored(k); // lê do cookie / localStorage if (v && !url.searchParams.has(k)) url.searchParams.set(k, v); }); a.href = url.toString(); // URLSearchParams já faz o encode do "|" (%7C) });
utm_source, utm_medium, utm_campaign, utm_term, utm_content, fbclid.%7C → |). Coluna de texto com pelo menos 255 caracteres.Em cada evento do pedido, o webhook envia um bloco tracking lido do próprio pedido, nunca da sessão atual. Upsell e order bump herdam o tracking do pedido principal.
{
"event": "order.paid",
"order_id": "PED-2026-004812",
"status": "paid",
"payment_method": "pix",
"created_at": "2026-10-14T10:32:05-03:00",
"approved_at": "2026-10-14T10:34:51-03:00",
"product": { "id": "desafio-primal", "price": 497.00 },
"customer": { "email": "cliente@exemplo.com", "phone": "+5551999999999" },
"tracking": {
"utm_source": "FB",
"utm_medium": "Instagram_Reels",
"utm_campaign": "DESAFIO_OUT26|120210000000001",
"utm_term": "PUBLICO_QUENTE|120211111111111",
"utm_content": "AD07_video-depoimento|120212345678901",
"fbclid": "IwAR2xYz...",
"src": null,
"sck": null
}
}O sistema que recebe o webhook separa o valor no |: a parte da direita é o ID do anúncio no Meta. Com ele é possível cruzar a venda com gasto, criativo e conjunto, e calcular ROAS por anúncio.
| Campo | Origem | Exemplo | Obrigatório |
|---|---|---|---|
utm_content | Anúncio (nome|ID) | AD07_video-depoimento|120212345678901 | Sim |
utm_term | Conjunto de anúncios | PUBLICO_QUENTE|1202111… | Sim |
utm_campaign | Campanha | DESAFIO_OUT26|1202100… | Sim |
utm_medium | Posicionamento | Instagram_Reels | Sim |
utm_source | Plataforma | FB | Sim |
fbclid | Meta (automático) | IwAR2xYz… | Recomendado |
gclid | Google Ads (automático) | Cj0KCQjw… | Recomendado |
src / sck | Parâmetros extras de rastreio usados por algumas plataformas | — | Se disponível |
Outras plataformas de anúncio. O mesmo campo serve para Google Ads (utm_content={creative}, ID do anúncio) e TikTok Ads (utm_content=__CID_NAME__|__CID__). O checkout não precisa tratar cada plataforma: basta guardar e devolver o texto como chegou.
| e o texto original; só fazer URL-decode.null quando o campo não existir, sem omitir a chave do JSON.tracking vai em todos os eventos do pedido, inclusive reembolso e chargeback.