Refund, void e clawback: o que acontece
Um refund chega à Repass a partir dos eventos de cobrança dos seus gateways de pagamento. A partir do valor reembolsado e da cobrança original, a Repass decide caso a caso o que fazer com cada Comissão daquele ciclo:
A regra-chave: se a comissão já saiu da plataforma (foi paga) ou se o estorno é parcial, não dá para “desfazer” o lançamento: entra um débito (clawback) que será compensado no próximo Payout. Se a comissão ainda está retida (em hold ou aprovada, mas sem Payout) e o refund é total, ela é simplesmente anulada.
Refund total marca a Conversão como
refunded. Apenas o refund total (incluindo chargeback) atualiza a Conversão de origem para status: refunded. Refund parcial não altera a Conversão.Clawback é uma comissão negativa
Um clawback não é um estado de uma comissão existente, é uma nova Comissão (comm_…) com:
type: clawbackstatus: approved, nasce aprovado, sem hold (débito imediato)amountCentsnegativooriginalCommissionIdapontando a Comissão revertidacalculation.refundcomrefundedAmountCents,chargedAmountCents,originalCommissionAmountCentsechargeback
approved e sem hold, o clawback entra imediatamente no cálculo do saldo e no netting do próximo Payout.
Cálculo do valor do clawback
Refund total → valor cheio
Refund total → valor cheio
O clawback reverte o valor integral da Comissão original. Se a comissão original valia
2000 centavos, o clawback vale -2000.Refund parcial → proporcional (floor)
Refund parcial → proporcional (floor)
O clawback é proporcional ao quanto foi reembolsado, arredondado para baixo:Exemplo: cobrança de
10000, comissão original de 2000, refund parcial de 3000:
floor(2000 × 3000 / 10000) = floor(600) = 600 → clawback de -600.Refund parcial sempre vira clawback, mesmo que a comissão original ainda não tenha sido paga: isso preserva a trilha de auditoria do valor parcial reembolsado.Chargeback = refund total + fraude
Chargeback = refund total + fraude
Um chargeback é tratado como refund total. Além de reverter a comissão (void ou clawback de valor cheio), ele marca a Conversão
refunded e grava fraudDecision: confirmed.Fluxo completo
Pontos relevantes do fluxo:- Identificação da cobrança. O refund localiza as comissões da cobrança original por
chargeSourceEventId(preferencial) ou porbillingCycle(alternativo). Se nenhum dos dois for informado, a operação é recusada; uma cobrança inexistente retorna um erro de cobrança não encontrada. - Por afiliado winner. Uma cobrança pode ter gerado uma Comissão por Afiliado (atribuição multi-touch). O refund percorre todas as comissões daquele ciclo e aplica void ou clawback a cada uma conforme a tabela acima.
- Operação consistente. Voids, clawbacks, a atualização da Conversão (
refunded/fraudDecision) e todos os Eventos são aplicados de uma só vez: ou tudo é registrado, ou nada é.
Idempotência
O refund é idempotente porsourceEventId: reentregar o mesmo evento de refund retorna o resultado existente com replayed: true, sem duplicar voids ou clawbacks.
O caminho só-void do refund é idempotente mesmo com um
sourceEventId diferente: se a Comissão já foi anulada, não há mais alvo a reverter e a operação retorna replayed: true. Veja Idempotência para o modelo geral.Efeito no saldo do afiliado
O saldo do Afiliado (GET /affiliates/:affiliateId/balance) agrega as comissões em buckets. O clawback aparece em seu próprio bucket e reduz a projeção do próximo Payout:
integer
Soma das comissões
pending (em hold).integer
Comissões
approved, sem Payout, fora de revisão, exceto clawbacks.integer
Comissões
approved congeladas por revisão de ban (underReview = true).integer
Clawbacks não anulados e sem Payout (valor negativo).
integer
Projeção do próximo Payout:
max(0, approvedCents + clawbackCents).Exemplo
- Cenário
- Saldo resultante
- Débito excedente
O Afiliado tem
5000 centavos em comissões aprovadas. Uma cobrança de outra Conversão (comissão paga de 2000) é totalmente reembolsada, gerando um clawback de -2000.Efeito nos payouts
- Clawbacks nascem
approvede entram no netting que o módulo de Payouts aplica ao montar um Payout: comissões positivas e clawbacks negativos do Afiliado são somados na hora de fechar o valor a pagar. - O bucket
clawbackCentssó conta clawbacks não anulados e sempayoutId. Uma vez que um clawback é incorporado a um Payout, ele deixa de contar no saldo. - Uma Comissão que foi anulada (void por refund total não pago) sai de qualquer projeção: não há valor a pagar nem a debitar.
Eventos emitidos
Todos os Eventos abaixo são emitidos quando o refund é processado. Consulte o catálogo de eventos para o formato de entrega via Webhook.
Um único refund pode emitir múltiplos eventos: por exemplo, um refund total de um ciclo com dois Afiliados winners (um com comissão paga e outro não) emite um
commission.clawback_created, um commission.voided e um conversion.refunded.
Exemplos
O exemplo abaixo ilustra os dados de um refund originado a partir de uma cobrança do seu gateway. Para a forma e os campos exatos, veja a aba Referência da API.calculation.refund que reconstrói o valor:
Próximos passos
Comissões
O modelo completo de cálculo, ciclos, hold e estados de comissão.
Payouts
Como o netting de clawbacks entra no fechamento do Payout.
Conversões e fraude
O ciclo de vida da Conversão e o estado
refunded.Conversões server-to-server
Como registrar cobranças que alimentam o fluxo de comissão.