linear, time_decay e position_based calculam os pesos em basis points e quanto cada clique gera de Comissão.
Para a teoria dos modelos e da janela de atribuição, veja Atribuição. Aqui o foco é o cálculo passo a passo.
Dinheiro é sempre centavos (inteiro) e pesos são sempre basis points (bps):
10000 bps = 100%. A soma dos pesos dos cliques vencedores é exatamente 10000.A jornada de exemplo
Suponha um Programaprog_01HZX... com janela de atribuição de 30 dias e o cliente convertendo numa cobrança de R$ 200,00 (amountCents: 20000) sob uma regra percentage de 10% (percentageBps: 1000).
O cliente acumulou quatro cliques dentro da janela, todos não-bot, não expirados e anteriores à conversão (regras de candidatura em Atribuição e Tracking):
A conversão ocorre no dia 14. O modelo aplicado é o do Programa (campo
attributionModel), congelado em attributionSnapshot.model na conversão.
Como os pesos viram basis points
Cada modelo produz pesos brutos por clique. Esses pesos são normalizados para somar exatamente 10000 bps pelo método dos maiores restos:1
Peso bruto por clique
O modelo atribui um número real a cada clique (parte igual no
linear, decaimento exponencial no time_decay, posição no position_based).2
Conversão proporcional para 10000
Cada peso vira
floor(peso_bruto / soma_dos_pesos × 10000). A soma desses pisos costuma ficar abaixo de 10000.3
Distribuição da sobra (maiores restos)
Os bps restantes são distribuídos um a um para os cliques com maior fração descartada. Desempate: maior fração →
occurredAt mais recente → ordem de entrada dos candidatos.4
Descarte de pesos zero
Cliques que normalizam para 0 bps são removidos dos vencedores: não recebem Comissão nem são marcados como convertidos (
convertedAt).occurredAt DESC → ordem de entrada. O winners[0] resultante é o vencedor primário e define conversion.affiliateId e conversion.clickId.
Como a Comissão total vira parcelas
A Comissão não é arredondada peça por peça. O cálculo tem duas etapas:- Comissão total da cobrança (half-up sobre inteiros):
total = round_half_up(baseCents × percentageBps / 10000). Aqui:round_half_up(20000 × 1000 / 10000) = 2000centavos (R$ 20,00). - Split por peso (
floorpor parte + sobra ao maior peso): cada parte virafloor(total × weightBps / 10000); a sobra inteira (total − Σ partes) é creditada integralmente ao winner de maior peso (empate → o primário). Assim a soma das parcelas é exatamente o total.
Modelo linear
Divide o crédito igualmente entre os cliques candidatos. Com 4 cliques, cada um recebe 10000 / 4 = 2500 bps exatos, sem sobra a distribuir.
Como os pesos são exatos (2500 bps cada), não há sobra a redistribuir:
floor(2000 × 2500 / 10000) = 500 para cada parte.
Modelo time_decay
Pesa cada clique por 2^(−Δt / meia-vida), com meia-vida fixa de 7 dias. A referência é o clique mais recente; como os pesos são normalizados, deslocar a referência não muda o resultado.
Pesos brutos (Δt em dias):
clk_A(Δt 14):2^(−14/7) = 2^(−2) = 0,25clk_B(Δt 7):2^(−7/7) = 2^(−1) = 0,50clk_C(Δt 3):2^(−3/7) ≈ 0,7430clk_D(Δt 0):2^(0) = 1,00
2,4930. Normalizando para 10000 bps pelo método dos maiores restos (sobra de 2 bps para os dois maiores restos: clk_A e clk_B):
O clique mais recente (
clk_D) leva a maior fatia. A soma dos floor dá 1999; a sobra de 1 centavo vai ao maior peso (clk_D), que fica com 802 + 1 = 803. Cliques a muitas meias-vidas do mais recente tendem a 0 bps e são descartados dos vencedores.
Modelo position_based
Dá 4000 bps (40%) ao primeiro clique, 4000 bps (40%) ao último e 2000 bps (20%) divididos igualmente entre os cliques do meio. Com 4 cliques, os dois do meio (clk_B, clk_C) recebem 2000 / 2 = 1000 bps cada.
Casos especiais do
position_based:
- 1 clique → 10000 bps (recebe tudo, primeiro = último).
- 2 cliques → 5000 / 5000 bps (não há “meio”).
Requisição e resposta
A requisição é a mesma de qualquer conversão S2S: o modelo é resolvido a partir do Programa, não enviado no corpo. Veja a aba Referência da API para o schema completo.cURL
attributionSnapshot.winners[] (exemplo com position_based):
commission.created por Comissão (além de conversion.created). Detalhes do ciclo de vida da Comissão em Comissões.
Afiliado com mais de um clique
Se um mesmo afiliado aparece em dois cliques vencedores, o snapshot guarda um winner por clique (auditoria), mas a Comissão é uma só, comcalculation.weightBps igual à soma dos pesos dos seus cliques. Exemplo no linear com clk_A e clk_C ambos de aff_ana:
winners[]:clk_A(2500 bps) eclk_C(2500 bps), dois registros.- Comissão de
aff_ana: uma, comcalculation.weightBps = 5000→floor(2000 × 5000 / 10000) = 1000(R$ 10,00).
convertedAt.
Interação com cupom (split_50_50)
Quando há também um Cupom de afiliado e o Programa usa a política split_50_50, o afiliado do cupom fica primário com 5000 bps e os vencedores do clique são reescalados para somar os outros 5000 bps, preservando as proporções do modelo. Exemplo: linear com 2 cliques + cupom → cupom 5000 + 2500 + 2500. As políticas coupon_wins e click_wins não dividem entre clique e cupom. Ver Links e cupons e Atribuição.
Próximos passos
Atribuição
Modelos, janela e ordem de matching em detalhe.
Comissões
Cálculo, recorrência e ciclo de vida das Comissões geradas.
Conversões e fraude
O pipeline síncrono que aplica esses pesos no registro da conversão.
Conversões server-to-server
Como enviar conversões S2S com matching por clique e e-mail.