ADSFLOW
← Blog/Educacional
Conversions API em 2026: setup server-side que salva atribuição quando BM cai
Educacional12 de junho de 2026 · 16 min de leitura

por DK

Conversions API em 2026: setup server-side que salva atribuição quando BM cai

Pixel browser morreu devagar e a maioria dos gestores ainda não percebeu. Com iOS 14 já datado, iOS 17+ com Private Relay ativado por padrão, Firefox bloqueando fbclid de terceiros e Safari com ITP reduzindo janela de cookie pra 7 dias, o fbevents.js rodando sozinho captura entre 40% e 65% dos eventos reais dependendo do mix de dispositivo da sua audiência. Em operações com ticket alto — onde o comprador provavelmente usa iPhone com proteção de privacidade ativa — esse número cai mais.

Mas o problema não é só perda de volume. É perda de qualidade no sinal. O algoritmo Advantage+ toma decisões de bid, segmentação e expansão de público com base nos eventos que ele recebe. Quando você alimenta o modelo com 55% dos purchases reais, ele otimiza pra um perfil de comprador que não é o seu. CPA sobe, ROAS cai, você aumenta orçamento tentando compensar — e piora o sinal ainda mais.

A Conversions API server-side resolve isso. E tem um benefício colateral que poucos exploram: quando sua BM cai, você porta o histórico de eventos pra um pixel novo via API em 24 horas, não em 14 dias de reaquecimento. Esse post cobre o setup técnico completo, deduplicação correta, enriquecimento de eventos e a estratégia de contingência quando a estrutura cai.

Por que o pixel browser não basta mais em 2026

O fbevents.js funciona no contexto do browser do usuário. Ele depende de:

  • Cookie de terceiro _fbc (fbclid armazenado) para atribuição de clique
  • Cookie _fbp para identificação de navegador
  • Contexto de execução JavaScript não bloqueado por extensão (uBlock, Privacy Badger, etc.)
  • Permissão de rede para chamar connect.facebook.net sem bloqueio de DNS

Em 2026, nenhum desses quatro está garantido:

  • Safari bloqueia cookies cross-site por padrão. O _fbc some em 7 dias (ITP 2.3+). Em muitos casos some antes, porque o domínio de referência é classificado como tracker.
  • iOS 17+ com Private Relay mascara IP e user-agent. O fingerprinting implícito que a Meta usava como fallback deixou de funcionar.
  • Chrome vai manter cookies third-party por enquanto, mas depreciação por Privacy Sandbox continua em fases — o _fbc como cookie third-party já foi afetado em certos contextos.
  • Em Android com browsers alternativos (Samsung Internet, Brave), bloqueio de scripts de rastreamento é ativado por padrão em versões novas.

Resultado: se você olhar no Events Manager a métrica Taxa de correspondência de eventos (Event Match Quality — EMQ), vai ver score abaixo de 6.0 em operações que dependem só do pixel browser. EMQ abaixo de 6 significa que a Meta não consegue associar o evento a um usuário confiável — o evento vai pra pool de otimização genérica, não alimenta seu público custom nem seu modelo de conversão.

CAPI server-side manda o evento direto do seu backend pra API da Meta, sem depender do browser do usuário. Você controla o payload, enriquece com dados que você tem (email, telefone, nome, CEP), e manda em tempo real. Score de EMQ sobe pra 7.5-9.0 facilmente com payload bem construído.

Arquitetura: as três formas de rodar CAPI

Antes de entrar em código, é importante entender as três arquiteturas disponíveis, porque a escolha impacta tanto a qualidade do sinal quanto a capacidade de contingência.

1. CAPI via integração nativa de plataforma (Shopify, VTEX, WooCommerce)

Meta tem integrações nativas com as principais plataformas. Você ativa no painel, conecta o pixel ID, e a plataforma começa a mandar eventos server-side de purchase, add-to-cart, etc.

Vantagens: zero código, deduplicação automática via event_id gerado pela plataforma, manutenção mínima.

Desvantagens: você não controla o payload. Não consegue enriquecer com dados de CRM, não manda eventos customizados de funil, e — o ponto crítico — quando você troca de pixel (porque BM caiu), depende da plataforma reconectar. Em alguns casos leva 24-72h esperando suporte da própria plataforma.

2. CAPI via Gateway da Meta (server-side via Meta)

