# ACH Direct Debit Learn how businesses can accept payments with ACH Direct Debit. There are two ways to accept US bank debits on Stripe: ACH Direct Debit and [Instant Bank Payments](https://docs.stripe.com/payments/link/instant-bank-payments.md). This guide describes ACH Direct Debit and helps you choose the best bank debit type for your business. *ACH* (Automated Clearing House (ACH) is a US financial network used for electronic payments and money transfers that doesn’t rely on paper checks, credit card networks, wire transfers, or cash) lets you accept payments from customers with a US bank account. ACH Direct Debit is a [reusable](https://docs.stripe.com/payments/payment-methods.md#usage), [delayed notification](https://docs.stripe.com/payments/payment-methods.md#payment-notification) payment method. It can take [up to 4 business days](https://docs.stripe.com/payments/ach-direct-debit.md#timing) to receive acknowledgement of success or failure. Because ACH Direct Debit isn’t a guaranteed payment method, there’s a risk of failed payments and [disputes](https://docs.stripe.com/payments/ach-direct-debit.md#disputed-payments). For information on payment method transaction fees, refer to [pricing details](https://stripe.com/pricing/local-payment-methods). Accepting bank accounts is slightly different from accepting cards: 1. Your customer must [authorize](https://docs.stripe.com/payments/ach-direct-debit.md#mandates) the payment terms. 1. Bank accounts must be [verified](https://docs.stripe.com/payments/ach-direct-debit.md#verification). #### Payment method properties - **Customer locations** US - **Presentment currency** USD - **Payment confirmation** Business-initiated - **Payment method family** Bank debit - **Recurring payments** Yes - **Payout timing** 2-5 days - **Connect support** [Yes](https://docs.stripe.com/payments/ach-direct-debit.md#connect) - **Dispute support** [Yes](https://docs.stripe.com/payments/ach-direct-debit.md#disputed-payments) - **Manual capture support** No - **Refunds / Partial refunds** [Yes / Yes](https://docs.stripe.com/payments/ach-direct-debit.md#refunds) #### Business locations Stripe accounts in the following countries can accept debit payments with local currency settlement. - AT - BE - BG - CH - CY - CZ - DE - DK - EE - ES - FI - FR - GB - GI - GR - HR - HU - IE - IT - LI - LT - LU - LV - MT - NL - NO - PL - PT - RO - SE - SI - SK - US #### Product support - Connect - Checkout - Payment Links - Subscriptions - Invoicing - Elements1 1Express Checkout Element doesn’t support ACH Direct Debit. ## Payment flow ![](https://b.stripecdn.com/docs-statics-srv/assets/checkout.4af16ecfd4f0a3f4044c56d6100c4a42.svg) At checkout, the customer selects **ACH Direct Debit**. ![](https://b.stripecdn.com/docs-statics-srv/assets/account-info.6df4a503f8d05d1d9ddd20a6f15172df.svg) The customer signs into their bank account to provide account information. ![](https://b.stripecdn.com/docs-statics-srv/assets/redirect.f6e6ccf58078e0a25815560086204c24.svg) The merchant presents the mandate. The customer accepts it by completing the purchase. ![](https://b.stripecdn.com/docs-statics-srv/assets/success.1ee3b6d34d944693e654e84f6d1be9f3.svg) The customer is notified when payment is complete. ## Get started If ACH is all you want, learn how to [accept a payment](https://docs.stripe.com/payments/ach-direct-debit/accept-a-payment.md) with ACH. Below are options to skip writing that code. ### Dynamic payment methods You don’t have to integrate ACH Direct Debit and other payment methods individually. If you use our front-end products, Stripe automatically determines the most relevant payment methods to display. Go to the [Stripe Dashboard](https://dashboard.stripe.com/settings/payment_methods) and enable ACH Direct Debit. To get started with one of our hosted UIs, follow a quickstart: - [Checkout](https://docs.stripe.com/checkout/quickstart.md): Our prebuilt, hosted checkout page. - [Elements](https://docs.stripe.com/payments/quickstart.md): Our drop-in UI components. ### Other payment products The following Stripe products also let you add ACH Direct Debit from the Dashboard: - [Invoicing](https://docs.stripe.com/invoicing/no-code-guide.md) - [Payment Links](https://docs.stripe.com/payment-links.md) - [Subscriptions](https://docs.stripe.com/billing/subscriptions/overview.md) ### Manually add each payment method If you prefer to manually list payment methods or want to save ACH Direct Debit details for future payments, see the following guides: - [Manually configure ACH Direct Debit as a payment](https://docs.stripe.com/payments/ach-direct-debit/accept-a-payment.md) - [Save ACH Direct Debit details for future payments](https://docs.stripe.com/payments/ach-direct-debit/set-up-payment.md) ## Timing With ACH Direct Debit, it can take time for funds to become available in your Stripe balance. The amount of time it takes for funds to become available is referred to as the settlement timing. The following tables describe the settlement timings for ACH Direct Debit payments that Stripe offers. Initial payments made from select bank accounts that use temporary account numbers with Financial Connections might be subject to settlement delays. | Settlement type | Timing | Cutoff time | Additional information | | ------------------------- | ------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Standard settlement (T+4) | 4 business days from payment creation | 21:00 US/Eastern | After ACH Direct Debit payments settle to your Stripe account balance, we make payouts to your bank account according to your set payout schedule. | | Faster settlement (T+2) | 2 business days from payment creation | 14:00 US/Eastern | This option is available only to eligible US users. You can check your eligibility and activate this option on the [Payment methods settings](https://dashboard.stripe.com/settings/payment_methods). For more information on faster settlement, see the [Support](https://support.stripe.com/questions/two-day-settlement-for-ach-direct-debit) page. | ![](https://b.stripecdn.com/docs-statics-srv/assets/settlement-timings.a7d03de51dbe6630245b69df27038ce1.svg) A diagram showing the two settlement timings for ACH Direct Debit: standard (4 days) and faster (2 days). For information on how to cancel payments, see [Refund and cancel payments](https://docs.stripe.com/refunds.md#cancel-payment). ## Transaction failures ACH Direct Debit transactions can fail any time after the payment is initiated through payment confirmation. These failures can occur for a number of reasons, such as: - Insufficient funds - An invalid account number - A customer disabling debits from their bank account If a payment fails after funds have been made available in your Stripe balance, Stripe immediately removes funds from your Stripe account. In rare situations, Stripe might receive an ACH failure from the bank after a PaymentIntent has transitioned to `succeeded`. If this happens, Stripe creates a dispute with a `reason` of: - `insufficient_funds` - `incorrect_account_details` - `bank_cannot_process` Stripe charges a failure fee in this situation. ## Verification Learn about [validation and verification](https://support.stripe.com/questions/nacha-bank-account-validation-rule) requirements. Stripe lets your customers securely share their financial data by linking their financial accounts to your business. Use [Financial Connections](https://docs.stripe.com/financial-connections.md) to access customer-permissioned financial data such as tokenized account and routing numbers, balance data, ownership details, and transaction data. Your customers might enter their bank account manually instead of authenticating with Stripe Financial Connections. In these cases, Stripe provides a fully-hosted flow for collecting bank account details and verifies them with microdeposits. When you use [Stripe.js](https://docs.stripe.com/payments/elements.md), our JavaScript library for building payment flows, Stripe provides a fully-hosted collection of bank account details, instant bank verification, and (if needed) delayed verification using microdeposits. This verification process is a requirement for many businesses, and it helps reduce payment failures and fraudulent activities. ## Mandates ACH Direct Debit rules require that you first get authorization from a customer to take payments before you can debit their bank account. To obtain authorization, you present a *mandate* (A written notice of authorization to debit a bank account, agreed to by the customer before the first debit) to them. This mandate specifies the terms for one-time or recurring payments. The customer must agree to this mandate before you can collect any payments from their bank account. When you use Stripe to initiate ACH transactions with your customers, make sure you have all the necessary authorizations and approvals from your customers for Stripe to transmit an ACH debit transaction to the customer’s bank account. The information you provide Stripe about each ACH transaction must be accurate and complete, including the name of your customer that authorized you to initiate the ACH transaction to their bank account. #### Types of mandates There are two types of mandates: online and offline. - **Online mandates**: Appear as part of the payment flow on a website. Customers accept online mandates through a user interface element, such as clicking an **Accept** or **Pay** button, or by checking a box. - **Offline mandates**: Require that you present the specific terms of the transaction to your customer in writing or over the phone. The customer accepts those terms when they sign the paper or verbally agree to the terms over the phone. See the [details on the offline mandate types](https://docs.stripe.com/payments/ach-direct-debit/sec-codes.md) Stripe supports. Stripe displays an online mandate on the payment page for you if you use one of the following hosted products: - Checkout - Payment Element - Hosted Invoices Page ### Mandates for online custom payment forms For custom payment forms that directly integrate with the Payment Intents API, you must display the mandate terms on your payment page before confirming the PaymentIntent or SetupIntent. You only need to display a mandate the first time you collect a customer’s bank account. #### Recommended mandate text (online) We recommend that you use the following mandate text for your online custom payment form. This text must include the customer’s name, bank account information, and the date. For details on displaying the correct business name for Connect users, see [merchant of record and statement descriptors](https://docs.stripe.com/payments/ach-direct-debit.md#connect-merchant-of-record). | By clicking [accept], you authorize Rocket Rides to debit the bank account specified above for any amount owed for charges arising from your use of Rocket Rides’ services and/or purchase of products from Rocket Rides, pursuant to Rocket Rides’ website and terms, until this authorization is revoked. You may amend or cancel this authorization at any time by providing notice to Rocket Rides with 30 (thirty) days notice. | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | If you plan to use the customer’s bank account for future payments with the [setup_future_usage](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-setup_future_usage) parameter or by [saving bank details](https://docs.stripe.com/payments/ach-direct-debit/set-up-payment.md) for a future payment, also include: | If you use Rocket Rides’ services or purchase additional products periodically pursuant to Rocket Rides’ terms, you authorize Rocket Rides to debit your bank account periodically. Payments that fall outside of the regular debits authorized above will only be debited after your authorization is obtained. | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | > If you originate recurring preauthorized debits, you must disclose to your customers how these amounts are calculated or a range the customer can anticipate. You must also give your customer at least 7 calendar days notice if you change the timing of any recurring preauthorized debits. ### Mandate and microdeposit emails To comply with Nacha rules, you must provide each customer with an electronic or hard copy of the mandate. By default, if your customer provides a [billing email address](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-billing_details-email), Stripe automatically emails your customer the following information: - Confirmation of the mandate, per Nacha requirements. - Notification if Stripe needs to use microdeposits to verify your customer’s bank account. These notification emails link to a hosted verification page. #### Sending custom mandate notifications (online) You can send custom mandate notifications to customers. To send custom mandate notifications: 1. Turn off Stripe emails in the Stripe Dashboard [email settings](https://dashboard.stripe.com/settings/emails) 1. Send a mandate confirmation email when you receive your customer’s bank account and mandate authorization. In the email, include the following information: - Authorization date - Account holder name - Financial institution - Routing number - Last four digits of the account number The following is a sample mandate confirmation email that you can send. | Agreement Date | **June 28, 2021** | | --------------------- | ----------------- | | Account Holder Name | **Jenny Rosen** | | Financial Institution | **Chase Bank** | | Routing Number | **021000021** | | Account Number | \******6789** | | Thank you for signing up for direct debits from Rocket Rides. You have authorized Rocket Rides to debit the bank account specified above for any amount owed for charges arising from your use of Rocket Rides’ services and/or purchase of products from Rocket Rides, pursuant to Rocket Rides’ website and terms, until this authorization is revoked. You may amend or cancel this authorization at any time by providing notice to Rocket Rides with 30 (thirty) days notice. | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | If you collected the customer’s bank account for future payments with the [setup_future_usage](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-setup_future_usage) parameter or by [saving bank details](https://docs.stripe.com/payments/ach-direct-debit/set-up-payment.md), also include: | You have authorized Rocket Rides to debit your bank account periodically if and when you use Rocket Rides’ services or purchase more than one of Rocket Rides’ products periodically pursuant to Rocket Rides’ terms. Payments that fall outside of the regular debits authorized above will only be debited after your authorization is obtained. | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | > If you choose to send custom emails, you also need to send microdeposit reminder emails. For detailed instructions, see [Custom microdeposit email and verification page](https://docs.stripe.com/payments/ach-direct-debit/accept-a-payment.md?web-or-mobile=web&payment-ui=direct-api#optional:-send-custom-email-notifications). ## Disputes ACH Direct Debit provides a dispute process for bank account holders to dispute payments. Customers can generally dispute a payment through their bank for up to 60 calendar days after a debit on a personal account, or up to 2 business days for a business account. Disputes received within these timeframes are considered final and uncontestable through the ACH network. Consequently, you can’t challenge these disputes and must resolve them directly with your customers. In rare instances, a debit payment can be successfully disputed outside these timelines. This is called a late return. The late return process is primarily managed by and ultimately decided at the discretion of the banks involved in the transaction. When a dispute is created, Stripe sends both the [charge.dispute.created](https://docs.stripe.com/api/events/types.md#event_types-charge.dispute.created) and [charge.dispute.closed](https://docs.stripe.com/api/events/types.md#event_types-charge.dispute.closed) *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) events and deducts the amount of the dispute and associated dispute fee from your Stripe balance. Unlike credit card disputes, all ACH Direct Debit disputes are final with no process for appeal. If a customer successfully disputes a payment, you must contact them directly to resolve the situation. If you suspect that disputes are fraudulent, Stripe Radar might help you reduce risk. > If you proactively issue your customer a refund while the customer’s bank also initiates the dispute process, your customer might receive two credits for the same transaction. Follow the guidelines in the following section on refunds to avoid this situation. ### Resolving disputes When a customer disputes an ACH Direct Debit payment, it invalidates the mandate associated with the payment method and you can’t reuse it. To attempt a charge again, you must resolve the dispute with the customer and [collect a new mandate authorization](https://docs.stripe.com/payments/ach-direct-debit/accept-a-payment.md#resolving-disputes). If they dispute a subsequent payment, Stripe blocks the bank account from further re-use. To learn more about resolution steps, see [Blocked bank accounts](https://docs.stripe.com/payments/ach-direct-debit/blocked-bank-accounts.md). ### Requests for Proof of Authorization In some rare circumstances, a customer’s bank initiates an inquiry to request proof of authorization for an ACH Debit. If you use custom mandates through the [Payment Intents API](https://docs.stripe.com/api/payment_intents.md), Stripe creates a dispute inquiry for your business to provide evidence for the payment in question. If you use Stripe-hosted ACH mandates, Stripe automatically responds to the customer’s bank with a copy of the debit authorization. When Stripe receives an ACH Debit authorization inquiry, a [charge.dispute.created](https://docs.stripe.com/api/events/types.md#event_types-charge.dispute.created) event is triggered with the status `warning_needs_response` and a new dispute inquiry is shown in the Dashboard. To comply with Nacha rules, you must upload evidence of the customer’s authorization upon request. #### Evidence to submit for an ACH inquiry Here is the evidence you need to submit for an ACH inquiry: - **Mandate authorization (required)**: A copy of the authorization proving that the customer or bank account holder agreed to the debit on their bank account. - **Sales receipt**: Documentation of the goods or services purchased by the customer. - **Customer information**: Information on the customer’s identity proving that the accountholder authorized the payment and received the good or service. You can upload evidence through the Stripe Dashboard or the [Files API](https://docs.stripe.com/api/files.md). You can only submit evidence for a dispute inquiry *once*. If you don’t submit evidence before the deadline, the dispute is accepted and closed. ##### Submit evidence through the Dashboard To submit evidence to contest a late return dispute through the Dashboard: 1. Go to [the payments page](https://dashboard.stripe.com/payments) and look for a payment with an inquiry icon. 1. Click on **Respond to the inquiry** to provide more details about the transaction. You can upload an image or PDF of the proof of authorization. ##### Submit evidence through the Files API To submit evidence through the [Files API](https://docs.stripe.com/api/files.md), first [upload the evidence files](https://docs.stripe.com/file-upload.md#uploading-a-file). #### curl ```bash curl https://files.stripe.com/v1/files \ -u <>: \ -F "file"="@/path/to/a/file.jpg" \ -F "purpose"="dispute_evidence" ``` #### Ruby ```ruby # Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys Stripe.api_key = '<>' Stripe::File.create({ file: File.new('/path/to/a/file.jpg'), purpose: 'dispute_evidence', }) ``` #### Python ```python # Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys stripe.api_key = '<>' with open('/path/to/a/file.jpg', 'rb') as fp: stripe.File.create( file=fp, purpose='dispute_evidence', ) ``` #### PHP ```php // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys \Stripe\Stripe::setApiKey('<>'); $fp = fopen('/path/to/a/file.jpg', 'r'); \Stripe\File::create([ 'file' => $fp, 'purpose' => 'dispute_evidence', ]); ``` #### Java ```java // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys Stripe.apiKey = "<>"; FileCreateParams params = FileCreateParams.builder() .setFile(new java.io.File("/path/to/a/file.jpg")) .setPurpose(FileCreateParams.Purpose.DISPUTE_EVIDENCE) .build(); File upload = File.create(params); ``` #### Node.js ```javascript // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys const stripe = require('stripe')('<>'); const fp = fs.readFileSync('/path/to/a/file.jpg'); const upload = await stripe.files.create({ file: { data: fp, name: 'file.jpg', type: 'application/octet-stream', }, purpose: 'dispute_evidence', }); ``` #### Go ```go // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys stripe.Key = "<>" fp, _ := os.Open("/path/to/a/file.jpg") params := &stripe.FileParams{ FileReader: fp, Purpose: stripe.String(string(stripe.FilePurposeDisputeEvidence)), Filename: stripe.String("file.jpg"), } upload, _ := file.New(params) ``` #### .NET ```dotnet // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys StripeConfiguration.ApiKey = "<>"; var filename = "/path/to/a/file.jpg"; using (FileStream stream = System.IO.File.Open(filename, FileMode.Open)) { var service = new FileService(); var options = new FileCreateOptions { File = stream, Purpose = FilePurpose.DisputeEvidence, }; Stripe.File upload = service.Create(options); } ``` Then, link the uploaded files to the dispute inquiry in the [Disputes API](https://docs.stripe.com/api/disputes/update.md#update_dispute-evidence) using the returned file `id`. ```curl curl https://api.stripe.com/v1/disputes/YOUR_DISPUTE_ID \ -u "<>:" \ -d "evidence[uncategorized_file]"=file_id_123 \ -d submit=true ``` ```cli stripe disputes update YOUR_DISPUTE_ID \ -d "evidence[uncategorized_file]"=file_id_123 \ --submit=true ``` ```ruby # Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys client = Stripe::StripeClient.new("<>") dispute = client.v1.disputes.update( 'YOUR_DISPUTE_ID', { evidence: {uncategorized_file: 'file_id_123'}, submit: 'true', }, ) ``` ```python # Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys client = StripeClient("<>") # For SDK versions 12.4.0 or lower, remove '.v1' from the following line. dispute = client.v1.disputes.update( "YOUR_DISPUTE_ID", {"evidence": {"uncategorized_file": "file_id_123"}, "submit": True}, ) ``` ```php // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys $stripe = new \Stripe\StripeClient('<>'); $dispute = $stripe->disputes->update( 'YOUR_DISPUTE_ID', [ 'evidence' => ['uncategorized_file' => 'file_id_123'], 'submit' => true, ] ); ``` ```java // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys StripeClient client = new StripeClient("<>"); DisputeUpdateParams params = DisputeUpdateParams.builder() .setEvidence( DisputeUpdateParams.Evidence.builder().setUncategorizedFile("file_id_123").build() ) .setSubmit(true) .build(); // For SDK versions 29.4.0 or lower, remove '.v1()' from the following line. Dispute dispute = client.v1().disputes().update("YOUR_DISPUTE_ID", params); ``` ```node // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys const stripe = require('stripe')('<>'); const dispute = await stripe.disputes.update( 'YOUR_DISPUTE_ID', { evidence: { uncategorized_file: 'file_id_123', }, submit: true, } ); ``` ```go // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys sc := stripe.NewClient("<>") params := &stripe.DisputeUpdateParams{ Evidence: &stripe.DisputeUpdateEvidenceParams{ UncategorizedFile: stripe.String("file_id_123"), }, Submit: stripe.Bool(true), } result, err := sc.V1Disputes.Update(context.TODO(), "YOUR_DISPUTE_ID", params) ``` ```dotnet // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys var options = new DisputeUpdateOptions { Evidence = new DisputeEvidenceOptions { UncategorizedFile = "file_id_123" }, Submit = true, }; var client = new StripeClient("<>"); var service = client.V1.Disputes; Dispute dispute = service.Update("YOUR_DISPUTE_ID", options); ``` You can provide additional information about the transaction using other [fields](https://docs.stripe.com/api/disputes/update.md#update_dispute-evidence) in the Disputes API. ##### Post-submission After receiving evidence submissions, Stripe sends a [charge.dispute.updated](https://docs.stripe.com/api/events/types.md#event_types-charge.dispute.created) event and a message appears in your timeline confirming receipt of the evidence. After you submit evidence, the bank reviews the evidence and makes a determination. If the evidence is sufficient, the dispute inquiry closes in your favor and is marked as `won`. If the bank determines that the authorization is insufficient, the dispute closes and is marked as `lost`. Stripe doesn’t determine whether or not evidence of authorization is sufficient, and under Nacha rules, the bank may return the payment in its sole discretion. ## Blocked bank accounts To comply with Nacha regulations, Stripe may block bank accounts when a blockable ACH return is received until we can confirm that the issue causing the returns has been resolved. When this happens, Stripe sends the [payment_method.automatically_updated](https://docs.stripe.com/api/events/types.md#event_types-payment_method.automatically_updated) event for all saved payment methods. Consuming these events can provide advance notice if your business model relies on recurring payments that need to be processed before a certain date. Inspect the event data for the `us_bank_account.status_details.blocked` field, then work with your customer to unblock or switch bank accounts before initiating future payments. You receive equivalent events when the block is removed, indicating that payment methods can be reused immediately if an active mandate exists or you re-collect one. For more information on blocked bank accounts and how to deal with them, see [Blocked bank accounts](https://docs.stripe.com/payments/ach-direct-debit/blocked-bank-accounts.md). ## Refunds You have a maximum of 180 days from the date of the original payment to submit a refund for an ACH Direct Debit payment. Refunds require at least 3 business days to process. Stripe waits for the original payment to succeed before submitting the refund. > #### Avoid disputes > > If you accidentally debit your customer, contact them immediately to avoid a payment dispute. Factors such as slightly longer settlement time periods and the way banks process ACH Direct Debit transactions can cause confusion between you, your customer, your customer’s bank, and Stripe. For example, your customer might contact both you and their bank to dispute a payment. If you proactively issue your customer a refund while the customer’s bank also initiates the dispute process, your customer might receive two credits for the same transaction, so it’s important to communicate with your customer about the processing time and the status of their refund. Stripe doesn’t explicitly label ACH Direct Debit refunds as refunds when we deposit the funds back to a customer’s bank account. Instead, we process refunds as a credit and include a reference to the statement descriptor for the original payment. ## Statement descriptors for ACH Every ACH Direct Debit payment shows up on customers’ bank statements with the *name of the merchant*. For payments created with Stripe, the name of the merchant is your Stripe account’s [statement descriptor](https://docs.stripe.com/get-started/account/statement-descriptors.md). You can override this default behavior for every transaction independently by using a [dynamic statement descriptor](https://docs.stripe.com/payments/payment-intents.md#dynamic-statement-descriptor). To do so, specify the [statement_descriptor](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-statement_descriptor) parameter when creating the `PaymentIntent`. > Your statement descriptor truncates to the first 16 alphanumeric characters on the bank statement. For example, if your statement descriptor is `ROCKETRIDESLIMITED`, the customer sees `ROCKETRIDESLIMIT`. > > Additionally, statement descriptors can’t use the special characters `<`, `>`, `'`, or `"`. The table below illustrates the *merchant name* behavior you can expect on the customer’s bank statement: | Default statement descriptor | Dynamic statement descriptor | Merchant name | Bank statement descriptor | | ---------------------------- | ---------------------------- | -------------- | ------------------------- | | Rocket Rides | Unspecified | `Rocket Rides` | `Rocket Rides` | | Rocket Rides | `Sunday Ride` | `Rocket Rides` | `Sunday Ride` | Each bank formats these fields differently. Depending on your customer’s bank, some fields might appear in all lowercase or all uppercase. ## Connect If you use *Connect* (Connect is Stripe's solution for multi-party businesses, such as marketplace or software platforms, to route payments between sellers, customers, and other recipients), you must take the following into consideration before you enable and use ACH Direct Debits. ### Request ACH Debit capabilities for your connected accounts Set the `us_bank_account_ach_payments` capability to `active` on your platform account, and for any connected accounts you want to enable for ACH debits. You can also [request more account capabilities](https://docs.stripe.com/connect/account-capabilities.md#requesting-unrequesting). > Stripe automatically refunds the application fee to your platform account when the [destination charge](https://docs.stripe.com/connect/charges.md#destination) for an ACH debit fails. Learn about [fees for failed payments](https://stripe.com/pricing/local-payment-methods#ach-direct-debit). ### Merchant of record and statement descriptors The [charge type](https://docs.stripe.com/connect/charges.md) of Connect payments might change the default statement descriptor and the merchant name that appears on the customer’s bank statement. The charge type can also change: - The *merchant of record* (The legal entity responsible for facilitating the sale of products to a customer that handles any applicable regulations and liabilities, including sales taxes. In a Connect integration, it can be the platform or a connected account) shown on the mandate - The merchant shown on confirmation emails - The merchant shown on microdeposit reminder emails The merchant of record determines the Stripe account authorized to create payments with a particular [PaymentMethod](https://docs.stripe.com/api/payment_methods/object.md). To learn more about sharing this authorization across multiple connected accounts, see [PaymentMethod and Mandate cloning](https://docs.stripe.com/payments/ach-direct-debit.md#payment-method-and-mandate-cloning). | Charge type | Descriptor taken from | | -------------------------------------------------- | --------------------- | | Direct | Connected Account | | Destination | Platform | | Separate charge and transfer | Platform | | Destination (with `on_behalf_of`) | Connected Account | | Separate charge and transfer (with `on_behalf_of`) | Connected Account | ### PaymentMethod and mandate cloning You can collect customer bank accounts on the platform account and [clone](https://docs.stripe.com/connect/direct-charges-multiple-accounts.md#clone-and-create-direct-charges) ACH Direct Debit payment methods. Cloning these methods allows you to save customer bank accounts for later use on connected accounts. When you clone ACH Direct Debit payment methods, Stripe duplicates the mandate authorization to the connected account, but we don’t send any new mandate confirmation emails. > If a mandate is authorized for a PaymentIntent or SetupIntent [on_behalf_of](https://docs.stripe.com/connect/charges.md#on_behalf_of) a connected account, you can’t use that mandate with a different connected account. When collecting a bank account that you intend to clone to connected accounts, you must communicate to the customer that their authorization extends to connected accounts on your platform. For example, you can communicate this message to a customer through the mandate terms. Failure to communicate this message to your customers could result in customer confusion and increase the risk of disputed payments. ### Connect and settlement Settlement speed is generally controlled at the platform level. The table below shows a comprehensive view of settlement timing by account and charge type. | Account Type | Direct Charges | Destination Charges | Separate Charges and Transfers | | ------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------- | | **Standard with Platform Control** | The platform controls the settlement speed. | The platform controls the settlement speed. | The platform controls the settlement speed. | | **Standard without Platform Control** | The connected account controls the settlement speed. | The connected account controls the settlement speed. | The platform controls the settlement speed. | | **Express** | The platform controls the settlement speed. | The platform controls the settlement speed. | The platform controls the settlement speed. | | **Custom** | The platform controls the settlement speed. | The platform controls the settlement speed. | The platform controls the settlement speed. | ## Testing ACH Learn how to test scenarios with instant verifications using [Financial Connections](https://docs.stripe.com/financial-connections/testing.md#web-how-to-use-test-accounts). ### Send transaction emails in a sandbox After you collect the bank account details and accept a mandate, send the mandate confirmation and microdeposit verification emails in a *sandbox* (A sandbox is an isolated test environment that allows you to test Stripe functionality in your account without affecting your live integration. Use sandboxes to safely experiment with new features and changes). If your domain is **{domain}** and your username is **{username}**, use the following email format to send test transaction emails: **{username}+test\_email@{domain}**. For example, if your domain is **example.com** and your username is **info**, use the format **info+test\_email@example.com** for testing ACH Direct Debit payments. This format ensures that emails route correctly. If you don’t include the **+test\_email** suffix, we won’t send the email. > You need to [activate your Stripe account](https://docs.stripe.com/get-started/account/activate.md) before you can trigger these emails while testing. ### Test account numbers Stripe provides several test account numbers and corresponding tokens you can use to make sure your integration for manually-entered bank accounts is ready for production. | Account number | Token | Routing number | Behavior | | -------------- | -------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | `000123456789` | `pm_usBankAccount_success` | `110000000` | The payment succeeds. | | `000111111113` | `pm_usBankAccount_accountClosed` | `110000000` | The payment fails because the account is closed. | | `000000004954` | `pm_usBankAccount_riskLevelHighest` | `110000000` | The payment is blocked by Radar due to a [high risk of fraud](https://docs.stripe.com/radar/risk-evaluation.md#high-risk). | | `000111111116` | `pm_usBankAccount_noAccount` | `110000000` | The payment fails because no account is found. | | `000222222227` | `pm_usBankAccount_insufficientFunds` | `110000000` | The payment fails due to insufficient funds. | | `000333333335` | `pm_usBankAccount_debitNotAuthorized` | `110000000` | The payment fails because debits aren’t authorized. | | `000444444440` | `pm_usBankAccount_invalidCurrency` | `110000000` | The payment fails due to invalid currency. | | `000666666661` | `pm_usBankAccount_failMicrodeposits` | `110000000` | The payment fails to send microdeposits. | | `000555555559` | `pm_usBankAccount_dispute` | `110000000` | The payment triggers a dispute. | | `000000000009` | `pm_usBankAccount_processing` | `110000000` | The payment stays in processing indefinitely. Useful for testing [PaymentIntent cancellation](https://docs.stripe.com/api/payment_intents/cancel.md). | | `000777777771` | `pm_usBankAccount_weeklyLimitExceeded` | `110000000` | The payment fails due to payment amount causing the account to exceed its weekly payment volume limit. | Before test transactions can complete, you need to verify all test accounts that automatically succeed or fail the payment. To do so, use the test microdeposit amounts or descriptor codes below. ### Test microdeposit amounts and descriptor codes To mimic different scenarios, use these microdeposit amounts *or* 0.01 descriptor code values. | Microdeposit values | 0.01 descriptor code values | Scenario | | ------------------- | --------------------------- | ---------------------------------------------------------------- | | `32` and `45` | SM11AA | Simulates verifying the account. | | `10` and `11` | SM33CC | Simulates exceeding the number of allowed verification attempts. | | `40` and `41` | SM44DD | Simulates a microdeposit timeout. | ### Test settlement behavior Test transactions settle instantly and are added to your available test balance. This behavior differs from livemode, where transactions can take [multiple days](https://docs.stripe.com/payments/ach-direct-debit.md#timing) to settle in your available balance. ## US bank debit comparison | Option | Confirmation time | Payment failure protection | Additional information | | ----------------------------------------------------------------------------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Instant Bank Payments](https://docs.stripe.com/payments/link/instant-bank-payments.md) | Instant | Bank-initiated returns guaranteed by Stripe | For businesses looking for instant confirmation and faster settlement, Instant Bank Payments provides a card-like payment flow with the cost savings of bank debits. Instant Bank Payments are available only as a part of [Link](https://docs.stripe.com/payments/link.md). | | [ACH Direct Debit](https://docs.stripe.com/payments/ach-direct-debit.md#ach-direct-debit) | Up to 4 business days | Use [Financial Connections](https://docs.stripe.com/financial-connections/ach-direct-debit-payments.md) data to optimize payments. | For businesses that don’t need instant confirmation, ACH Direct Debit has lower costs than Instant Bank Payments. ACH Direct Debit is popular for businesses with large or recurring transactions. | ## Fraud Protection for ACH with Radar [Stripe Radar](https://stripe.com/radar) provides fraud protection capabilities for ACH Direct Debits without any additional development time, performing real-time evaluation using machine learning algorithms to help identify and block high-risk transactions. Our machine learning trains specifically for ACH, so it’s effective at detecting fraud that might be unique to ACH Direct Debit payments. For Radar users, Radar might be on by default for all supported payment methods. ## Billing Retries Enable [Direct Debit retries](https://docs.stripe.com/billing/revenue-recovery/smart-retries.md#direct-debit-retries) to have Stripe automatically retry failed Direct Debit payments caused by insufficient funds. You can turn on retries for [recurring subscription invoices](https://dashboard.stripe.com/revenue_recovery/retries), [one-off invoices](https://dashboard.stripe.com/settings/billing/invoices/general), or both. Stripe can automatically retry each failed ACH Direct Debit payment a maximum of 2 times, no more than 40 days after the original payment attempt.