Quando usar
O caso típico: uma comissão foi calculada com a regra vigente na época (ex.: 20%); depois você publica uma nova versão da regra (ex.: 30%) e quer que ela valha retroativamente para um intervalo de conversões. Mudar a regra não recalcula nada sozinho. O reprocessamento existe justamente para tornar esse recálculo retroativo explícito, auditável e reversível na decisão (você sempre aprova antes de aplicar).Pré-requisitos
- Papel
ownerouadminna organização. Membros comuns têm acesso somente de leitura ao histórico de jobs (criar, executar e cancelar exigemadmin+; caso contrário,403 not_allowed). - A nova versão da regra de comissão já criada no programa (um
cmrl_...). Para publicar uma nova versão, veja a aba Referência da API do endpoint de regras de comissão. - O intervalo de datas que você quer reprocessar, sobre o
occurredAtdas conversões.
Ciclo de vida do job
A execução é síncrona, numa única transação: não há estadoprocessing intermediário. O job nasce em dry_run e termina em executed ou canceled.
No máximo um job aberto (
dry_run) por programa de cada vez. Enquanto houver um dry-run pendente, tentar criar outro no mesmo programa retorna 409 conflict. Execute ou cancele o job atual para liberar o slot. Jobs em programas diferentes podem rodar em paralelo.Fluxo passo a passo
1
Crie o job de reprocessamento (dry-run)
POST /reprocess cria o job e produz o relatório de impacto sem tocar em nenhuma comissão. O corpo aceita apenas dryRun: true (default); enviar dryRun: false resulta em 400. A aplicação real é sempre o passo separado do execute.No momento do create, a regra escolhida é congelada num snapshot (ruleSnapshot): o execute aplica esse snapshot, não a regra “ao vivo”. O intervalo é meio-aberto [from, to) (from inclusivo, to exclusivo) sobre o occurredAt da conversão.affiliateIds é opcional: omita para reprocessar todos os afiliados do programa. Se enviar, precisa de pelo menos 1 elemento, e cada afiliado deve pertencer ao programa (400 caso contrário).standard não anuladas (não voided) das conversões no intervalo entram no escopo. Comissões dos tipos clawback e bonus ficam de fora (são fatos derivados, não recalculáveis pela regra).2
Revise o relatório de impacto
O campo
summary (congelado no create) é o relatório que você aprova antes de aplicar. Releia o job a qualquer momento com GET /reprocess/{id} e inspecione comissão a comissão com GET /reprocess/{id}/items.Cada item (
GET /reprocess/{id}/items) traz before/after por comissão e um kind:cURL
3
Execute (aplique o relatório aprovado)
POST /reprocess/{id}/execute aplica exatamente o relatório aprovado numa única transação. Se confirmationRequired for true, você deve enviar o confirmationToken devolvido no create.A confirmação obrigatória dispara quando |deltaTotalCents| ultrapassa o limiar da política (confirmationThresholdCents, default R$ 1.000,00 / 100000 centavos). Token ausente ou errado, acima do limiar, retorna 409 conflict (não 403, você continua sendo admin, só falta confirmar).Após o execute (ou o cancel), o
confirmationToken deixa de circular: a resposta o omite quando o status não é mais dry_run.paid com o mesmo valor. Se qualquer comissão mudou entre o dry-run e o execute (refund, aprovação, reserva, pagamento), a transação inteira aborta com 409 conflict e rollback total: nenhum item parcial é aplicado. Nesse caso, crie um novo dry-run e revise de novo.4
Confira os ajustes gerados
O execute emite eventos novos encadeados ao histórico (o estado anterior nunca é apagado), nesta ordem:
reprocess.started- um
reprocess.commission_recalculatedpor item, combefore/after/deltaCents - um
commission.createdpor comissão de ajuste reprocess.completed, com osummarye onotificationModeda política
approved, sem payout, e ficam elegíveis ao próximo payout. Assine os eventos via Webhooks ou reconstrua o histórico pelo Event store.Ajustes sobre comissões pagas
Comissõespaid são imutáveis (a base de cada cobrança fica congelada: money em centavos inteiros, percentuais em basis points). O reprocessamento não as reescreve: para cada delta de comissão paga, ele cria uma comissão nova do tipo adjustment.
Características da comissão de ajuste:
- Tipo
adjustment, statusapproved, sempayoutId. - Valor igual ao delta (
after.amountCents − before.amountCents), que pode ser negativo, o mesmo mecanismo do clawback. - Referencia o job de origem em
calculation.reprocess = { jobId, originalAmountCents, recalculatedAmountCents }, para auditoria. - Entra no netting do próximo Payout, somando ou abatendo o saldo do afiliado.
recalculate), o execute faz um UPDATE direto de amountCents e o calculation original permanece intacto.
Política de reprocessamento
A política da organização controla quando a dupla confirmação é exigida e como afiliados impactados são tratados. Leia comGET /settings/reprocess-policy e atualize com PUT /settings/reprocess-policy (escrita exige admin+).
O modo de notificação escolhido é registrado no payload do evento
reprocess.completed, inclusive silent, deixando a decisão auditada.
Erros comuns
409 conflict: job já aberto no programa
409 conflict: job já aberto no programa
Já existe um dry-run pendente nesse programa. Execute ou cancele (
POST /reprocess/{id}/cancel) o job atual para liberar o slot, ou opere em outro programa.409 conflict: confirmação obrigatória
409 conflict: confirmação obrigatória
O
|deltaTotalCents| ultrapassa o limiar da política e o confirmationToken está ausente ou incorreto. Releia o job em dry_run para obter o token e reenvie no corpo do execute.409 conflict: itens bloqueados (blocked)
409 conflict: itens bloqueados (blocked)
Há comissões reservadas num payout aberto. Liquide ou cancele esse payout e crie um novo dry-run.
409 conflict: relatório desatualizado (anti-stale)
409 conflict: relatório desatualizado (anti-stale)
Uma comissão mudou entre o dry-run e o execute (refund, aprovação, reserva ou pagamento). A transação aborta por completo; crie um novo dry-run e revise.
400 parameter_invalid: intervalo ou dryRun inválido
400 parameter_invalid: intervalo ou dryRun inválido
from deve ser anterior a to, e dryRun só aceita true. Afiliado fora do programa também cai aqui.403 not_allowed: papel insuficiente
403 not_allowed: papel insuficiente
Criar, executar, cancelar ou alterar a política exige
owner ou admin. Membros comuns só têm leitura.Próximos passos
Reprocessamento
O conceito por trás do recálculo retroativo auditável.
Programas e regras
Como versionar regras de comissão e por que valem só para o futuro.
Comissões
Cálculo, estados e tipos de comissão (incluindo adjustment).
Refund e clawback
O outro mecanismo que ajusta comissões via netting.