A Meta oferece um gateway que você sobe via container Docker ou VM gerenciada por eles. O gateway intercepta eventos do pixel browser e os retransmite server-side com enriquecimento automático.

Vantagens: setup rápido, Meta gerencia infra, boa cobertura de eventos.

Desvantagens: dependência de infraestrutura da Meta. Quando BM tem problema, o gateway pode ser afetado também. Não é o modelo de contingência mais sólido.

3. CAPI direta via API — servidor próprio

Você implementa chamadas diretas pra graph.facebook.com/v19.0/{pixel_id}/events a partir do seu backend (Node, Python, PHP, Go — tanto faz). Controle total do payload, do timing, do enriquecimento, e — o mais importante — da chave de acesso.

Essa é a arquitetura que te dá real capacidade de contingência. Quando BM cai, você atualiza o pixel ID e o access token no seu servidor e o histórico de eventos começa a fluir pro pixel novo imediatamente. Sem esperar plataforma, sem esperar gateway.

Setup técnico: CAPI server-side direto

Pré-requisitos

  • Pixel criado e verificado no Events Manager
  • Access token de sistema (não de usuário) com permissão ads_management e business_management — gere via System User na BM, não via usuário pessoal. Token de usuário pessoal expira e cai junto com problemas de conta pessoal.
  • Servidor com capacidade de fazer requisição HTTP POST (qualquer backend serve)
  • Domínio verificado na BM (obrigatório pra CAPI funcionar com qualidade de sinal adequada)

Estrutura do payload de Purchase

O evento de Purchase enriquecido corretamente tem esta estrutura:

POST /v19.0/{pixel_id}/events

{
  "data": [
    {
      "event_name": "Purchase",
      "event_time": 1717200000,
      "event_id": "order_12345_1717200000",
      "event_source_url": "https://seudominio.com.br/obrigado",
      "action_source": "website",
      "user_data": {
        "em": ["<SHA256 do email em lowercase>"],
        "ph": ["<SHA256 do telefone em E.164>"],
        "fn": "<SHA256 do primeiro nome em lowercase>",
        "ln": "<SHA256 do sobrenome em lowercase>",
        "zp": "<SHA256 do CEP>",
        "ct": "<SHA256 da cidade em lowercase>",
        "st": "<SHA256 do estado em lowercase — 'sp', 'rj', etc.>",
        "country": "<SHA256 de 'br'>",
        "client_ip_address": "<IP real do usuário>",
        "client_user_agent": "<User-Agent real do browser do usuário>",
        "fbc": "<valor do cookie _fbc do usuário se disponível>",
        "fbp": "<valor do cookie _fbp do usuário se disponível>"
      },
      "custom_data": {
        "currency": "BRL",
        "value": 297.00,
        "content_ids": ["produto_456"],
        "content_type": "product",
        "content_name": "Nome do Produto",
        "num_items": 1
      }
    }
  ],
  "access_token": "<seu_system_user_token>",
  "test_event_code": "<remova em produção>"
}

Alguns pontos críticos nesse payload:

event_id — esse campo é o coração da deduplicação. Precisa ser único por evento real. O padrão {tipo}_{order_id}_{timestamp} funciona bem. O mesmo event_id enviado pelo pixel browser e pelo servidor diz pra Meta: "esses dois eventos são o mesmo — conta só uma vez".

Hash SHA256 — todos os campos de user_data pessoal (email, telefone, nome, endereço) devem ser hasheados com SHA256 antes de enviar. A Meta não aceita dados em texto claro. Email: lowercase, sem espaços. Telefone: formato E.164 (+5511999999999), sem formatação. Cidade: lowercase, sem acento.

client_ip_address e client_user_agent — sem esses dois campos, o evento server-side não contribui pro EMQ. Você precisa capturar o IP e o User-Agent do browser do usuário no momento do evento (normalmente na requisição que o frontend faz pro seu backend) e incluir aqui. Não use o IP do seu servidor.

fbc e fbp — se você captura os cookies do usuário (e deve), inclua. Eles são o elo de ligação entre o clique no anúncio e o evento server-side. Sem eles, a Meta associa o evento por dados pessoais hasheados (email/telefone), que funciona mas é menos preciso.

