Issue a refund for a BNPL payment (Klarna, Afterpay, or Affirm) captured via Stripe and understand the downstream effect on the customer's installment plan
Retrieve the charge_id from the PaymentIntent (charges.data[0].id); POST /v1/refunds with charge=<charge_id> and optionally amount for a partial refund
For a full refund, omit amount; for a partial refund, supply the amount in smallest currency unit; partial refunds are supported for Klarna but not for Affirm
The refund object is created with status=pending; BNPL refunds are processed asynchronously; the refund.updated webhook fires when status transitions to succeeded or failed
A succeeded refund on a BNPL charge results in Stripe reversing the funds to the BNPL provider, which in turn adjusts the customer's installment schedule or cancels the plan
Monitor for refund.failed events; if a BNPL refund fails, check failure_reason and contact Stripe support as BNPL refund failures are not always retriable via API
Known gotchas
Refund windows for BNPL methods may be shorter than for card payments; some BNPL providers limit refunds to within a specific number of days post-capture
For Affirm, partial refunds are not supported through the Stripe API; issue a full refund and re-charge for the adjusted amount if the customer keeps part of the order
The customer's Klarna or Afterpay app shows the refund status independently; the customer may see the adjustment in their BNPL account before it appears in your Stripe Dashboard
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp