A venda chega sem o clique
O webhook de venda só traz a origem se o click id foi levado até o checkout. Parâmetro de texto livre, UTM ou cupom no lugar do click id não atribui nada.
Middleware que liga o checkout, o RedTrack e a Meta. Cada venda vira uma conversão atribuída ao clique certo, uma única vez, mesmo com webhook duplicado, fora de ordem ou destino fora do ar.
Ambiente LAB 24/7 · fluxo validado com compras reais de teste
A plataforma de vendas sabe que alguém comprou. O RedTrack sabe de qual anúncio veio o clique. Quando a ponte entre os dois falha, o gerenciador de anúncios otimiza com dado errado e ninguém percebe na hora.
O webhook de venda só traz a origem se o click id foi levado até o checkout. Parâmetro de texto livre, UTM ou cupom no lugar do click id não atribui nada.
Bloqueador de anúncio, proteção de rastreamento do navegador ou aba fechada antes do disparo. Se a compra depende do navegador, uma parte some.
A plataforma reentrega o mesmo evento quando não recebe resposta. Sem proteção, a mesma venda vira duas conversões e o retorno do anúncio parece maior do que é.
Cada etapa do funil é uma transação própria. Se tudo sai como uma compra só, ou com a mesma chave, a receita do bump e do upsell some ou é contada como venda nova.
O RedTrack registra o reembolso como uma conversão separada e não tira o valor da venda original. Sem conta própria, o painel mostra receita bruta como se fosse líquida.
Renovação de assinatura é receita, mas não é venda nova para o anúncio. Uma oferta lançada sem mapeamento chega sem tipo e cai no lugar errado, ou em lugar nenhum.
Do clique no anúncio até o evento de conversão na Meta. Cada cor é uma plataforma; as etapas marcadas como "Este projeto" são código próprio.
O domínio de tracking do RedTrack registra o clique e gera um click id de 24 caracteres.
Script próprio lê o click id (query e cookies), dispara InitiateCheckout e marcos do vídeo (play, 1, 3, 5 e 10 min) com deduplicação. Falha de rede nunca bloqueia a ida ao checkout.
O click id segue nos parâmetros de origem da plataforma de checkout até a compra. A Hotmart é a integração pronta hoje.
Token comparado em tempo constante, schema validado com Zod, dados pessoais redigidos, evento classificado e gravado de forma idempotente antes de qualquer envio.
Conversão enviada ao RedTrack com valor, tipo e id da transação. Timeout, erro de rede, 429 e 5xx entram em retry com backoff exponencial. Erro 4xx não é repetido.
O RedTrack repassa o evento para a Meta. Compra, order bump e upsell chegam como compras distintas, uma por transação, sem uma apagar a outra na deduplicação.
O mesmo fluxo desta página, do clique no anúncio até o evento na Meta, desenhado como um mapa mental e explicado um galho de cada vez.
O caminho de uma venda, do clique até a Meta, em uns 8 minutos: eu leio o mapa resumido bloco por bloco, na mesma ordem.
Narração em português. O arquivo só é baixado quando você aperta play.
O mapa completo tem acesso restrito. O vídeo acima mostra o resumo; para ver cada detalhe, fale comigo.
Cada evento tem uma regra de classificação, um destino e uma chave contra duplicidade. O que não deve virar conversão fica gravado, mas não é enviado.
| Evento | Como é identificado | RedTrack | Meta (via RedTrack) | Chave contra duplicidade |
|---|---|---|---|---|
| Navegador | ||||
| InitiateCheckoutValidado ponta a ponta | Clique no botão de compra da página, disparado pelo script próprio. | InitiateCheckoutNo click id da página | InitiateCheckoutEvento padrão | click id + tipo, uma vez por sessão |
| Marcos do vídeoValidado ponta a ponta | Play e 1, 3, 5 e 10 minutos assistidos na VSL. | Um tipo por marco | Não envia, de propósito: sinal granular demais para otimizar | click id + tipo, uma vez por sessão |
| Venda | ||||
| CompraValidado ponta a ponta | Compra aprovada de oferta mapeada como principal, na primeira cobrança. | PurchaseValor e id da transação | PurchaseUma por transação | id do evento + par transação/evento |
| Order bumpValidado ponta a ponta | Pelo código da oferta, não pela flag de bump do payload. | orderbumpTransação própria | PurchaseCompra distinta | id do evento + par transação/evento |
| UpsellValidado ponta a ponta | Pelo código da oferta. | upsellTransação própria | PurchaseCompra distinta | id do evento + par transação/evento |
| DownsellSem transação real ainda | Pelo código da oferta. | downsellTransação própria | Definido na implantação | id do evento + par transação/evento |
| Estorno | ||||
| Reembolso | Evento de reembolso, para qualquer oferta. Não depende de mapeamento. | refundedNova conversão no mesmo clique, com o valor original | refundedEvento personalizado | id do evento + par transação/evento |
| ChargebackSem transação real ainda | Evento de chargeback, para qualquer oferta. | chargebackNova conversão no mesmo clique | chargebackEvento personalizado | id do evento + par transação/evento |
| Gravado, sem envio | ||||
| Renovação | Compra aprovada com número de recorrência maior que 1. Em assinatura sem esse número, ele é buscado na API de pagamentos. | Não envia | Não envia | id do evento + par transação/evento |
| Cancelamento, atraso, inadimplência | Eventos do ciclo de vida da assinatura. | Não envia | Não envia | id do evento + par transação/evento |
| Oferta desconhecida | Código de oferta sem mapeamento. Nunca vira compra por padrão. | Fica no painel até ser mapeada; depois, prévia e reprocessamento | Não envia | id do evento + par transação/evento |
InitiateCheckout
Validado ponta a pontaClique no botão de compra da página, disparado pelo script próprio.
InitiateCheckoutNo click id da páginaInitiateCheckoutEvento padrãoMarcos do vídeo
Validado ponta a pontaPlay e 1, 3, 5 e 10 minutos assistidos na VSL.
Compra
Validado ponta a pontaCompra aprovada de oferta mapeada como principal, na primeira cobrança.
PurchaseValor e id da transaçãoPurchaseUma por transaçãoOrder bump
Validado ponta a pontaPelo código da oferta, não pela flag de bump do payload.
orderbumpTransação própriaPurchaseCompra distintaUpsell
Validado ponta a pontaPelo código da oferta.
upsellTransação própriaPurchaseCompra distintaDownsell
Sem transação real aindaPelo código da oferta.
downsellTransação própriaReembolso
Evento de reembolso, para qualquer oferta. Não depende de mapeamento.
refundedNova conversão no mesmo clique, com o valor originalrefundedEvento personalizadoChargeback
Sem transação real aindaEvento de chargeback, para qualquer oferta.
chargebackNova conversão no mesmo cliquechargebackEvento personalizadoRenovação
Compra aprovada com número de recorrência maior que 1. Em assinatura sem esse número, ele é buscado na API de pagamentos.
Cancelamento, atraso, inadimplência
Eventos do ciclo de vida da assinatura.
Oferta desconhecida
Código de oferta sem mapeamento. Nunca vira compra por padrão.
O caminho feliz é a linha contínua. As caixas tracejadas mostram o que acontece quando algo dá errado, e onde cada caso aparece para quem opera.
Retry no detalhe: por padrão até 3 tentativas por envio, timeout de 8 segundos e espera que dobra a partir de 500 ms. Só timeout ou erro de rede, 429 e 5xx são repetidos. Se o envio falha, o webhook responde 502; quando a plataforma de checkout reentrega o mesmo evento, o envio é refeito sobre a mesma linha, sem duplicar.
Id do evento como chave primária e par transação + evento único. Duplicatas vão para uma tabela própria. Reentrega de um evento que tinha falhado refaz o envio sem criar linha nova.
Compra, order bump, upsell, downsell, renovação, reembolso, chargeback, cancelamento, atraso, inadimplência e desconhecido. Renovação entra na receita e não é enviada como conversão nova.
Só 24 caracteres hexadecimais contam. O parâmetro preferido vem primeiro, o outro é plano B, e texto livre fica guardado como veio, sem virar atribuição.
Quando falta informação de recorrência, o backend consulta a API de pagamentos da plataforma depois de responder ao webhook. O merge só preenche campos vazios, divergência vira conflito para revisão.
CRUD com optimistic locking, trilha de auditoria append-only e snapshot em memória que falha fechado no boot. Rollback por feature flag, sem migração destrutiva.
Evento já enviado não é reenviado nem reclassificado automaticamente. Mudança de mapeamento depois do envio vira conflito visível no painel, com prévia antes de reprocessar.
Bruto, renovações, reembolsos, chargebacks e líquido calculados a partir dos eventos. Reembolso e chargeback da mesma transação descontam uma vez só. Com histórico incompleto, o líquido fica nulo em vez de um zero inventado.
Health e readiness, contadores de duplicatas e retries que sobrevivem a restart, e alertas de backlog, taxa de falha, pendência antiga e ausência de webhook, expostos na API de resumo da operação. Migrations aditivas e idempotentes.
A plataforma de checkout é a verdade financeira, o banco é a verdade operacional, o RedTrack cuida da atribuição e a Meta só de otimização.
O volume não justifica. Retry e enriquecimento rodam no próprio processo, em instância única, e a reentrega da plataforma de checkout funciona como segunda chance. O limite dessa escolha está documentado.
O clique da página recebe os eventos de engajamento. O clique de checkout recebe a compra. Separar os dois evita atribuir venda ao evento errado.
O backend não chama a Conversions API direto. Um único caminho de envio reduz o risco de evento duplicado na Meta.
O reembolso não edita a compra original: entra como outro tipo no mesmo clique. O histórico de venda aprovada e depois devolvida fica preservado, e a taxa de reembolso vira métrica própria.
O painel pode pedir a um modelo uma sugestão de mapeamento para oferta desconhecida. A sugestão nunca grava nada. O envio continua determinístico.
Testes automatizados com Vitest, unitários e de integração via HTTP, sem rede externa: banco efêmero e RedTrack simulado. O deploy roda typecheck e os testes antes do build e das migrations.
Duplicata não grava duas vezes, aprovação e reembolso da mesma transação viram duas linhas, renovação nunca vai ao RedTrack, 5xx é repetido e 4xx não.
CRUD com versão esperada, auditoria, drivers Postgres e SQLite, snapshot que recusa linha inválida e boot que aborta se o banco não responde.
Login com rate limit, sessão expirada, CSRF obrigatório em mutação, cabeçalhos de segurança e páginas que nunca contêm o token.
Consulta só depois da resposta, merge que só preenche vazios, conflito sem sobrescrever e envio bloqueado enquanto a recorrência está pendente.
Fixture fora do financeiro real e estorno sem a venda original deixando o líquido nulo.
Sem mapeamento devolve 409, reprocessar duas vezes envia uma, evento já enviado não é reinterpretado e a prévia não altera nada.
Duplo clique não duplica o envio, cada marco do vídeo dispara uma vez e falha ou timeout ainda leva ao checkout.
Transação no Postgres, readiness que responde 503 sem vazar erro do driver e cliente do modelo de sugestão.
Interface em HTML, CSS e ES modules servida pelo próprio backend, sem framework e sem bundler. Cinco telas: visão geral, eventos, ofertas, ofertas desconhecidas e enriquecimento. As telas abaixo usam dados sintéticos.