action_source — use "website" pra eventos de site. Use "crm" pra eventos retroativos de CRM. Use "email" pra eventos disparados por email marketing. Isso afeta como a Meta trata o evento no modelo de atribuição.

Enviando via Python (exemplo)

import hashlib
import time
import requests

def sha256_hash(value: str) -> str:
    return hashlib.sha256(value.strip().lower().encode()).hexdigest()

def send_purchase_event(
    pixel_id: str,
    access_token: str,
    order_id: str,
    email: str,
    phone: str,
    value: float,
    product_id: str,
    ip: str,
    user_agent: str,
    fbc: str = None,
    fbp: str = None
):
    event_time = int(time.time())
    event_id = f"purchase_{order_id}_{event_time}"

    user_data = {
        "em": [sha256_hash(email)],
        "ph": [sha256_hash(phone)],
        "client_ip_address": ip,
        "client_user_agent": user_agent,
    }
    if fbc:
        user_data["fbc"] = fbc
    if fbp:
        user_data["fbp"] = fbp

    payload = {
        "data": [{
            "event_name": "Purchase",
            "event_time": event_time,
            "event_id": event_id,
            "action_source": "website",
            "user_data": user_data,
            "custom_data": {
                "currency": "BRL",
                "value": value,
                "content_ids": [product_id],
                "content_type": "product",
                "num_items": 1
            }
        }],
        "access_token": access_token
    }

    url = f"https://graph.facebook.com/v19.0/{pixel_id}/events"
    response = requests.post(url, json=payload)
    return response.json()

Em Node.js o padrão é idêntico — crypto.createHash('sha256').update(value).digest('hex') pra hash, fetch ou axios pra POST.

Deduplicação browser + server: a parte que todo mundo erra

A deduplicação é o ponto onde a maioria das implementações quebra silenciosamente. O sintoma: Events Manager mostrando o dobro de purchases. Anunciante acha que vendeu mais e corta orçamento pra "não queimar". Na prática, está contando dois vezes.

O mecanismo de dedupe da Meta é simples: dois eventos com o mesmo event_name e o mesmo event_id, recebidos em menos de 48 horas, são deduplicados automaticamente. A Meta mantém o evento server-side (considerado mais confiável) e descarta o browser.

Para isso funcionar, você precisa:

No pixel browser (fbevents.js):

fbq('track', 'Purchase', {
  currency: 'BRL',
  value: 297.00,
  content_ids: ['produto_456'],
  content_type: 'product',
  num_items: 1
}, {
  eventID: 'purchase_12345_1717200000'  // mesmo event_id que o servidor vai mandar
});

O eventID no objeto de opções (segundo argumento do fbq track) é o campo de dedupe do lado browser.

No servidor: o mesmo valor no campo event_id do payload.

O desafio prático: o event_id precisa ser gerado antes de renderizar a página de obrigado (onde o pixel browser vai disparar), e também precisa estar disponível pra chamada server-side que acontece no backend quando o pedido é confirmado.

A solução mais simples: gere o event_id no momento de confirmação do pedido no backend, grave no banco junto com o pedido, e passe pro frontend via variável na página de obrigado. O frontend usa pra disparar o pixel. O backend usa pra chamar CAPI. Mesma string, dedupe garantido.

Erro comum 1: Gerar event_id diferente em cada call. Acontece quando o frontend gera um UUID e o backend gera outro. Resultado: dois eventos distintos, sem dedupe.

Erro comum 2: Usar timestamp puro como event_id. Se o frontend dispara em T+0 e o servidor dispara em T+2s, os timestamps são diferentes. Use o timestamp do momento de geração do pedido, fixo, não do momento de envio do evento.

Erro comum 3: Não passar eventID no pixel browser. Sem esse campo, a Meta não tenta deduplicar — os dois eventos entram no modelo independentemente.

Eventos enriquecidos além do Purchase

Purchase é o evento mais crítico, mas o funil completo bem instrumentado alimenta o algoritmo muito melhor. A Meta usa os eventos upstream (ViewContent, AddToCart, InitiateCheckout) pra modelar probabilidade de conversão e expandir audiência pra pessoas similares.

