Skip to content
Sign in
An image of the Stripe logo
/
Create account
Sign in
Home
Payments
Finance automation
Banking as a service
Developer tools
No-code
All products
Home
Payments
Finance automation
Home
Payments
Finance automation
Banking as a service
Developer tools
Overview
Get started
About Stripe payments
Start an integration
Payment Links
Checkout
Web Elements
Mobile Elements
Payment scenarios
During the payment
After the payment
Add payment methods
    Overview
    Payment method integration options
    Multiple payment method configurations on dynamic payment methods
    A/B testing on dynamic payment methods
    Payment method targeting on dynamic payment methods
    Register payment method domains
    Bank debits
      ACH Direct Debit
        Accept a payment
        Save bank details
        Migrating to new APIs
        Blocked bank accounts
      Bacs Direct Debit
      Pre-authorized debit in Canada
      BECS Direct Debit in Australia
      SEPA Direct Debit
    Bank redirects
    Bank transfers
    Buy now, pay later
    Credit transfers (Sources)
    Real-time payments
    Regional card installments
    Vouchers
    Wallets
More payment scenarios
Faster checkout with Link
Other Stripe products
Connect
Terminal
Radar
Financial Connections
Crypto
Identity
Climate
Resources
About the APIs
Implementation guides
Regulation support
Testing
HomePaymentsBank debitsACH Direct Debit

Accept an ACH Direct Debit payment

Build a custom payment form or use Stripe Checkout to accept payments with ACH Direct Debit.

Caution

Stripe automatically presents your customers payment method options by evaluating their currency, payment method restrictions, and other parameters. We recommend that you configure your payment methods from the Stripe Dashboard using the instructions in Accept a payment.

If you want to continue manually configuring the payment methods you present to your customers with Checkout, use this guide (for example, to accept payments in Subscription mode). Otherwise, migrate to the dashboard.

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 has completed a purchase, they are redirected back to your site.

With Checkout, you can create a Checkout Session with us_bank_account as a payment method type to track and handle the states of the payment until the payment completes.

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

Supported business locations: US

Supported currencies: usd

Presentment currencies: usd

Payment mode: Yes

Setup mode: Yes

Subscription mode: Yes

A Checkout Session must satisfy all of the following conditions to support ACH Direct Debit payments:

  • Express all Prices for all line items in US dollars (currency code usd).

Create or retrieve a customer

To reuse a bank account for future payments, attach it to a Customer.

Create a Customer object when your customer creates an account with your business. Associating the ID of the Customer object with your own internal representation of a customer enables you to retrieve and use the stored payment method details later.

Create a new Customer or retrieve an existing Customer to associate with this payment. Include the following code on your server to create a new Customer.

Command Line
curl -X POST https://api.stripe.com/v1/customers \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"

Accept a payment

Note

Build an integration to accept a payment with Checkout before using this guide.

This guides you through enabling ACH Direct Debit and shows the differences between accepting a card payment and using this payment method.

Enable ACH Direct Debit as a payment method

When creating a new Checkout Session, you need to:

  1. Add us_bank_account to the list of payment_method_types.
  2. Make sure all your line_items use the usd currency.
  3. Set the permissions parameter to include payment_method.
Command Line
curl https://api.stripe.com/v1/checkout/sessions \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d mode=payment \ -d customer={{CUSTOMER_ID}} \ -d "payment_method_types[0]"=card \ -d "payment_method_types[1]"=us_bank_account \ -d "payment_method_options[us_bank_account][financial_connections][permissions][0]"=payment_method \ -d "line_items[0][price_data][currency]"=usd \ -d "line_items[0][price_data][unit_amount]"=2000 \ -d "line_items[0][price_data][product_data][name]"=T-shirt \ -d "line_items[0][quantity]"=1 \ --data-urlencode success_url="https://example.com/success" \ --data-urlencode cancel_url="https://example.com/cancel"

If you want to access additional data on an account, sign up for Stripe Financial Connections.

Stripe Financial Connections 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.

We recommend specifying balances in the permissions parameter to access balance data on an account. Checking an account balance after accepting a payment helps you confirm a customer has sufficient funds to cover the payment.

Optionally, specify which data you require immediately upon account creation with the prefetch parameter. The prefetch parameter saves you from making another API call to retrieve data after account creation and reduces the latency of data retrieval. To protect the privacy of your customer’s data, you only receive access to account data you request. Your customer can see the data you want to access before verifying their account.

Note

To expand access to additional data after a customer authenticates their account, they must re-link their account with expanded permissions.

During the Checkout session, the customer sees a dialog that gives them the option to use instant verification or provide bank account details for microdeposit verification.

If the customer opts for microdeposit verification, 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.

Fulfill your orders

After accepting a payment, learn how to fulfill orders.

Because ACH Direct Debit is a delayed notification payment method, you must also complete the handle delayed notification payment methods step of the guide.

Test your integration

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.

Common mistake

You need to activate your Stripe account before you can trigger these emails in Test mode.

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

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 values0.01 descriptor code valuesScenario
32 and 45SM11AASimulates verifying the account.
10 and 11SM33CCSimulates exceeding the number of allowed verification attempts.
40 and 41SM44DDSimulates a microdeposit timeout.

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.

OptionalInstant only verification

OptionalAccess data on a Financial Connections bank account

OptionalResolve disputes
Server-side

See also

  • Save ACH Direct Debit pre-authorized debit details for future payments
Was this page helpful?
Need help? Contact Support.
Watch our developer tutorials.
Check out our product changelog.
Questions? Contact Sales.
Powered by Markdoc
You can unsubscribe at any time. Read our privacy policy.
On this page
Determine compatibility
Create or retrieve a customer
Accept a payment
Test your integration
Additional considerations
See also
Products Used
Payments
Checkout
Stripe Shell
Test mode
Welcome to the Stripe Shell! Stripe Shell is a browser-based shell with the Stripe CLI pre-installed. Log in to your Stripe account and press Control + Backtick (`) on your keyboard to start managing your Stripe resources in test mode. - View supported Stripe commands: - Find webhook events: - Listen for webhook events: - Call Stripe APIs: stripe [api resource] [operation] (e.g., )
The Stripe Shell is best experienced on desktop.
$