How to handle an affiliate refund clawback

Void a commission that is unpaid, net a paid one against the next payout. Covers a 21-day hold, partial refunds, $15 Stripe disputes and replayed webhooks.

Muzahid Maruf — Founder of TrackRev.io

Muzahid MarufUpdated

Affiliate programs · 7 min read
On this page
  1. 01What an affiliate refund clawback does at each stage of a commission
  2. 02Which billing events should trigger a reversal
  3. 03Partial refunds and several refunds on one charge
  4. 04Choosing the hold period and the reversal window
  5. 05Recovering a commission you already paid
  6. 06Reversing commissions on chargebacks and disputes
  7. 07Making reversals safe to replay
  8. 08How TrackRev reverses commissions

Explore with AI

Opens this article inside the chosen assistant with a ready-made prompt.

An affiliate refund clawback takes back a commission when the sale behind it is refunded. A $100 sale at 30% earns the partner $30. If the $30 is unpaid, void it and the partner never sees it.

If you already paid it, record a negative balance and deduct it from the partner's following payout instead of asking for cash back.

A hold at least as long as your 14-day or 30-day refund window keeps most refunds in the first case, and because card networks typically allow disputes for 120 days, you still need a plan for the rest.

Key takeaways

  • Void a commission that is unpaid. Once it is paid, net it against the next payout: a partner who earned $600 and owes $180 receives $420.
  • Set the hold to your refund guarantee plus 7 days, and expect card disputes to arrive up to 120 days after the payment anyway.
  • An uncontested $49 dispute costs $64 with the $15.00 fee, or $78.70 if a 30% commission stays paid, so reverse when the dispute opens.

What an affiliate refund clawback does at each stage of a commission

Take that $100 sale with a 14-day money-back guarantee, a 21-day hold and a monthly payout on day 30.

DayWhere the $30 sitsWhat a refund or dispute does
0 to 14Pending, while the customer can still ask for a refundVoid the $30, because nothing was paid
15 to 20Pending, in the 7 extra days of the 21-day holdVoid it, which covers refunds approved late
21 to 29Payable, waiting for the day 30 batchPull the $30 from the batch before you export it
30Paid in the monthly batchRecord -$30 and net it against the next payout
31 to 120Paid, with the 120-day dispute window still openSame netting, usually triggered by a dispute
After 120Paid, past the usual dispute windowUsually only a refund you grant reverses it

A recommended policy, not an industry standard.

Which billing events should trigger a reversal

ProcessorRefund eventsWhat to check before reversing
Stripecharge.refunded, refund.createdrefund.created fires when the refund is created, and the customer sees the credit about 5 to 10 business days later. A refund the bank rejects sends refund.failed, and the money can take up to 30 days to return to your balance
Paddle Billingadjustment.created, adjustment.updatedLive refunds start as pending_approval unless Paddle approves them automatically, which needs a verified account, a refund of 400 USD or less, and a payment method other than bank transfer
Lemon Squeezyorder_refunded, subscription_payment_refundedThe second carries the subscription invoice, so it maps to one renewal's commission
Polarrefund.created, refund.updatedrefund.created fires regardless of status, so wait for the refund to go through

Event names from each vendor's webhook documentation, checked October 2026.

Partial refunds and several refunds on one charge

Stripe allows several refunds against one charge, up to the original amount, and each one fires its own event. On the $100 charge above, the partner's $30 reverses in proportion.

RefundReturned to customerReversal at 30%Reversed so farCommission left
First partial refund$40$12$12$18
Second partial refund$60$18$30$0

Tie each reversal to the refund ID, because a charge-level check drops the second refund as a duplicate. Reverse the amount you credited, since rates change between a sale and its refund.

On a recurring Stripe Billing subscription, a refund on invoice 3 leaves invoices 1 and 2 alone. Upgrades and proration credits are in affiliate commissions on Stripe refunds, upgrades and downgrades, and renewals in affiliate tracking for recurring subscriptions.

Choosing the hold period and the reversal window

The hold keeps a commission unpayable, and the reversal window is how long a refund or dispute can still reach it. I would set the hold to the refund guarantee plus 7 days, to cover refunds that are approved late.

Refund guaranteeHold
7 days14 days
14 days21 days
30 days37 days
60 days67 days
90 days97 days
ProgramWait before a commission can be paid
Fathom30 days, then a $200 minimum by Wise or $20 as account credit
HubSpot, monthly plan30 days plus the rest of that month, paid within 2 months
HubSpot, annual plan60 days plus the rest of that month, paid within 3 months
Rewardful Help CenterSet per campaign, and Rewardful recommends matching your refund policy
TrackRev0 to 180 days per program, default 0

A hold of the full 120 days would make partners wait 4 months for a first payout. The hold handles refunds, and the negative-balance rule handles disputes and the pro-rata refund an annual customer can get 6 months in.

Recovering a commission you already paid

Record the reversal as a negative ledger entry, deducted from the following payout with a line item naming the refunded sale.

Test the minimum after the offset, so a partner who earned $60 and owes $30 rolls over under a $50 minimum.

