Accept an ACH Direct Debit payment
Build a custom payment form or use Stripe Checkout to accept payments with ACH Direct Debit.
Checkout
Elements
Direct API
Mobile
Stripe users in the US can use Checkout in payment mode to accept ACH Direct Debit payments.
A Checkout Session represents the details of your customer’s intent to purchase. You create a Session when your customer wants to pay for something. After redirecting your customer to a Checkout Session, Stripe presents a payment form where your customer can complete their purchase. After your customer completes a purchase, they redirect back to your site.
Note
ACH Direct Debit is a delayed notification payment method, which means that funds aren’t immediately available after payment. A payment typically takes 4 business days to arrive in your account.
Determine compatibility
To support ACH Direct Debit payments, make sure you express Prices for all line items in US dollars (currency code usd).
Create or retrieve a customer Recommended Server-side
Use the Accounts v2 API to represent customers
The Accounts v2 API is generally available for Connect users, and in public preview for other Stripe users. If you’re part of the Accounts v2 preview, you need to specify a preview version in your code.
To join the Accounts v2 preview, go to Account previews and features in your Dashboard and enable Reusable payment methods for Global Payouts.
For most use cases, we recommend modeling your customers as customer-configured Account objects instead of using Customer objects.
Create a customer-configured Account object when your user creates an account with your business, or retrieve an existing Account associated with this user. Associating the ID of the Account object with your own internal representation of a customer enables you to retrieve and use the stored payment method details later. Include an email address on the Account to enable Financial Connections’ return user optimization.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Accept a payment
Note
Build an integration to accept a payment with Checkout before using this guide.
Enable ACH Direct Debit as a payment method
When creating a new Checkout Session, you need to:
- Enable US bank account in your Dashboard. Stripe automatically displays US bank account to eligible customers using dynamic payment methods . If you currently specify payment _ method _ types , see the migration guide .
- Make sure all your line _ items use the usd currency.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
By default, collecting bank account payment information uses Financial Connections to instantly verify your customer’s account, with a fallback option of manual account number entry and microdeposit verification. See the Financial Connections docs to learn how to configure Financial Connections and access additional account data to optimize your ACH integration. For example, you can use Financial Connections to check an account’s balance before initiating the ACH payment.
Note
To expand access to additional data after a customer authenticates their account, they must re-link their account with expanded permissions.
If the customer opts for microdeposit verification instead of Financial Connections, Stripe automatically sends two small deposits to the provided bank account. These deposits can take 1-2 business days to appear on the customer’s online bank statement. When the deposits are expected to arrive, the customer receives an email with a link to confirm these amounts and verify the bank account with Stripe. After verification is complete, the payment begins processing.
We recommend including the payment_intent_data.setup_future_usage parameter with a value of off_session when creating a payment mode Session for ACH Direct Debit so you can save payment method details.
Fulfill your orders
After accepting a payment, learn how to fulfill orders.
Test your integration
Learn how to test scenarios with instant verifications using Financial Connections.
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.
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 **** for testing ACH Direct Debit payments. This format ensures that emails route correctly. If you don’t include the +test_email suffix, Stripe won’t send the email.
Common mistake
You must set up your Stripe account 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. |
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. |
000777777771 | pm_usBankAccount_weeklyLimitExceeded | 110000000 | The payment fails due to payment amount causing the account to exceed its weekly payment volume limit. |
000888888885 | 110000000 | The payment fails because of a deactivated tokenized account number. |
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 in the following table.
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 | the related setting | Simulates verifying the account. |
10 and 11 | the related setting | Simulates exceeding the number of allowed verification attempts. |
40 and 41 | the related setting | Simulates a microdeposit timeout. |
Test settlement behavior
Test transactions settle instantly and are added to your available test balance. This behavior differs from live mode, where transactions can take multiple days to settle in your available balance.
Additional considerations
Microdeposit verification failure
When a bank account is pending verification with microdeposits, the customer can fail to verify for three reasons:
- The microdeposits failed to send to the customer’s bank account (this usually indicates a closed or unavailable bank account or incorrect bank account number).
- The customer made 10 failed verification attempts for the account. Exceeding this limit means the bank account can no longer be verified or reused.
- The customer failed to verify the bank account within 10 days.
If the bank account fails verification for one of these reasons, you can handle the checkout.session.async_payment_failed event to contact the customer about placing a new order.