Quais eventos valem a pena rodar via CAPI server-side:

  • Lead — se você opera formulário, o submit do form deve disparar CAPI com email e telefone hasheados. Esse é o evento com maior impacto em campanhas de lead gen porque captura usuários que enviaram o form mas fecharam o browser antes do pixel browser disparar.
  • InitiateCheckout — captura usuário que chegou no checkout mas não comprou. Útil pra remarketing e pra sinal de intenção.
  • AddToCart — menor prioridade pra CAPI server-side, porque normalmente acontece via clique (JavaScript disponível). Mas em mobile com conexão instável, vale ter o fallback.
  • Purchase — prioridade máxima. Qualquer compra confirmada no backend deve ir via CAPI, independente do pixel browser ter disparado ou não.
  • Eventos customizados de CRM — se você tem funil de vendas com SDR/closer, pode mandar evento de action_source: "crm" quando um lead qualifica ou fecha. Isso alimenta o modelo com sinal de qualidade que o pixel nunca veria.

Monitorando qualidade no Events Manager

Depois de implementar, você monitora em Events Manager → seu pixel → Atividade de eventos.

Métricas que importam:

Taxa de correspondência (EMQ): escala de 0 a 10. Abaixo de 5: sinal fraco, o algoritmo não consegue associar os eventos a usuários conhecidos. 6-7: aceitável. 8-9: ótimo. 10: praticamente impossível com tráfego real (indicaria dados artificiais).

O que eleva EMQ:

  • Email hasheado (maior peso)
  • Telefone hasheado (segundo maior peso)
  • fbc e fbp presentes
  • IP e User-Agent corretos
  • Nome e endereço hasheados (contribuição menor mas acumulativa)

Eventos recebidos (Server): deve bater com seu volume de pedidos real. Se você vende 100 orders/dia e CAPI mostra 60 eventos server-side de Purchase, tem bug de implementação — provavelmente o evento não está sendo disparado em todos os fluxos de checkout (PIX confirmado assincronamente, boleto, fallback de gateway, etc.).

Taxa de deduplicação: Events Manager mostra quantos eventos foram deduplicados. Se for zero com pixel browser também ativo, a deduplicação está quebrada — revise o event_id.

Cobertura de eventos: porcentagem de eventos que vieram apenas server-side, apenas browser, ou ambos (com dedupe). O ideal é que a maioria venha de ambas as origens — significa que você tem cobertura completa.

A estratégia de contingência: portando eventos quando BM cai

Aqui está o valor real do CAPI server-side pra operações que sofrem instabilidade de estrutura.

Quando uma BM cai, o pixel associado a ela fica inacessível. Se você só tinha pixel browser, o histórico de eventos está preso naquele pixel — e você começa do zero com pixel novo, sem dados de audiência, sem histórico de otimização, sem public custom de compradores. A fase de reaquecimento do algoritmo dura 7-14 dias dependendo do volume.

Com CAPI server-side próprio, o processo é diferente:

1. Crie pixel novo (numa BM cedida ou na sua BM de backup)

2. Atualize duas variáveis no seu servidor:

  • PIXEL_ID → novo pixel
  • ACCESS_TOKEN → novo system user token associado ao pixel novo

3. Retroalimente eventos dos últimos 7 dias via batch CAPI. A API aceita event_time até 7 dias no passado. Você pega o histórico de pedidos do seu banco e manda em batch:

# exemplo de retroalimentação de eventos passados
for order in last_7_days_orders:
    send_purchase_event(
        pixel_id=NEW_PIXEL_ID,
        access_token=NEW_ACCESS_TOKEN,
        order_id=order.id,
        email=order.customer_email,
        # ... demais campos
        event_time=order.confirmed_at_timestamp  # timestamp original do pedido
    )

Em 2-4 horas de processamento da API, o pixel novo tem histórico de purchase dos últimos 7 dias. Público custom de compradores recentes está populado. Algoritmo tem sinal pra otimizar.

Comparado com zero dados num pixel completamente novo, essa diferença é enorme em termos de velocidade de reaquecimento. Campanhas retomam performance em 24-48h vs 10-14 dias.

4. Atualize o pixel browser na tag do GTM ou no código hardcoded — troque o pixel ID e republique.

Com GTM, essa última etapa leva menos de 5 minutos. Sem GTM (pixel no código), depende de deploy — argumento forte pra usar GTM em qualquer operação que sofra risco de troca de estrutura.

Gerando o System User Token corretamente

