@chrono-os/meta-capi
v0.2.0
Published
Meta Conversions API (server-side): hash de PII no padrão da Meta, deduplicação por event_id, fbc/fbp, Lead e Purchase. Nunca lança; zero dependências de runtime.
Maintainers
Readme
@chrono-os/meta-capi
Meta Conversions API (eventos server-side do pixel). Hash de PII no padrão da Meta, deduplicação com o evento do navegador por event_id, fbp/fbc, Lead e Purchase. Nunca lança; zero dependências de runtime.
import { criarMetaCapi, lerCookie } from '@chrono-os/meta-capi'
const capi = criarMetaCapi({
accessToken: process.env.META_CAPI_ACCESS_TOKEN, // vazio = desligado (avisa uma vez)
pixelId: process.env.META_PIXEL_ID,
testEventCode: process.env.META_CAPI_TEST_CODE, // aba "Testar eventos"
logger,
})
await capi.enviar({
eventName: 'Lead',
eventId, // o mesmo do fbq('track', 'Lead', {}, { eventID })
email, telefone, nome,
fbp: lerCookie(req.headers.cookie, '_fbp'),
fbc: lerCookie(req.headers.cookie, '_fbc'),
fbclid, // vira fbc quando o cookie falta
clientIp, userAgent,
eventSourceUrl: pagina, // só origem + caminho são enviados
contentName: 'lp-holding',
})
// { ok: true, status } | { ok: false, motivo: 'desligado' | 'http' | 'rede', status? }
// Purchase com campos extras de custom_data (desde 0.2.0)
await capi.enviar({
eventName: 'Purchase',
eventId: orderId, // o mesmo do fbq('track', 'Purchase', …, { eventID })
email,
value: 17.9, currency: 'BRL',
customData: { content_type: 'product', content_ids: [slug], order_id: orderId },
})customDatavai paracustom_datacomo veio, sem hash: nunca coloque dado pessoal ali.contentName,valueecurrencyvencem quando a mesma chave aparece nos dois;null/undefinedsão descartados.Telefone sem DDI e sem
+ganha o DDI padrão (55); com+, fica como veio.O
access_tokenvai no corpo do POST, não na URL (na URL ele acaba em log de proxy e de APM).Nenhum dado pessoal sai em claro: e-mail, telefone, nome e
externalIdvão com SHA-256.
Antes de subir campanha para domínio novo: adicionar o domínio na lista de permissão do pixel (Events Manager → Configurações → Permissões de tráfego) e confirmar o PageView como Processado em "Testar eventos". Sem isso o pixel do navegador não envia, e só este caminho server-side chega.
