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

Migrating to new APIs

Migrate from Stripe's legacy integration or from another processor with a few additional steps.

The ACH Direct Debit payment method allows you to use bank accounts collected with Stripe’s older Bank Accounts API or migrate verified bank accounts from another payment processor to use with the Payment Intents API.

Compatibility with the Bank Accounts API

If you have previously collected customer payment details with Stripe using the Bank Accounts API, you can start using the Payment Intents API immediately without migrating any payment information for ACH Direct Debit. Using customer bank accounts with PaymentIntents is a two-step process:

  1. Create a payment with a verified bank account.
  2. Collect authorization to debit the customer’s bank account via a mandate.

Create a PaymentIntent with a Bank Account

Bank Accounts that are already verified and have been attached to a Customer are usable in any API that accepts a PaymentMethod object. You can use a saved BankAccount as a PaymentMethod when creating a PaymentIntent.

Command Line
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:
\ -d "amount"=1099 \ -d "currency"="usd" \ -d "customer"="{{CUSTOMER_ID}}" \ -d "payment_method_types[]"="us_bank_account" \ -d "payment_method"="{{BANK_ACCOUNT_ID}}"

Similarly, you can use a saved BankAccount as a PaymentMethod when creating a SetupIntent.

Command Line
curl https://api.stripe.com/v1/setup_intents \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:
\ -d "payment_method_types[]"="us_bank_account" \ -d "customer"="{{CUSTOMER_ID}}" \ -d "payment_method"="{{BANK_ACCOUNT_ID}}"

Collect mandate acknowledgement

Confirming a PaymentIntent or SetupIntent requires having your customer authorize a mandate to debit the account.

In some cases, you might have pre-authorization from your customer from an earlier purchase or SetupIntent that you can use to create an off-session payment. For example:

  • If you previously collected an online mandate from the customer, you might have a timestamp, an IP address, or user agent information for them. You can use that information to create a mandate object.
  • If you previously collected payment and mandate information offline (on the phone or in person), you can create a mandate with offline acceptance.

To create an off-session payment, you can use offline mandate acceptance to provide a record of your customer’s original authorization.

Authorization is only required the first time you use a BankAccount object with the PaymentIntents API. After that, you can use the BankAccount object as a PaymentMethod to accept future payments.

Command Line
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:
\ -d "mandate_data[customer_acceptance][type]"="offline" \ -d "mandate_data[customer_acceptance][accepted_at]"="{{ACCEPTANCE_TIMESTAMP}}"

Retrieving a BankAccount as a PaymentMethod

You can retrieve saved BankAccounts through the Payment Methods API.

Command Line
curl https://api.stripe.com/v1/payment_methods/ba_1IsleZ2eZvKYlo2CI3To1g72 \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:

When using a BankAccount as a PaymentMethod, no new objects are created. The Payment Methods API simply provides a different view of the same underlying object.

{ "id": "ba_1IsleZ2eZvKYlo2CI3To1g72", "object": "payment_method", "billing_details": { "address": { "city": null, "country": null, "line1": null, "line2": null, "postal_code": null, "state": null }, "email": null, "name": "Jenny Rosen", "phone": null }, "us_bank_account": { "last4": "6789", "routing_number": "110000000", "fingerprint": "1JWtPxqbdX5Gamtc", "account_holder_type": "individual", "bank_name": "STRIPE TEST BANK", }, "created": 123456789, "customer": "cus_CY5bH92D99f4mn", "livemode": false, "metadata": {}, "type": "us_bank_account" }

Migrating bank accounts from another payment processor

If you have a store of saved bank accounts that you verified and used to process ACH Direct Debit payments on another processor, you can migrate them to Stripe to begin accepting payments.

Both your business and Stripe are responsible for maintaining proof of authorization to debit, as well as proof of bank account verification. Please contact us with details, including:

  • How your business collects authorization from customers.
  • How your business verifies customer bank accounts.

Stripe can temporarily give you the ability to skip bank account verification. Request this temporary capability from Stripe Support. Once enabled, process each bank account and create a SetupIntent for each.

Create a new Customer object or retrieve an existing one to associate with this bank account.

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

Then create and confirm a SetupIntent with your saved bank account details and the date of your customer’s original authorization to debit the account.

Command Line
curl https://api.stripe.com/v1/setup_intents \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d "payment_method_types[]"=us_bank_account \ -d customer={{CUSTOMER_ID}} \ -d confirm=true \ -d "payment_method_options[us_bank_account][verification_method]"=skip \ -d "payment_method_data[type]"=us_bank_account \ -d "payment_method_data[billing_details][name]"={{ACCOUNT_HOLDER_NAME}} \ -d "payment_method_data[billing_details][routing_number]"={{ROUTING_NUMBER}} \ -d "payment_method_data[billing_details][account_number]"={{ACCOUNT_NUMBER}} \ -d "payment_method_data[billing_details][account_holder_type]"=individual \ -d "mandate_data[customer_acceptance][type]"=offline \ -d "mandate_data[customer_acceptance][accepted_at]"=1692821946

Retrieve and store the PaymentMethod ID from the response to use for future payments. You can also retrieve it by listing all PaymentMethods for the customer.

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
Compatibility with the Bank Accounts API
Migrating bank accounts from another payment processor
Products Used
Payments
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.
$