Refunds and chargebacks, mirrored both ways
Refund on Whop or in the Shopify admin and the other side follows. Dispute alerts under a threshold you set are refunded before the chargeback lands; a lost dispute cancels and restocks the order. One rule underneath: money never moves twice.
One ledger, one rule
Every refund, whichever side it starts on, gets one row in Sable's refund ledger before anything is called, keyed on the external refund id. A webhook replay, a retry, or the echo of Sable's own refund coming back from the other system finds that row and stops. Amounts are capped at what Whop charged minus what is already refunded, and the ledger row's id is the idempotency key on both the Shopify mutation and the Whop request, so even a crash between the remote call and the bookkeeping cannot refund twice.
The four paths
| It starts with | Sable does | The order becomes |
|---|---|---|
| A refund on Whop (dashboard or API) | refund.created arrives; Sable creates the matching Shopify refund on the order's whop transaction. A full refund returns every line item, restocks it and refunds the shipping; a partial refund only moves money. | Partially refunded, then Refunded once everything is back |
| A refund in the Shopify admin | The refunds/create webhook arrives, verified with the app's client secret; Sable refunds the Whop payment for the same amount (partial_amount for partials). | Partially refunded or Refunded |
| A dispute alert from Whop | dispute_alert.created is recorded on the order. If the order total is at or under Auto-refund dispute alerts under in Settings, the Whop payment is refunded immediately and the Shopify refund follows through refund.created, so the chargeback and its fee never land. | Dispute alert, then Refunded |
| A dispute lost | dispute.updated arrives; the card network has already moved the money, so Sable cancels and restocks the Shopify order without creating a refund. | Canceled |
A cancellation made in Shopify (orders/cancelled) is recorded on the Events page but moves no money.
Turning it on
- Connections → Whop webhook → Register webhook. The registration includes the refund and dispute events.
- Connections → Shopify → Register webhooks, which needs the custom app's client secret, because Shopify deliveries are verified with it. Stores that only have a legacy static token cannot verify deliveries, so their Shopify-side refunds stay in Shopify.
- Optional: Settings → Auto-refund dispute alerts under, an amount in the store's currency. Leave it empty to record alerts without refunding.
When Whop refuses
Whop does not refund a payment that is already disputed. If a refund is made in the Shopify admin on such an order, the ledger records a failed row rather than retrying, and the order detail shows it under Refunds with its source and status. Sort the dispute out on Whop first.
Where to look
- Orders shows the status: Paid, Partially refunded, Refunded, Canceled, plus Dispute alert, Dispute open and Dispute under review while a dispute is live.
- Order detail lists every refund with its source (Whop, Shopify admin or Dispute alert), amount and outcome, the jobs for the order and the webhook deliveries that mention it.
- Events lists every Whop and Shopify delivery for the store with what Sable did with it.
What is not mirrored
- Refunds cannot be started from the Sable dashboard yet; start them on Whop or in the Shopify admin.
- Google Ads conversion adjustments on refunds are not sent.
Questions people ask
Which side should I refund from?
Either. A refund on Whop reaches Shopify; a refund in the Shopify admin reaches Whop. Pick the one your team already uses; both end in the same ledger.
Can a refund be applied twice by accident?
No. The ledger row is claimed before the call is made, keyed on the refund id from the system that started it, and the echo of that refund coming back from the other side finds the row and stops.
What happens to inventory?
A full refund from Whop restocks every line in Shopify; a lost dispute cancels and restocks the order. Partial refunds only move money.
Is the auto-refund optional?
Yes. With no threshold set, dispute alerts are recorded on the order and nothing is refunded automatically.
Set it up on your own store
Connect Shopify, connect Whop, add one script tag. If it is not for you, removing the tag puts Shopify's checkout back.
Read next
Connect Shopify and Whop to Sable
A custom app for the store, an API key for the money, one webhook so payments become orders, and one script tag in the theme. Every step lives in the dashboard.
Serve the checkout on your own domain
One CNAME puts the checkout on checkout.yourstore.com, with a certificate issued for you. Why it has to be a subdomain, what to add at your DNS provider, and what the domain serves.