Stripe | Financial Infrastructure to Grow Your Revenue

Stripe | Financial Infrastructure to Grow Your Revenue

4466 articles

Accept an ACH Direct Debit payment


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).

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:

  1. 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 .
  2. 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 numberTokenRouting numberBehavior
000123456789pm_usBankAccount_success110000000The payment succeeds.
000111111113pm_usBankAccount_accountClosed110000000The payment fails because the account is closed.
000000004954pm_usBankAccount_riskLevelHighest110000000The payment is blocked by Radar due to a high risk of fraud.
000111111116pm_usBankAccount_noAccount110000000The payment fails because no account is found.
000222222227pm_usBankAccount_insufficientFunds110000000The payment fails due to insufficient funds.
000333333335pm_usBankAccount_debitNotAuthorized110000000The payment fails because debits aren’t authorized.
000444444440pm_usBankAccount_invalidCurrency110000000The payment fails due to invalid currency.
000666666661pm_usBankAccount_failMicrodeposits110000000The payment fails to send microdeposits.
000555555559pm_usBankAccount_dispute110000000The payment triggers a dispute.
000000000009pm_usBankAccount_processing110000000The payment stays in processing indefinitely. Useful for testing PaymentIntent cancellation.
000777777771pm_usBankAccount_weeklyLimitExceeded110000000The payment fails due to payment amount causing the account to exceed its weekly payment volume limit.
000888888885110000000The 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 values0.01 descriptor code valuesScenario
32 and 45the related settingSimulates verifying the account.
10 and 11the related settingSimulates exceeding the number of allowed verification attempts.
40 and 41the related settingSimulates 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.

Optional Instant only verification

Optional Access data on a Financial Connections bank account

Optional Resolve disputes Server-side

Optional Payment Reference

Optional Configure customer debit date Server-side

See also

Last verified 2026-09-24

Is this helpful?