Esse passo é frequentemente feito errado. Token de usuário pessoal é o erro mais comum:

  • Token de usuário pessoal expira em 60-90 dias
  • Token de usuário pessoal fica inválido se a conta pessoal tiver problema
  • Token de usuário pessoal não funciona se o usuário for removido da BM

System User Token:

  • Não expira (a menos que você revogue manualmente)
  • Não está associado a nenhuma conta pessoal
  • Funciona mesmo se admin humano for removido da BM

Como gerar:

  1. BM → Configurações → Usuários → Usuários do Sistema
  2. Adicionar → Nome (ex: "CAPI Server") → Função: Admin
  3. Gerar token → selecione o app que você criou (ou crie app básico via developers.facebook.com)
  4. Permissões mínimas: ads_management, pages_show_list (se precisar de fanpage)
  5. Defina sem expiração
  6. Guarde o token em variável de ambiente no servidor — nunca no repositório

Assim o token sobrevive a qualquer turbulência de conta pessoal.

Checklist de implementação CAPI server-side

  • Pixel criado com domínio verificado na BM
  • System User Token gerado (não token de usuário pessoal)
  • Token armazenado em variável de ambiente (não hardcoded)
  • Backend dispara CAPI em todos os fluxos de confirmação de pedido (PIX, cartão, boleto após compensação)
  • Payload inclui IP e User-Agent real do cliente (não do servidor)
  • Todos os campos PII hasheados com SHA256 (email lowercase, telefone E.164)
  • event_id gerado no backend no momento do pedido e passado pro frontend
  • Pixel browser usando mesmo event_id no campo eventID do fbq track
  • Events Manager mostrando deduplicação ativa
  • EMQ acima de 7.0
  • Alertas configurados pra queda de volume de eventos (ferramentas como Grafana, Datadog ou até um cron simples que alerta se purchase count cair 50% em relação à média)
  • Script de retroalimentação testado com pedidos reais do último mês (roda em modo de teste com test_event_code pra não poluir dados reais)
  • Novo pixel ID e token atualizáveis em menos de 5 minutos no servidor

Erros que comprometem silenciosamente a implementação

Alguns erros não quebram a implementação — eles apenas reduzem a qualidade do sinal sem erro visível:

Telefone sem DDI: 11999999999 hasheado é diferente de +5511999999999 hasheado. A Meta não consegue fazer match. Sempre normalize pro formato E.164 antes de hashar.

Email com letras maiúsculas: João@gmail.com hasheado é diferente de joão@gmail.com. Sempre .toLowerCase() antes do hash.

Envio atrasado: CAPI aceita eventos com até 7 dias de atraso, mas eventos com mais de 1 hora de delay têm peso menor no modelo de atribuição. Dispare o mais próximo possível do evento real.

Payload de valor errado: value deve ser o valor líquido da compra em BRL (ou na moeda configurada no pixel). Mandar valor bruto com frete quando o produto custa R$ 297 e o total com frete é R$ 327 distorce o modelo de ROAS.

Não mandar content_ids: sem content_ids correspondendo ao catálogo de produtos, campanhas de DPA (Dynamic Product Ads) não conseguem associar o evento ao produto — retargeting de produto específico fica cego.

Advantage+ e CAPI: por que o sinal ficou ainda mais crítico

Com Advantage+ assumindo controle de decisão de entrega, a qualidade do sinal de evento virou o principal alavanca que o gestor ainda controla. No modelo de campanha manual, você definia audiência, placement, CPA target — o algoritmo otimizava dentro dos seus parâmetros. Com Advantage+ Shopping e Advantage+ Audience, você entrega criativo e orçamento e o modelo decide tudo mais.

Isso significa que um sinal ruim (pixel browser sem CAPI, EMQ baixo, poucos eventos, dados sem enriquecimento) traduz diretamente em modelo pior, CPA mais alto, e dificuldade pra escalar. Não tem como compensar com ajuste de audiência ou bid manual porque você simplesmente não tem mais esses controles.

Na prática, gestor que opera Advantage+ com pixel browser sozinho em 2026 está dando ao concorrente — que tem CAPI com EMQ 8.5 — uma vantagem estrutural de custo por resultado. O mesmo orçamento, modelo melhor alimentado, CPM efetivo menor.

