DEV Community

Mihir kanzariya
Mihir kanzariya

Posted on

Paying SaaS affiliates on Stripe: the part teams forget to build

I build affiliate software for SaaS, so I spend most of my time in the part of an affiliate program people forget about: paying the affiliates. Attribution gets the attention. Payouts are where programs break.

A few things bite once the first commissions come due. How I handle each on Stripe.

A commission is not a payout

The first mistake is treating "this referral converted" as "we owe this person money now." You don't, yet. A Stripe payment can be refunded, disputed, or fail on the next renewal. Pay the affiliate the moment the charge succeeds and you end up clawing money back, which is awkward and sometimes impossible.

So I keep two states. A commission is earned when the payment clears, and payable only after a hold period. I use 30 days, to cover the refund window. During the hold I listen to charge.refunded and charge.dispute.created and reverse the commission before it becomes payable. The affiliate sees "pending" until then. That is honest, and it saves you the clawback email.

Recurring commissions need a stop date

If you pay 30% for 12 months on a subscription, you count months, not payments. A customer who pauses and resumes, or downgrades mid-term, throws off invoice.paid events that no longer map to "month 4 of 12."

Anchor the schedule to the subscription's start. On each invoice.paid, compute how many months have passed since the referral converted. Past month 12 the commission is zero, even though the invoice still fires. Storing the referral date and doing the math each time beats a running counter that drifts every time a subscription changes.

Payout rails: Connect or manual

You have two honest ways to get money to affiliates.

  • Stripe Connect with Express accounts. The affiliate onboards once, Stripe handles KYC and bank details, and you send transfers. Good at volume. It adds onboarding friction and puts you inside Stripe's payout timing.
  • Manual payouts through PayPal, Wise, or bank transfer, tracked in your own ledger. Less friction to start, more bookkeeping for you.

The ledger matters more than the rail. Every commission needs a row with its state (earned, payable, paid, reversed) and a payout reference. If your "who do we owe" number lives only in a Stripe dashboard view, you cannot answer an affiliate's "where's my money" email.

The boring failures that cost trust

  • Minimum thresholds. Pay out at $50 instead of $4.20 and you cut transfer fees and noise. Show the threshold so nobody is surprised.
  • Failed payouts. Bank details go stale. Catch transfer.failed and payout.failed, mark the commission payable again, and email the affiliate. A silent failure is how you lose a good promoter.
  • Currency. Your affiliate in another country thinks in their currency. Decide up front whether you pay in your settlement currency or theirs, and put it in the terms.
  • Tax forms. US payouts over the reporting threshold mean a 1099. Collect tax info at onboarding, not in December.

Why I keep payout fees at zero

Some affiliate platforms take a cut of every payout on top of their monthly fee. That charges you twice: once to run the program, again to pay the people growing it. When I built Referralful (disclosure: my product, affiliate software for SaaS built on Stripe), I kept payout fees at 0%. The commission belongs to the affiliate.

Attribution tells you who earned the money. The payout pipeline tells you whether they trust you enough to keep selling for you. The second one is where I would spend the time.

Top comments (0)