Atribuição e ROI
A parte que decide se este projeto dá retorno ou vira despesa. Sem ela, os R$ 4.500 por mês viram fumaça e nenhum painel consegue dizer de onde veio cliente.
O problema real
O caminho do dinheiro neste modelo é longo:
clique no anúncio → landing → conecta a loja → Raio-X →
lead score → fila do vendedor → ligação → upgrade → Hub
Entre o clique e a receita que importa podem passar semanas. Se a medição parar no clique ou no formulário, três coisas acontecem, todas caras:
- O algoritmo da Meta aprende a trazer quem clica, não quem paga.
- O Google otimiza lance para conversões que não são receita.
- Você não consegue responder qual criativo trouxe cliente bom, então escala o errado.
A cadeia completa
1. Captura na landing
Toda requisição pública grava, em cookie primário de 90 dias e no banco:
utm_source · utm_medium · utm_campaign · utm_content · utm_term · gclid · wbraid · gbraid · fbclid · _fbp · _fbc · referrer · landing path · IP · user agent
Quando o cookie _fbc não existir mas houver fbclid na URL, reconstruir:
fb.1.<timestamp_em_milissegundos>.<fbclid>
2. Persistência
Ao conectar a loja, tudo vai para o Lead — primeiro toque e último toque, os dois. Ao comprar, tudo vai para o metadata do Customer e da Subscription na Stripe.
Modelo padrão do painel: último toque não direto. O primeiro toque fica disponível para comparação, porque em ciclo longo ele conta uma história diferente e às vezes mais verdadeira.
3. Conversions API da Meta
No webhook checkout.session.completed e no fim do Raio-X, enviar evento server-side com event_id igual ao do pixel, para deduplicação.
event_name, event_time, event_id, action_source="website", event_source_url
user_data:
em = sha256(email minúsculo, sem espaço)
ph = sha256(telefone E.164, sem "+" e sem separador)
fn, ln = sha256(nome, sobrenome minúsculos)
fbc = cookie _fbc ou reconstruído
fbp = cookie _fbp
client_ip_address, client_user_agent
custom_data:
value, currency="BRL", content_name, content_ids
4. Conversão offline no Google
ConversionUploadService.UploadClickConversions com gclid (ou wbraid/gbraid para tráfego iOS), a ação de conversão, data e hora com fuso, valor, moeda e order_id — o id da assinatura na Stripe, que permite ajuste e estorno depois.
Para quem chega sem click id, conversão aprimorada por UserIdentifier com e-mail e telefone em hash.
Os valores — a parte que ensina o algoritmo
Este é o ponto mais importante da página. Não mande o preço de etiqueta; mande o valor econômico.
| Evento | Valor enviado | Por quê |
|---|---|---|
| Loja conectada, fatura abaixo de R$ 30 mil | R$ 0 | Não é cliente. Não queremos mais como ele |
| Loja conectada, fatura R$ 30 mil ou mais | R$ 150 | Vale o que economiza de prospecção |
| Radar Essencial R$ 97/ano | R$ 97 | Valor real |
| Radar Pro ou Anúncios R$ 49/mês | R$ 294 | Seis meses esperados |
| Hub | R$ 3.600 | LTV estimado, 18 meses com margem |
Com essa hierarquia, o algoritmo aprende que um dono de loja grande vale 24 vezes um curioso, e passa a caçar o perfil certo. É a diferença entre CPL de R$ 22 com lead ruim e CPLQ de R$ 68 com lead que fecha.
Documentar a origem de cada valor e revisar a cada trimestre com os números reais do painel.
Robustez
- Eventos vão para fila Celery dedicada, com retry exponencial por até 24 horas
- Cada envio e cada resposta ficam gravados para auditoria
- Falha de CAPI nunca pode derrubar o checkout. O dinheiro entra primeiro; a medição é consequência
Privacidade
- Nunca enviar e-mail ou telefone em claro para Meta ou Google. Sempre SHA-256 do valor normalizado
- Registrar no aviso de privacidade que dados pseudonimizados são compartilhados para medição
- Respeitar recusa de cookies: sem consentimento, não enviar
fbp,fbcnem IP — enviar só o evento com dados em hash
O painel
roi.ecomsmart.com.br, alimentado por três ingestões diárias às 5h.
| Fonte | O que traz | Observação |
|---|---|---|
| Meta Insights API | spend, impressões, cliques, conversões por anúncio e por dia | Reprocessar 7 dias: a Meta ajusta retroativamente |
| Google Ads API | custo, cliques, conversões por campanha, grupo e palavra | cost_micros dividido por 10.000 dá centavos |
| Stripe | charges, assinaturas, MRR, churn, metadata de atribuição | Webhook em tempo real mais reconciliação diária |
A reconciliação da Stripe não é opcional: webhook perdido acontece, e sem ela o painel mente.
A ponte
utm_content do lead casa com anuncio_nome do gasto. Foi por isso que a nomenclatura de criativo é rígida.
| Confiança | Quando |
|---|---|
exata | utm_content casou com um anúncio |
heuristica | só utm_campaign casou |
sem_atribuicao | não havia utm |
O percentual sem atribuição aparece no painel. Saber que 18% da receita não tem origem conhecida é informação; esconder isso é mentir para si mesmo.
Métricas
investido = soma do custo
receita_atribuida = soma da receita atribuída à campanha
CAC = investido / (vendas_radar + vendas_hub)
CPL = investido / leads
CPLQ = investido / leads_qualificados
ROAS_imediato = receita_atribuida / investido
ROAS_90d = receita de 90 dias da coorte / investido
MRR_novo = soma do recorrente das assinaturas novas
payback_dias = dias até a receita acumulada cobrir o investido
ROAS_90d e payback_dias são os que decidem escala. O ROAS_imediato vai sempre parecer ruim num modelo com vendedor no meio — o painel precisa dizer isso na tela, senão alguém vai cortar uma campanha boa.
Telas
- Hoje — quatro KPIs: investido, faturado, ROAS, MRR. Gráfico de 30 dias. As cinco campanhas com pior CAC
- Campanhas — tabela com CAC, ROAS 90 dias e payback, semáforo com forma além da cor, expansível até o criativo
- Palavras-chave — investido contra receita, ordenado por desperdício, exporta negativas
- Funil — cliques, leads, qualificados, Radar, Hub, com taxa entre etapas e comparação com a meta
- Coortes — matriz de mês de entrada por meses decorridos, receita acumulada por cliente
Alerta diário às 8h
Ontem · 21/09 Investido R$ 148,20 · Faturado R$ 291,00 · ROAS 1,96 9 lojas conectadas · 3 com faturamento acima de R$ 30 mil Radar de Preço com CAC de R$ 112 contra a meta de R$ 90. Três criativos com CTR abaixo de 0,8%. 2 leads na fila A aguardando ligação.
Critério de partida
Nenhuma campanha é ativada antes de: evento
Purchaseaparecendo deduplicado no Gerenciador de Eventos da Meta, qualidade de correspondência igual ou acima de 6,0, e conversão offline aparecendo no Google Ads em até 24 horas com valor eorder_id.