PartnerEarned this monthOwed from refundsNetPaid at a $50 minimumCarried forward
Healthy partner$600$180$420$420$0
Small partner$60$30$30$0$30
Partner who stopped$40$180-$140$0-$140
  • Ask for money back only from a partner you are terminating or whose own fraud caused the refund. Chasing $40 abroad costs more than $40.
  • Set a carry-forward limit such as 90 days, then write the balance off, as with the partner above sitting at -$140.
  • Put partners with a refund rate well above average on a rolling reserve, such as 10% of each payout until the 120-day dispute window closes.

Put the rules in the partner terms before the first sale, or the clawback becomes a dispute you start yourself. How to pay affiliates covers payouts and tax forms.

Reversing commissions on chargebacks and disputes

You cannot refund a charge outside the dispute process while a dispute is open, and the cardholder's bank decides the outcome.

StepTypical time or cost
Cardholder files the disputeWithin 120 days of the payment, longer in some cases
You respond to the issuer7 to 21 days, depending on the network
Issuer reviews your evidence60 to 75 days
Whole lifecycle2 to 3 months
Early fraud warning from Visa or MastercardAbout 40% become fraud disputes when the charge is not refunded
Dispute countered fee$15.00 when you respond manually, returned only if you win
Dispute received fee$15.00 in the US, debited with the disputed amount and not returned even when you win

From Stripe's dispute documentation and pricing page, October 2026.

A $49 plan at 30% commission pays the partner $14.70.

OutcomeWhat you loseTotal
Not contested, commission left paid$49 sale, $15.00 fee, $14.70 commission$78.70
Not contested, commission reversed$49 sale, $15.00 fee$64.00
Won, commission restored$15.00 fee$15.00

Reverse on charge.dispute.created, restore the commission if charge.dispute.closed reports a win, and leave it reversed on a loss, which can arrive 2 to 3 months later. Paddle's chargeback_warning, chargeback and chargeback_reverse adjustments follow the same cycle.

Several disputes behind one partner suggest self-referral or attribution fraud.

A refund and a dispute can hit the same charge

If a customer disputes a charge while your refund is pending, Stripe fails the refund with charge_for_pending_refund_disputed. Cap total reversals per charge at the commission you credited, $30 on the first sale above, so the refund and the dispute never reverse one sale twice.

Making reversals safe to replay

Stripe says an endpoint might receive the same event more than once and does not guarantee delivery order. A unique constraint on the refund ID stops the second insert, where a read-then-write check can pass twice.

A refund that arrives before its charge is recorded should trigger an API fetch of the charge.

Replay pathHow long after the event
Automatic retries, live modeUp to 3 days
Resend from the Stripe DashboardUp to 15 days
Resend with the Stripe CLIUp to 30 days
Sandbox retries3 attempts over a few hours
Postgres: one reversal per refund ID
create table commission_reversals (  id            bigserial primary key,  commission_id bigint  not null references commissions (id),  refund_id     text    not null,   -- Stripe re_..., or the dispute ID  amount_cents  integer not null check (amount_cents > 0),  created_at    timestamptz not null default now(),  unique (refund_id)); -- A replayed event inserts nothing, so the handler can stop.insert into commission_reversals (commission_id, refund_id, amount_cents)values ($1, $2, $3)on conflict (refund_id) do nothingreturning id;

Edit the original row or append a negative one

FirstPromoter's refund endpoint appends negative commissions, requires an event ID to avoid duplicates, and rejects one that already exists.

Ledger designAfter a $30 commission and a $12 refundPaid, then refunded
Edit the original rowOne row, amount changed from $30 to $18Needs a separate balance
Append a negative rowTwo rows, +$30 and -$12, balance $18The balance goes negative by itself

How TrackRev reverses commissions

TrackRev writes a commission against each order, and each renewal earns its own.

When Stripe, Paddle Billing, Polar, Lemon Squeezy, Creem or Dodo Payments reports a charge as refunded, TrackRev marks the order and every commission it produced as refunded, at each level of a Partner Accelerator chain.

SituationWhat TrackRev does
Stripe refund of any sizeReverses the sale's whole commission, with no proration for partial refunds
Commission already paidMarked refunded, with no negative balance, so you deduct it by hand from a later payout
Dispute or chargebackNo Stripe dispute events are read, so reverse the commission by hand
Hold period0 to 180 days per program, default 0
Plan neededIndie at $29 a month or Growth at $299 a year, with no cap on the commission tracked; Free covers link tracking only

Found this useful? Share it.

PostLinkedIn

Frequently asked questions

Muzahid Maruf — Founder of TrackRev.io

Written by

Muzahid Maruf

Founder, TrackRev.io & Contant.io

Muzahid Maruf founded TrackRev.io, SaaS affiliate software with no limit on tracked revenue, and Contant.io. He writes about affiliate programs.

Writes about Marketing attribution · Link tracking · Revenue analytics · SaaS growth

Stop guessing where your revenue comes from.

Set up TrackRev in about five minutes. The free plan covers 1,000 events a month, no card needed.

Start free