Implanto e mantenho esta plataforma para operações que usam RedTrack. A base já está pronta: o trabalho é conectar o seu funil, mapear as suas ofertas e validar com uma compra de teste antes de virar a chave.
Página, VSL, checkout, ofertas, order bumps e upsells, fontes de tráfego e o que já existe de pixel e Conversions API.
Para cada evento do seu funil: se existe, se entra no financeiro, se vai ao RedTrack e se vai à Meta. Só com confirmação sua ou payload real.
Convites nos painéis oficiais, sempre com a menor permissão necessária. Nenhuma senha ou token por chat.
Domínio de tracking, webhook, ofertas e script na página. Mudança de DNS ou de webhook só com o registro exato confirmado e o rollback definido antes.
Uma compra real de teste percorre o funil inteiro. Só vai para o ar depois que cada ponto abaixo for conferido.
Acompanhamento do painel e ajustes conforme o funil muda.
Hoje mantenho o tracking com RedTrack de um cliente em operação. A plataforma foi validada de ponta a ponta com compras reais de teste, e cada nova implantação tem acompanhamento próximo. Valores são combinados em conversa, depois do diagnóstico.
Falar sobre implantaçãoA segunda entrega recebe 200, fica registrada numa tabela de duplicatas e nada é reenviado ao RedTrack. A chave é o id do evento mais o par transação e tipo de evento. A exceção é proposital: se o primeiro envio tinha falhado, a reentrega refaz o envio na mesma linha.
Timeout, erro de rede, 429 e erro 5xx são repetidos com espera crescente. Se ainda falhar, o evento fica gravado como falho, aparece no painel e pode ser reenviado manualmente pelo operador, por um endpoint da API de operação. A reentrega da plataforma de checkout também refaz o envio. Nada é perdido em silêncio.
A Hotmart é a integração pronta hoje. Classificação, idempotência e envio trabalham sobre um modelo interno de evento, então outra plataforma de checkout entra como um novo adaptador de webhook. Isso é avaliado caso a caso, antes de fechar.
Não. A plataforma foi feita para o RedTrack. Sua conta, campanhas e relatórios continuam onde estão; o que muda é que a venda passa a chegar nela de forma confiável.
Não tira, e isso é do próprio RedTrack: o reembolso entra como outra conversão no mesmo clique, com o valor original. O ROAS nativo continua bruto. O líquido é calculado no painel, que desconta reembolso e chargeback uma vez por transação.
Num banco Postgres próprio da implantação. A plataforma não é multi-cliente, então não existe base compartilhada com outras operações. Nome, e-mail, telefone, documento e endereço do comprador são redigidos antes de gravar.
O acesso é por convite nos painéis oficiais, com a menor permissão que resolve, e você pode revogar quando quiser. Credenciais de API vão direto para a variável de ambiente do servidor, nunca por chat. Mudança de DNS só com o registro exato e o rollback combinados antes.
Acesso ao RedTrack e ao produto na plataforma de checkout, o pixel ou dataset da Meta em uso, um registro de DNS, a lista de ofertas com os códigos e o contato de quem aprova mudanças.
Oferta nova é mapeada no painel, com histórico de alterações. Oferta desconhecida e falha de envio aparecem no painel e são tratadas uma a uma, com prévia antes de reprocessar. Os alertas ficam no resumo da API de operação. Quando checkout e RedTrack divergem, a reconciliação mostra onde.
Depende do funil: quantas ofertas, se há assinatura, se há VSL, qual checkout. O valor é combinado em conversa, depois do diagnóstico.
Me conte como é o seu funil. Respondo com o que precisa ser feito para implantar e o que fica de fora.
Ajuda mandar junto
Projeto independente. Não é afiliado nem endossado por RedTrack, Hotmart ou Meta. Nomes e marcas pertencem aos respectivos donos.