Skip to main content
Every source reports refunds differently. Read this page before you compare net revenue across sources.

Coverage by source

A Checkout Champ refund is a positive number and reduces no total. A Whop refund reaches Events but reaches no report. Subtract both yourself.

Chargebacks and disputes

Stripe books a dispute when the funds move, not when the dispute opens. Checkout Champ chargebacks arrive as chargeback events with a positive amount, so they reduce no total. charge.dispute.created, charge.dispute.updated, and charge.dispute.closed record nothing.

A cancellation is not a refund

A cancellation stops future billing. A refund returns money from a completed payment. Cancellation events record 0 on every source.
Superwall records a support-granted refund as subscription_cancelled worth 0, while RevenueCat records the same event as refund with a negative value. On Superwall, read cancellation counts alongside revenue.

Which period a refund lands in

We book every refund in the hour it processed, never in the hour of the original sale. A refund of a sale from last month lowers this month’s net revenue, and leaves last month’s gross revenue unchanged.

Partial refunds

A partial refund reduces net revenue by the partial amount. The original order stays. Its gross value does not change. Shopify sums every successful refund transaction on the refund payload. We read the currency from those transactions, because a Shopify refund payload has no top-level currency.

Verify

  1. Complete a refund in the source platform. Confirm it is final, not pending.
  2. Record the original transaction ID, the refund ID, and the amount.
  3. Open Events. Find the refund row.
  4. Confirm the value sign matches the table above.
  5. Compare gross revenue, refunded amount, and net revenue as three separate numbers.
Do not send a refund as a negative purchase event from your own code. The source already reports it, and the second row double-counts the reversal.

When it does not work