ACH guide
ACH lets you accept payments from customers with a US bank account. ACH Direct Debit is a reusable, delayed notification payment method. It can take up to 4 business days 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.
Accepting bank accounts is slightly different from accepting cards:
Payment flow
Get started
If ACH is all you want, learn how to accept a payment with ACH. Below are options to skip writing that code.
Automatic payment methods
You don’t actually 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. Follow a quickstart for one of our hosted UIs:
After setting up your payment form, activate the payment methods you want in the Stripe Dashboard.
Other payment products
The following Stripe products also support adding ACH Direct Debit from the Dashboard:
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:
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.
Settlement type | Timing | Cutoff time | Additional information |
---|---|---|---|
Standard settlement (T+4) | 4 business days from payment creation | 18: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 users. You can check your eligibility and activate this option on the payment method settings page in the Dashboard. For more information on faster settlement, see the Support page. |
ACH 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.
Verification
Learn about validation and verification requirements.
Stripe lets your customers securely share their financial data by linking their financial accounts to your business. Use Financial Connections to access customer-permissioned financial data such as tokenized account and routing numbers, balance data, ownership details, and transaction data.
Your customers might choose to 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 with microdeposits.
When you use Stripe.js, 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.
ACH Mandates
ACH Direct Debit rules require that you first get permission from a customer to take payments before you can debit their bank account. To get this permission, you present a mandate 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.
Stripe displays a mandate on the payment page for you if you use one of the following hosted products:
- Checkout
- Payment Element
- Hosted Invoices Page
Mandates for custom payment forms
For custom payment forms that directly integrate with the PaymentIntents 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.
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 on a receipt or over the phone. The customer accepts those terms when they sign the receipt or verbally agree to the terms over the phone.
Recommended mandate text
We recommend that you use the following mandate text for your 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.
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 parameter or by saving bank details 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. |
Mandate and microdeposit emails
By default, if your customer provides a billing email address, 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
You can send custom mandate notifications to customers.
To send custom mandate notifications:
- Turn off Stripe emails in the Stripe Dashboard email settings
- 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 parameter or by saving bank details, 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. |
ACH disputes
ACH Direct Debit provides a dispute process for bank account holders to dispute payments. Customers can dispute a debit 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. The customer’s bank can honor any dispute within this period.
When a dispute is created, Stripe sends both the charge.dispute.created and charge.dispute.closed webhook 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 and there is no process for appeal. If a customer successfully disputes a payment, you must contact them if you want to resolve the 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.
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.
ACH 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.
If you request a refund for a payment that hasn’t completed yet (within a few hours of creating the Payment Intent), Stripe doesn’t submit the charge to the bank, essentially canceling the original payment rather than refunding it.
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. You can override this default behavior for every transaction independently by using a dynamic statement descriptor. To do so, specify the statement_descriptor
parameter when creating the PaymentIntent
.
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 may appear in all lowercase or uppercase.
Connect and ACH
If you use Connect, 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.
Merchant of record and statement descriptors
The charge type 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 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. To learn more about sharing this authorization across multiple connected accounts, see PaymentMethod 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 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.
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.
Testing ACH
To test scenarios with instant verifications, mimic different scenarios for ACH charges by selecting the test bank account for the use case you want to test.
Send transaction emails in test mode
After you collect the bank account details and accept a mandate, send the mandate confirmation and microdeposit verification emails in test mode. To do this, provide an email in the payment_method_data.billing_details[email]
field in the form of {any-prefix}+test_email@{any_domain}
when you collect the payment method details.
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. |
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. |
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. |