Skip to main content
Two things can happen after a payment goes through. Refunds are a reversal you (or your support team) issue on purpose. Disputes are chargebacks the buyer files with their bank. You don’t always control how a dispute lands, but you can respond with evidence.
Subscribe to webhooks for refund.created, refund.updated, dispute.created, dispute.updated, and dispute_alert.created so you can reconcile status changes without polling.

Refunds

Refunds reverse a successful payment. Whop processes them through the original payment processor. The matching membership status updates automatically.

Issue a refund

Refunds are created against a payment, not directly on the refunds resource. Call payments.refund(id, ...). Omit partial_amount for a full refund, or pass it for a partial.
The response is the updated Payment object. The refunded_amount field reflects the cumulative refunded total. You can call refund multiple times against a payment up to its full amount.
Required permission: payment:manage. Add it from the Permissions guide before publishing your app.

Inspect refunds

Refunds have their own resource if you need to look them up after the fact.

Disputes

A dispute (chargeback) opens when the buyer’s bank challenges a payment. You have a window to respond with evidence before the bank decides. Whop forwards the dispute to you, you submit evidence, the bank rules, and the dispute closes.

Watch for incoming disputes

Two events to subscribe to:

List and retrieve

Respond with evidence

Disputes have a two-step response: stage your evidence with updateEvidence, then submit with submitEvidence. Update is idempotent. You can edit fields up until you submit.

Evidence fields

Every field is optional, but the more you provide, the stronger the response. Common ones: Attachment fields take an uploaded file ID. Upload first via the Files API, then pass file.id.

Dispute statuses

The dispute moves through a state machine. There are two phases: the early-warning phase (statuses prefixed warning_, surfaced via dispute_alert.created) and the formal dispute phase. Every status the SDK can return:
When a dispute is lost, Whop does not auto-create a Refund record and you cannot create one yourself. payments.refund rejects calls against a disputed payment with “This payment has been disputed. Therefore, it cannot be refunded.” Track the lost dispute as the source of truth and do not expect a refund.created event.

Permissions

Add these from the Permissions guide.

Next steps

Accept payments

The flow that creates the payments you’ll later refund or defend.

Listen to webhooks

React to refund and dispute events server-side.

Upload files

Upload evidence attachments for dispute responses.

Disputes API reference

Full resource: fields, statuses, and every endpoint.