Commissions

The money a partner earns. Created automatically from tracked events; paid out via Stripe Connect.

A commission is a row in our database tied to one event (sale, lead, or click) and one partner. It moves through a lifecycle of statuses before becoming a payout.

Lifecycle

  1. pending — created the moment a tracked event fires. Partner sees it on their dashboard but it's not payable yet. Sits here for the program's holding period (default 30 days).
  2. approved — moved here automatically by the/api/cron/approve-commissions job once payable_athas passed. Eligible for the next payout run.
  3. paid — included in a successful Stripe Connect transfer to the partner's bank.
  4. refunded / clawed_back— the underlying sale was refunded, so the commission is reversed.

How amounts are calculated

For percentage rewards: amountCents = round(saleAmountCents × bps / 10000).

For flat rewards: amountCents = reward.rewardAmount (a fixed cents value).

Recurring & lifetime rewards

Each subsequent sale event for the same customer creates another commission as long as it falls within the duration:

  • one_time — only the first sale for a customer pays out
  • recurring — first N sales pay out (where N = rewardDurationMonths)
  • lifetime — every sale pays out, no cap

Refunds & clawbacks

Automated clawback via webhook isn't live yet. If a sale is refunded, find the related commission in your dashboard and mark it as clawed_backmanually. If it's still in pending/approved, no money has moved yet — clean. If it's already paid, the partner has the money; you'll need to reconcile manually (or deduct from a future payout).

Holding period protects you

The default 30-day holding period gives you time to handle refunds before the commission becomes payable. Lengthen it on programs where refund risk is higher.

Inspecting commissions

The Commissions page in your workspace lists every commission with status, amount, partner, and the underlying event. Filter by status to find anything stuck in pending or failed.