Isso se intensifica quando você considera que criativos em escala (30-50 variações por semana) geram mais eventos de revisão automática, e que o algoritmo depende de volume de sinal pra estabilizar performance após cada ciclo de teste. Sinal fraco + alto volume de variações = instabilidade crônica de campanha.

Considerações de privacidade e LGPD

CAPI transmite dados pessoais hasheados pra Meta. Do ponto de vista da LGPD, você é controlador dos dados do seu cliente e a Meta é operadora. Você precisa:

  • Consentimento explícito do usuário pra coleta e compartilhamento de dados pra fins de publicidade (normalmente coberto pelo banner de cookies + política de privacidade)
  • Política de privacidade que menciona explicitamente compartilhamento com Meta para fins de segmentação
  • Contrato de Proteção de Dados com Meta (aceito nos termos de serviço do pixel quando você habilita CAPI)

O hash SHA256 não é anonimização completa (é pseudonimização — reversível se você souber o valor original), então não elimina a obrigação de consentimento. Mas a Meta exige o hash por contrato, não como bypass de privacidade.

Na prática, se você já tem banner de cookies e política de privacidade adequados pro pixel browser, CAPI não adiciona obrigação nova — apenas formaliza o compartilhamento que já estava acontecendo via pixel.

Quando a BM cai: o fluxo completo de continuidade

Condensando tudo acima num fluxo operacional pra momento de crise:

  • BM caiu → campanhas pausadas → pixel inacessível
  • Abre recurso pelo Support Home (não vai esperar — vai continuar operando em paralelo)
  • Sobe nova estrutura: pixel novo em BM cedida ou BM de backup
  • Atualiza pixel ID e access token no servidor de CAPI (2 variáveis de ambiente)
  • Executa script de retroalimentação com pedidos dos últimos 7 dias
  • Atualiza pixel no GTM (novo ID) — republica
  • Sobe campanha nova no pixel novo — já tem histórico de purchase, audiência custom populada
  • Monitor de Events Manager confirma volume de eventos voltando ao normal
  • Operação retomada em 24-48h em vez de 10-14 dias de reaquecimento do zero

A diferença entre esse fluxo e o gestor sem CAPI: um retoma em 24h, o outro passa 2 semanas tentando reativar BM enquanto o caixa sangra.

Ferramentas complementares no stack de tracking

CAPI server-side resolve a camada de conversão pra Meta. Mas o stack de tracking completo de uma operação que sofre instabilidade de estrutura geralmente inclui:

  • Tracker de servidor (RedTrack, Binom, Voluum) — captura 100% dos cliques no nível de servidor, independente de pixel. Quando você migra de pixel, histórico de clique continua no tracker.
  • GTM server-side — container server-side que roda na sua infra, captura dados de primeiro partido antes de distribuir pra Meta, Google, TikTok. Mais resiliente que tags client-side e reduz carga no browser do usuário.
  • Webhook de plataforma de pagamento — Stripe, PagarMe, Mercado Pago oferecem webhooks de confirmação de pagamento. Use esse webhook como gatilho pro CAPI de Purchase — é o sinal mais confiável de conversão real porque vem diretamente da plataforma de pagamento, não do comportamento do usuário no browser.

A integração webhook → CAPI é especialmente importante pra fluxos assíncronos: PIX confirmado 2 minutos depois do clique, boleto pago 2 dias depois. O pixel browser nunca captaria esses eventos. CAPI via webhook captura 100%.

Enquanto a BM não volta

Implementar CAPI server-side resolve a camada de tracking. Mas se a BM está caída, você também precisa de estrutura de anúncio pra rodar enquanto o recurso processa. Pixel com histórico sem conta de anúncio não anuncia nada.

Enquanto a BM bloqueada não volta — e o recurso pode levar de 2 dias a 3 semanas — dá pra retomar o gasto entregando contas de anúncio direto na sua BM (ou numa BM cedida) via ADS FLOW, com o pixel novo que você acabou de configurar com CAPI. Toda a estrutura de sinal que você montou já está funcionando pra novo pixel — só precisa do veículo de anúncio pra ativar. Conversa: t.me/oadsflow.

Precisa rodar sem queimar BM?

Provisionamos contas Meta compartilhadas direto na sua BM. 30 a 1.000+ contas, com fanpages 2021 opcionais, BMs cedidas — você não expõe sua estrutura.

Continue lendo