Partial Refund
A partial refund returns part of a Stripe payment. Learn how to issue one, why the charge still reads as not refunded, and how partial refunds affect disputes.
Updated October 1, 2026
A partial refund gives a customer back some of what they paid while you keep the rest. Technically it's a normal refund, with the same object, events, and destination, for less than the full charge. Use one when a full refund would overpay, such as one item returned from a larger order, a goodwill credit after an outage, or unused time on a subscription canceled mid-cycle.
How to issue a partial refund in Stripe
In the Dashboard, the refund dialog starts at the full amount. Enter a smaller amount to make it partial. With the Refunds API, pass an amount in the currency's smallest unit, such as cents for USD, along with the charge or PaymentIntent. You can issue as many partial refunds against one charge as you like, as long as the total doesn't exceed the original amount. The Dashboard's bulk refund tool only does full refunds, so you issue partial refunds one at a time.
Each partial refund creates its own Refund object and fires refund.created and charge.refunded. Two fields on the charge matter:
amount_refundedis the running total across every refund on that charge.refundedstaysfalseuntil the charge is fully refunded, so a partially refunded charge still reads as not refunded.
Partial refunds on subscriptions
Stripe doesn't send unused subscription time back to the card on its own. When you cancel a subscription in the Dashboard, you can choose a prorated refund, a full refund of the last payment, or no refund. Through the API, cancellation credits go to the customer's credit balance. To return that money, issue a refund and then set the balance back to zero.
What to watch with partial refunds
Fees. Stripe keeps the processing fee on the original payment. A partial refund doesn't return any share of it.
Disputes after a partial refund. Stripe notes that a customer can still dispute the full payment after accepting a partial refund, which would add up to an over-refund. Respond every time. Submit the refund amount, date, and a Dashboard screenshot as dispute evidence in a "credit issued" response. If the dispute goes against you, you get back only the partially refunded amount and the dispute is marked lost. Cartes Bancaires disputes can't be contested, so on those you can't point the issuer to an existing partial refund.
Connect platforms. When you refund a destination charge, reverse_transfer pulls back the seller's share in proportion to the refunded amount, and refund_application_fee returns a matching share of the application fee. Without them the platform pays the whole partial refund. See Stripe transfer for how reversals work.
Reporting. Code or spreadsheets that check refunded to find refunds miss every partial one. Compare amount_refunded with the charge amount instead.
What to do when you issue one
- Support writes the agreed amount and reason into the ticket. If the customer disputes later, that record is your evidence.
- Finance books the refunded amount against the original sale so net revenue stays accurate, and notes how much is still refundable.
- Engineering makes sure integrations treat
charge.refundedas "some money went back," not "the order was canceled." Logic that revokes a whole order on any refund punishes customers who were owed a small credit. - Founders watch the pattern. Frequent partial refunds on one product usually mean the description or pricing sets the wrong expectation.
Partial refunds in ChargeBell
ChargeBell's refund alert is built on charge.refunded and shows the amount of that specific refund, not the full charge. A $120 partial refund of a $300 charge posts as $120. The alert includes the reason and the customer when Stripe provides them. Route it to #support so whoever handled the ticket sees it, and to #finance for reconciliation. The refund alert page shows the Slack message, and which Stripe alerts go to finance, support, and founders helps decide where it belongs.
Get alerted in Slack
Stripe events: charge.refunded, refund.created, refund.updated, refund.failed
ChargeBellAPP
↩️ Refund sent: $49.00
to Lena at Fernworks
Reason: requested by customer