Disputes and Fraud

    Learn what disputes are, how the process works, and how to prevent them from happening.

    A dispute (also known as a chargeback) occurs when one a cardholder questions your payment with their bank or credit card company. The bank creates a formal dispute which immediately reverses the payment. The payment amount, along with a separate $15.00 dispute fee levied by the card network, is then deducted from your account balance.

    There is a dispute resolution process through which you can respond and submit evidence to make your case that the payment was valid. If the dispute is found in your favor, the disputed amount and fee is returned back to you. If a dispute is upheld, the bank’s decision is final and the cardholder’s payment remains refunded.

    To help our users submit the best possible response, Stripe provides a guided process within the Dashboard. This allows you to provide all of the necessary text and images you feel are appropriate.

    Receiving a dispute

    When a dispute occurs, Stripe receives a notification of the disputed payment and sends you an automated email about it. A Dispute object is created with the status needs_response. If your integration is set up to receive webhooks, Stripe also sends a charge.dispute.created event.

    Disputes can be found in the Dashboard. Each one includes all relevant information about the payment being disputed and the reason the cardholder reported to the bank. When you receive a dispute, you have the opportunity to respond to it and submit the appropriate evidence or accept it.

    Disputes are an unfortunate part of accepting payments online, but they are not typically common. Disputes and the reasons for them (e.g., fraud) are ultimately your responsibility so you must take the appropriate actions to prevent and respond to disputes.

    If the original payment was converted into your account’s default currency (e.g., a USD payment converted into EUR and deposited into your account), the disputed amount is converted back to the payment’s original currency (e.g., EUR is withdrawn from your account and converted back to USD).

    Responding to a dispute

    We recommend most users respond within the Dashboard. The Dashboard guides you through the submission process, step-by-step—automatically formatting the information you provide. You’re asked to provide different pieces of evidence and upload any necessary files, depending on the dispute type. All this works to increase the likelihood of a dispute being found in your favor.

    If you receive a dispute, you may want to first get in touch with the customer and discuss it before you respond. It’s possible that they simply did not recognize or remember the transaction when they viewed their statement. If an email address was provided to Stripe when creating the payment (either to send an email receipt or if it was created using a Customer object), click Email customer to create a new email that contains information about the dispute.

    For disputes that are the result of such a misunderstanding, your customer can ask their bank to withdraw the dispute. It’s still important that you submit evidence to show that the payment was valid, however, and to ensure the banks know you are not accepting the dispute.

    Clicking Submit evidence begins the response process and provides additional information about the type of dispute and what steps you should take. If you have any information you think the bank might want to see, you should submit it as dispute evidence.

    Starting the dispute process.

    Submitting evidence.

    There is a limited period of time that disputes can be responded to (usually 7-21 days)—the amount of time available is provided within the dispute information. After that time has passed, no further responses or evidence can be submitted. Once you have submitted a response, it generally takes the cardholder’s bank 60-75 days to reach a final decision.

    Once you’ve submitted a response, the dispute’s status is changed to under_review. If a dispute is found in your favor, this changes to won. If the bank upholds the cardholder’s dispute, the status changes to lost. Once a dispute is closed, we send you an email with information about the outcome and a charge.dispute.closed webhook event.

    What to submit

    The evidence you submit should be appropriate to the reason for the dispute. Web logs, email communications, shipment tracking numbers and delivery confirmation, proof of prior refunds or replacement shipments, etc., can all be helpful. For example, a response to a dispute with the reason “product not received” should have evidence that includes shipping information and any screenshots of package tracking. Stripe electronically submits this information to your cardholder’s bank and notifies you of any updates to the dispute.

    When you respond to a dispute, Stripe automatically formats the evidence you provide into a format accepted by the banks. This includes all mandatory payment information (e.g., amount, date of payment), CVC or postal code verification results (if available), and any additional information or documents that you provide.

    You can prepare a suitable response that has the most relevant evidence using the following best practices (click on each one to expand it and show more information). These can help ensure you have the greatest possible chance of a dispute being found in your favor—and your funds returned.

    Keep your evidence relevant and to the point

    Banks review thousands of dispute responses every day. A long introduction about your product or company, complaint about the customer, or the unfairness of the dispute isn’t going to make your responses more compelling. Instead, provide only the facts surrounding the original purchase, using a neutral and professional tone. For example:

    Jenny Rosen purchased X from our company on [date] using their Visa credit card. The customer agreed to our terms of service and authorized this transaction. We shipped the product on [date] to the address provided by the customer, and it was delivered on [date].

    You may want to take some time to investigate the dispute while collecting evidence to submit. For instance, you can take a look at Google Maps and Street View to see where your delivery took place, or check social media like Facebook or LinkedIn to help establish the customer as the legitimate cardholder.

    Many merchants also include email correspondence or texts with the customer, but it’s important to be aware that these exchanges do not verify identity. If you’re going to include them, make sure only the relevant information is included (e.g., if you’re going to include a long email thread, redact any text that is only quoting previous emails).

    Your evidence should be factual, professional, and concise. While providing little evidence is a problem, overwhelming the bank with unnecessary information can have the same effect.

    Provide clear and accurate evidence

    The bank professionals handling the review of your response are going to decide fairly quickly whether or not the evidence is sufficient to refute the cardholder’s claims. You can make it easier for important information to be noticed by circling or calling out important points, keeping things brief wherever possible. For responses with multiple pieces of evidence, you can also include a table of contents and give each uploaded image/PDF an attachment number or letter. A lengthy Terms of Service or refund policy that has the relevant information highlighted can make your case much clearer.

    Banks do not follow any links provided in a response. Instead, you must include a clear screenshot of your terms or policies as they appear during checkout or on your site if they are an important part of your defense (e.g., a customer disputed a subscription but there is a minimum contract term that must be adhered to).

    Include proof of customer authorization

    Fraudulent disputes account for over half of all disputes. Proving the legitimate cardholder was aware of and authorized the transaction being disputed is vitally important in such cases. Any data that shows proof of this is a standard part of a compelling response, such as:

    • AVS (Address Verification System) matches
    • CVC (Card Verification Code) confirmations
    • Signed receipts or contracts
    • IP address that matches the cardholder's verified billing address

    Stripe always includes any AVS/CVC results as well as the purchase IP (if available from your Stripe integration), but if you have any other evidence of authorization be sure to include it.

    Include proof of service or delivery

    In addition to fraudulent disputes, claims from cardholders that products or services never arrived or happened, were defective or unsatisfactory, or not as described are also potential dispute reasons. Assuming that all is well on your side (the product was not faulty, was as described, was shipped and delivered prior to the dispute date) then you’ll want to provide proof of service or delivery.

    For a merchandise purchase, provide proof of shipment and delivery that includes the full delivery address, not just the city/town and ZIP code code. Choosing a carrier or delivery method that requires a signature on delivery provides the best defense against product not received or fraudulent disputes where you’ve shipped to a verified billing address that has passed AVS and ZIP code verification.

    If your customer provides a “Ship To” name that differs from their own (e.g., gift purchase), be prepared to provide documentation explaining why they are different. While it’s common practice to purchase and ship to an address that doesn’t match the card’s verified billing address, this is an additional dispute risk.

    If your business provides digital goods, include evidence such as an IP address or system log proving the customer downloaded the content or used your software or service.

    Include a copy of your terms of service and refund policy

    When it comes to disputes, fine print matters. Providing proof that your customer agreed to and understood your terms of service at checkout, or did not follow your policies when it comes to returns or refunds is critical. A clean screenshot of how your terms of service or other policies are presented during checkout is an important addition to your evidence—it is not enough to simply include a text copy of these.

    Formatting documents and images to upload

    Dispute evidence is often transmitted through several legacy systems and most banks are still utilizing paper faxing. Before sending your response, ensure that any text or images are clear and large enough to show up clearly in a black and white fax transmission.

    While you can zoom in on your electronic documents, the bank will not be able to do so. Any evidence that is too small to transmit clearly won’t be considered by the bank, so it’s better to have large, full-page images than try to fit too many on one page.

    When submitting documents or images as evidence, use the following recommendations to make sure they can remain legible:

    • Use a 12 point font or larger
    • Ensure that documents are US Letter or A4 size, in portrait orientation (screenshots can still be added to your documents in landscape orientation)
    • Use bold text, callouts, or arrows to draw attention to pertinent information
    • Avoid using color highlighting

    When uploading screenshots:

    • Crop the screenshot to the area of interest and circle any key components (e.g., delivery confirmation or signature)
    • Use the text fields in the dispute evidence form to describe what the image contains and how it supports your response

    Any illegible text or data that is submitted with a response will be considered incomplete by the bank and not reviewed.

    Responding to disputes using the API

    While we recommend most users respond to disputes through the Dashboard, dispute information can be also managed using the API. You can retrieve a Dispute object to find out more about it:

    curl https://api.stripe.com/v1/disputes/dp_17sGETLpSdVJN1iVw8BHvseP \
       -u sk_test_BQokikJOvBiI2HlWgH4olfQ2:
    
    # 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"
    
    dispute = Stripe::Dispute.retrieve("dp_17sGETLpSdVJN1iVw8BHvseP")
    
    # 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"
    
    dispute = stripe.Dispute.retrieve("dp_17sGETLpSdVJN1iVw8BHvseP")
    
    // 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");
    
    $dispute = \Stripe\Dispute::retrieve("dp_17sGETLpSdVJN1iVw8BHvseP");
    
    // 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";
    
    Dispute dispute = Dispute.retrieve("dp_17sGETLpSdVJN1iVw8BHvseP");
    
    // 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.disputes.retrieve("dp_17sGETLpSdVJN1iVw8BHvseP",
      function(err, dispute) {
        // 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"
    
    d, err := dispute.Get("dp_17sGETLpSdVJN1iVw8BHvseP", nil)
    

    The response contains information about the dispute and any response or evidence that has already been provided.

    {
      object: "dispute"
      id: "dp_17sGETLpSdVJN1iVw8BHvseP",
      charge: "ch_5Q4BjL06oPWwho",
      evidence: {
        customer_name: "Jane Austen",
        customer_email_address: "email@example.com",
        customer_purchase_ip: "127.0.0.1",
        product_description: "Widget ABC, color: red",
        shipping_date: "2017-08-22",
        shipping_tracking_number: "Z01234567890",
        uncategorized_text: "Additional notes and comments",
        uncategorized_file: "file_17sapWLpSdVJN1iV0X1yRT8Z"
      },
      evidence_details: {
        due_by: 1403047735,
        submission_count: 1
      }
      ...
    }

    You update the Dispute object and submit structured evidence within the evidence parameter.

    curl https://api.stripe.com/v1/disputes/dp_17sGETLpSdVJN1iVw8BHvseP \
       -u sk_test_BQokikJOvBiI2HlWgH4olfQ2: \
       -d evidence[customer_email_address]="email@example.com" \
       -d evidence[shipping_date]=2017-08-22 \
       -d evidence[shipping_documentation]=file_17sapWLpSdVJN1iV0X1yRT8Z
    
    # 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"
    
    dispute = Stripe::Dispute.retrieve("dp_17sGETLpSdVJN1iVw8BHvseP")
    dispute.evidence = {
      :customer_email_address => "email@example.com",
      :shipping_date => "2017-08-22",
      :shipping_documentation => "file_17sapWLpSdVJN1iV0X1yRT8Z"
    }
    dispute.save
    
    # 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"
    
    dispute = stripe.Dispute.retrieve("dp_17sGETLpSdVJN1iVw8BHvseP")
    dispute.evidence = {
      "customer_email_address": 'email@example.com',
      "shipping_date": '2017-08-22',
      "shipping_documentation": 'file_17sapWLpSdVJN1iV0X1yRT8Z'
    }
    dispute.save()
    
    // 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");
    
    $dispute = \Stripe\Dispute::retrieve("dp_17sGETLpSdVJN1iVw8BHvseP");
    $dispute->evidence = array(
      "customer_email_address" => "email@example.com",
      "shipping_date" => "2017-08-22",
      "shipping_documentation" => "file_17sapWLpSdVJN1iV0X1yRT8Z"
    );
    $dispute->save();
    
    // 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";
    
    Dispute dispute = Dispute.retrieve("dp_17sGETLpSdVJN1iVw8BHvseP");
    Map<String, Object> params = new HashMap<String, Object>();
    Map<String, Object> evidence = new HashMap<String, Object>();
    evidence.put("customer_email_address", "email@example.com");
    evidence.put("shipping_date", "2017-08-22");
    evidence.put("shipping_documentation", "file_17sapWLpSdVJN1iV0X1yRT8Z");
    params.put("evidence", evidence);
    dispute.update(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.disputes.update("dp_17sGETLpSdVJN1iVw8BHvseP",
      {
        evidence: {
          customer_email_address: 'email@example.com',
          shipping_date: '2017-08-22',
          shipping_documentation: 'file_17sapWLpSdVJN1iV0X1yRT8Z'
        }
      },
      function(err, dispute) {
        // 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"
    
    d, err := dispute.Update("dp_17sGETLpSdVJN1iVw8BHvseP",
      &stripe.DisputeParams{
        Evidence: &stripe.DisputeEvidenceParams{
          CustomerEmail: "email@example.com",
          ShippingDate: "2016-02-24",
          ShippingDoc: "file_17sapWLpSdVJN1iV0X1yRT8Z"
        },
      },
    )
    

    All available fields for the evidence parameter are found by looking at the Dispute evidence object. There are two types of evidence you can provide, depending on the field being updated:

    • Text-based evidence, such as customer_email and service_date. These types of evidence take a string of text.
    • File-based evidence, such as service_documentation and customer_communication. These take a file_upload object ID.

    You can provide documents or images (e.g., a contract or screenshot) as part of dispute evidence using the File Upload API. A document is first uploaded with the purpose of dispute_evidence, which generates a File_upload object which you can use when submitting evidence. Before uploading a file as dispute evidence, make sure that it meets our recommendations to ensure readability is preserved.

    If you’re only interested in submitting a single file or a large amount of plaintext as evidence, use uncategorized_text or uncategorized_file. However, we strongly recommend filling in as many fields as possible so you have the best chance at overturning a dispute.

    Accepting a dispute

    You can accept a dispute, effectively agreeing with the cardholder that the dispute was valid for the reason given. Doing so marks the dispute as lost, so the disputed amount and fee is not returned to you.

    You should always perform this action if you do not intend to respond and submit evidence. Although accepting disputes does not negatively affect your business any further, it should not be seen as an alternative to an effective refund or returns policy. Dispute rates are calculated based upon the disputes received, not won or lost, so dispute prevention is critical.

    Withdrawing a dispute

    Some customers may dispute a payment in error, not realizing it was legitimate. They can contact their bank and request the dispute be withdrawn. Even if your customer does this, the process involves a rigid series of formal communications between banking entities that still results in a long process.

    Always provide evidence for every dispute you hope to have found in your favor, even if your customer has told you they are withdrawing the dispute. Some customers may not be able to or simply forget to do so. Providing suitable evidence that includes communication with the customer that they are withdrawing the dispute is always the best way to ensure the dispute is reviewed appropriately. This way, if your customer cannot withdraw the dispute, you have submitted evidence that the bank can review which shows that the customer raised the dispute in error.

    It is possible for a dispute to be decided as lost before we receive the notification from your customer’s bank that the chargeback has been withdrawn, and it’s common for a case to remain under review even when your customer tells you they’ve withdrawn the dispute and already been re-billed by their bank.

    Refunding a withdrawn dispute

    If your customer is willing to withdraw a dispute so that you can issue a refund, it can still take 60-75 days for the dispute to be closed and the funds returned. Only when this happens can a refund be made.

    In some circumstances, Stripe can return the disputed amount before the dispute is closed by the bank. When a dispute is withdrawn, the bank re-bills your customer and provides them with written confirmation (e.g., letter, or email) stating that the dispute has been closed. If you can obtain a copy of either the written confirmation or clear evidence of re-billing, let us know and we may be able to close the dispute sooner. Even if your customer withdraws the dispute, you still must respond to it.

    Dispute rate

    Your account’s dispute rate is available within the fraud prevention metrics in the Dashboard. It represents the number of disputed payments as a percentage of the total number of payments received. As disputes can be created 90 days or more from the date the payment was made, we calculate a dispute rate for a group of payments from approximately 30-60 or 30-90 days ago.

    For payments received within the last 30 days, there isn’t enough dispute data to calculate an accurate rate. Payments are rarely disputed so soon after a card has been charged, so any calculated rate would be artificially low. As this information cannot be accurate, we do not present dispute rate for payments made within 30 days.

    Dispute rates vary from business to business, so there is no particular rate you can expect. Your dispute rate is a result of how effective your disputes and fraud prevention measures are. It may also be affected by the quality of your product and your customer service approach. However, all businesses on Stripe should have a dispute rate lower than 1%—anything above that amount is considered excessive. You should regularly examine your fraud prevention metrics to better understand how—and why—disputes occur.

    Excessive dispute rate

    Each card network (e.g., Visa, Mastercard, American Express) maintains a series of monitoring programs that apply to businesses operating with a high dispute rate. A dispute rate above 1% is generally considered excessive, although this varies by card network. An excessive dispute rate not only affects your ability to process with Stripe, but with other processors as well—and can even result in fines from the card networks.

    Should we ever see a higher dispute rate or a significant increase in potentially fraudulent activity on your account, we’ll proactively reach out to see how we can help.

    Inquiries and retrievals

    Some banks may begin to investigate a payment before creating a formal dispute, and request further information about it. This is known as either an “inquiry” or “retrieval”, depending on the card brand. Unlike a formal dispute, no funds have been withdrawn and the payment it relates to can still be refunded. Inquiries are common for American Express payments, as are retrievals for Discover cards. Mastercard and Visa almost always create a full dispute immediately.

    Inquiries and retrievals still appear as disputed payments in the Dashboard. To avoid it becoming a formal dispute, you should submit any required evidence or refund the payment in full. This marks the inquiry or retrieval as resolved and no dispute fee is incurred.

    Many inquiries or retrievals are the result of the cardholder not recognizing the transaction, and providing basic info about your business and what was purchased is usually sufficient to close the case. However, if the cardholder refutes your evidence, or the bank considers it insufficient, the bank might escalate the inquiry or retrieval into a formal dispute and reclaim the cardholder’s funds. It’s important to resolve the case while it is still in the inquiry or retrieval stage.

    Regardless of which option you choose, it’s always best to reach out to your customer first to get more information about the reason for the inquiry or retrieval. Failure to respond to an inquiry or retrieval with sufficient evidence may lead to a full dispute that cannot be remedied. Always respond to inquiries and retrievals as if they were formal disputes, and make every effort to resolve issues with your customer during this stage.

    The status of a Dispute object relating to an inquiry or retrieval can be one of the following:

    • warning_needs_response, no evidence has yet been provided for the dispute
    • warning_under_review, evidence has been submitted to the cardholder’s bank and it is under review
    • warning_closed, the inquiry or retrieval has timed out and did not escalate into a full dispute
    • charge_refunded, the dispute has been closed as the inquiry or retrieval was refunded

    Disputes on partially refunded payments

    While uncommon, a payment can be disputed for the full amount even if a partial refund has already been made (e.g., a refund of a smaller amount that has been agreed upon). We understand this can be frustrating as it leaves you responsible for the partial refund you’ve already processed and the full amount disputed, though banks are very willing to rectify this situation.

    Even if you plan to accept the unrefunded portion of the dispute, it’s important for you to provide evidence of the partial refund in your response. This should include the amount and date of the refund, and even a screenshot of the refund information from your Dashboard (this is known as a “credit issued” response).

    In most cases, the bank cancels the original dispute and then creates a separate one for the corrected amount. If the dispute is fully resolved in your favor, the entire amount is returned to you.

    Disputes on Connect platforms

    If you are using Connect and Custom or Express accounts, your platform is ultimately responsible for any disputes that occur. For payments created on Standard accounts using direct charges, those accounts are responsible for disputes and any funds are withdrawn from their balance—not the platform.

    In the event of a dispute where a payment was made directly on the connected account, it’s balance is debited. If this fails, the platform is ultimately liable for the disputed amount and associated fee. If the connected account turns out to be fraudulent, it is unlikely our attempt to debit the bank account will be successful and the required amount and fee is then deducted from the platform.

    If the disputed payment was created through the platform using destination charges, the platform account is automatically debited for the disputed amount and fee. When this happens, the platform can attempt to recover funds from the connected account involved by reversing the transfer either through the Dashboard or by creating a transfer reversal.

    If there is a negative balance on the connected account, Stripe attempts to debit its bank account only if debit_negative_balances is set to true.

    Next steps

    Congrats! You can now manage and respond to disputes. You may want to learn more about the different reasons for disputes or move on to related subjects: