Refunds

    Learn about issuing refunds at Stripe. To check the status of a refund, contact us. If you need help after reading this, search our documentation or check out answers to common questions.

    Stripe supports the ability to refund charges made to your account, either in whole or in part. There is no cost for issuing refunds and the original charge fees are refunded, too.

    We submit refund requests to your customer’s bank immediately. Your customer sees the refund as a credit approximately 5-10 business days later, depending upon the bank. Once issued, a refund cannot be canceled.

    We’ll also send an email to your customer notifying them of the refund, if all of these conditions apply:

    • The original charge was created on a Customer object in your Stripe account
    • The Customer object has a stored email address
    • You have Email customers for refunds enabled

    Some refunds—those issued shortly after the original charge—appear in the form of a reversal instead of a refund. In the case of a reversal, the original charge drops off the customer’s statement, and a separate credit is not issued.

    Issuing refunds

    Refunds can be issued via the API or the Dashboard and are processed immediately. Once issued, a refund cannot be canceled.

    A charge can be refunded more than once, but you cannot refund a total greater than the original charge amount.

    Using the API

    To refund a charge via the API, perform a create refund call, providing the ID of the charge to be refunded.

    curl https://api.stripe.com/v1/refunds \
       -u sk_test_BQokikJOvBiI2HlWgH4olfQ2: \
       -d charge=ch_ATbgYw7MpO4hlv
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = "sk_test_BQokikJOvBiI2HlWgH4olfQ2"
    
    Stripe::Refund.create(
      :charge => "ch_ATbgYw7MpO4hlv",
    )
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_BQokikJOvBiI2HlWgH4olfQ2"
    
    stripe.Refund.create(
      charge="ch_ATbgYw7MpO4hlv",
    )
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_BQokikJOvBiI2HlWgH4olfQ2");
    
    \Stripe\Refund::create(array(
      "charge" => "ch_ATbgYw7MpO4hlv",
    ));
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.apiKey = "sk_test_BQokikJOvBiI2HlWgH4olfQ2";
    
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("charge", "ch_ATbgYw7MpO4hlv");
    Refund refund = Refund.create(params);
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_BQokikJOvBiI2HlWgH4olfQ2");
    
    stripe.refunds.create({
      charge: "ch_ATbgYw7MpO4hlv",
    }, function(err, refund) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_BQokikJOvBiI2HlWgH4olfQ2"
    
    params := &stripe.RefundParams{
      Charge: "ch_ATbgYw7MpO4hlv",
    }
    refund, err := refund.New(params)
    

    To refund part of a charge, provide an amount parameter, as an integer in cents (or the charge currency’s smallest currency unit):

    curl https://api.stripe.com/v1/refunds \
       -u sk_test_BQokikJOvBiI2HlWgH4olfQ2: \
       -d charge=ch_ATbgYw7MpO4hlv \
       -d amount=1000
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = "sk_test_BQokikJOvBiI2HlWgH4olfQ2"
    
    Stripe::Refund.create(
      :charge => "ch_ATbgYw7MpO4hlv",
      :amount => 1000,
    )
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_BQokikJOvBiI2HlWgH4olfQ2"
    
    stripe.Refund.create(
      charge="ch_ATbgYw7MpO4hlv",
      amount=1000,
    )
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_BQokikJOvBiI2HlWgH4olfQ2");
    
    \Stripe\Refund::create(array(
      "charge" => "ch_ATbgYw7MpO4hlv",
      "amount" => 1000,
    ));
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.apiKey = "sk_test_BQokikJOvBiI2HlWgH4olfQ2";
    
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("charge", "ch_ATbgYw7MpO4hlv");
    params.put("amount", 1000);
    Refund refund = Refund.create(params);
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_BQokikJOvBiI2HlWgH4olfQ2");
    
    stripe.refunds.create({
      charge: "ch_ATbgYw7MpO4hlv",
      amount: 1000,
    }, function(err, refund) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_BQokikJOvBiI2HlWgH4olfQ2"
    
    params := &stripe.RefundParams{
      Charge: "ch_ATbgYw7MpO4hlv",
      Amount: 1000,
    }
    refund, err := refund.New(params)
    

    Using the Dashboard

    To refund a charge via the Dashboard:

    1. Find the charge to be refunded in the payments overview page.
    2. Click the icon to the right of the charge and select Refund payment from the menu that appears.
    3. In the resulting prompt, select a full or partial refund. If you select partial, enter the amount to be refunded.
    4. Click Refund.

    Alternatively you can go to the Dashboard page for the specific charge and click Refund there. (Again, you’ll be prompted to choose a full or partial refund.)

    Fees on refunds

    When you refund a charge, the Stripe fees you paid to process the charge are also returned to you. If you refund an entire charge, all Stripe fees are returned, leaving no net cost.

    If you partially refund a credit or debit card charge, Stripe proportionally returns the percentage part of the Stripe fees but the fixed fee (e.g., $0.30 in the US) still applies. For example, if you refund $50 of a $100 charge, Stripe returns $1.45 of the original $3.20 fee (using standard U.S. pricing of 2.9% plus $0.30).

    If you were charged VAT or GST on the Stripe fees, the VAT or GST tax is returned proportionally as well.

    Refund destination

    Refunds are always sent back to the original charge source. It’s not possible to refund a charge to a different destination (e.g., another card or bank account). If the charge card expired or was canceled, the customer’s new card will be credited with the refund. In the rare case that the customer doesn’t have a new card, the bank usually sends the refund to the customer’s bank account.

    If the bank doesn’t know what to do with a refund, they send the refund back to Stripe and we contact you via email to ask how you would like to handle the refund.