# Migrating your Standard Connect integration to USD Bank Transfers Learn how to migrate your ACH Credit Transfer Standard Connect integration to USD Bank Transfers. > We deprecated the Sources API and plan to remove support for local payment methods. If you currently integrate with ACH Credit Transfers, you must [migrate to the Payment Methods API](https://docs.stripe.com/payments/payment-methods/transitioning.md). > > For information about migrating to USD Bank Transfer supported by the current APIs, refer to the documentation below. ## Reasons to migrate If your Connect platform integrates with Standard connected accounts using ACH Credit Transfers, you can migrate to USD Bank Transfers. USD Bank Transfers enables your connected accounts to benefit from the most up-to-date bank transfer processes. To learn more about the improvements we added to the USD Bank Transfers product, see [Migrating from Sources-based Credit Transfers](https://docs.stripe.com/payments/customer-balance/migrating-from-sources.md). ### Impact of not migrating If you don’t migrate to Bank Transfers, you can continue to use the *legacy* (Technology that's no longer recommended) ACH Credit Transfer product. Legacy means we won’t add new functionality to the ACH Credit Transfer going forward. To stay up to date, we recommend integrating with USD Bank Transfers instead. If you don’t migrate to Bank Transfers, Stripe prevents your connected accounts from having compatibility issues: - Users who are currently connected to your platform won’t be able to request access to Bank Transfers through the Dashboard. - Users who’ve used Bank Transfers with one or more customers won’t be able to connect to your Stripe platform. Stripe will remove these restrictions from your platform after your integration is ready to accept Bank Transfer payments. ### Impact on the ACH Credit Transfers customers of your connected accounts If you migrate, Stripe keeps the same bank account information for the customers of your connected accounts, which streamlines the process for them. If you don’t migrate, your connected account’s customers can still send funds using the legacy ACH Credit Transfer product. ## Before you begin - To confirm if you’re using the legacy ACH Credit Transfers product, see the applicable **Before you begin** sections for: - [Migrate from the Sources API](https://docs.stripe.com/payments/customer-balance/direct-sources-migration.md) - [Migrate with invoicing or Billing](https://docs.stripe.com/payments/customer-balance/invoicing-migration.md) - To confirm that you’re currently using Connect with Standard connected accounts, go to the [Connected accounts](https://dashboard.stripe.com/connect/accounts) page and filter by account type. If your live mode account list includes Standard accounts with status **Enabled**, then you’re using Standard Connect. - To confirm that you’re using [direct charges](https://docs.stripe.com/connect/charges.md#direct) on Standard Connect, verify the following: - If you’re using the API to create charges, the request includes the connected account ID as part of the `Stripe-Account` header. - You create charges on the connected account rather than your Stripe account. - The funds from these charges (minus Stripe’s fees) are directly available in the connected account’s balance. - If you’re not using ACH Credit Transfers with direct charges for Standard connected accounts, this guide doesn’t apply to you. If you’re using ACH Credit Transfers in other Connect configurations, see [Migrating from Sources-based Credit Transfers](https://docs.stripe.com/payments/customer-balance/migrating-from-sources.md). ## Migrate to Bank Transfers integration Use this guide to build a Bank Transfers integration alongside your existing ACH Credit Transfer integration. Use the new integration to migrate all the existing ACH Credit Transfer customers of your connected accounts to the new payment method. ## Create a test Standard connected account [Create a Standard connected account](https://docs.stripe.com/connect/standard-accounts.md#create-account) in a sandbox for the purpose of testing the new integration. ## Build a Bank Transfers integration #### Sources API 1. Create a test customer: ```curl curl https://api.stripe.com/v1/customers \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d name="Jenny Rosen" \ --data-urlencode email="jenny.rosen@example.com" ``` 1. Create an ACH Credit Transfer source and attach it to the customer Complete the steps in the integration guide of [ACH Credit Transfer](https://docs.stripe.com/sources/ach-credit-transfer.md). Make sure to pass the `Stripe-Account` header in the API requests that create and attach the source to the customer. Save the bank details of the Source from the `ach_credit_transfer` field of the object to refer to later. 1. Create and confirm a PaymentIntent At this point, you’re able to create and confirm a bank transfers PaymentIntent on the customer object of the connected account [following the respective step in the Accept a payment guide](https://docs.stripe.com/payments/bank-transfers/accept-a-payment.md?payment-ui=direct-api#web-create-and-confirm-payment-intent). The `Stripe-Account` header must be passed to create the PaymentIntent on the customer of the connected account. Creating a `customer_balance` PaymentIntent in a sandbox always succeeds. However, in live mode [direct charges](https://docs.stripe.com/connect/direct-charges.md) require the connected account itself (not the platform) to have activated Bank Transfers. Hence, before creating the PaymentIntent on the connected account, the platform must use the [bank_transfer_payments capability](https://docs.stripe.com/connect/account-capabilities.md#payment-methods) to determine whether this is the case. If Bank Transfers isn’t activated, your integration logic could fall back to the legacy ACH Credit Transfer payment method. ```python import stripe stripe.api_key = "<>" def funding_instructions(connected_account: str, customer: stripe.Customer) -> dict: bank_transfer_payments_capability = stripe.Account.retrieve_capability( connected_account, "us_bank_transfer_payments", ) if bank_transfer_payments_capability["status"] == "active": pi = stripe.PaymentIntent.create( stripe_account=connected_account, amount=1099, currency="usd", customer=customer["id"], payment_method_types=["customer_balance"], payment_method_data={ "type": "customer_balance", }, payment_method_options={ "customer_balance": { "funding_type": "bank_transfer", "bank_transfer": { "type": "us_bank_transfer", }, }, }, confirm=True, ) return pi.next_action["display_bank_transfer_instructions"] else: source = stripe.Source.retrieve( stripe_account=connected_account, id=customer["default_source"] ) return source["ach_credit_transfer"] ``` 1. Confirm that the integration works After you [test and confirm that the integration works](https://docs.stripe.com/payments/bank-transfers/accept-a-payment.md?payment-ui=direct-api#test-your-integration), check if the bank details of the Credit Transfer Source have been migrated. Navigate to the customer details page in the Dashboard, and then expand Cash balance. The bank details of the Cash balance should match the ones obtained from the Source in Step 2. The customer of the connected account has been successfully migrated. #### Invoicing or Billing API 1. Create a test customer: ```curl curl https://api.stripe.com/v1/customers \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d name="Jenny Rosen" \ --data-urlencode email="jenny.rosen@example.com" ``` 1. Create a Credit Transfer invoice or subscription for the customer above by explicitly passing the `ach_credit_transfer` payment method type ```curl curl https://api.stripe.com/v1/invoiceitems \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d amount=1234 \ -d currency=usd \ -d customer="$CUSTOMER_ID" \ -d description="Professional services" ``` ```curl curl https://api.stripe.com/v1/invoices \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d customer="$CUSTOMER_ID" \ -d "payment_settings[payment_method_types][]"=ach_credit_transfer \ -d collection_method=send_invoice ``` ```curl curl -X POST https://api.stripe.com/v1/invoices/$INVOICE_ID/finalize \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" ``` Or for the Subscriptions API: ```curl curl https://api.stripe.com/v1/prices \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d unit_amount=1234 \ -d currency=usd \ -d "recurring[interval]"=month \ -d "product_data[name]"=shoes ``` ```curl curl https://api.stripe.com/v1/subscriptions \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d customer="$CUSTOMER_ID" \ -d "items[0][price]"="$PRICE_ID" \ -d collection_method=send_invoice \ -d days_until_due=30 \ -d "payment_settings[payment_method_types][0]"=ach_credit_transfer ``` If testing Subscriptions, you must wait for the subscription to generate and finalize its first invoice. Use [Billing test-clocks](https://docs.stripe.com/billing/testing/test-clocks.md) to speed up this process. View the PDF or Hosted Invoice Page of the invoice. Make note of the customer’s Credit Transfer bank details to refer to later. 1. Create an Invoice or Subscription At this point, you can create a bank transfers Invoice or Subscription on the customer object of the connected account, following the [Invoicing](https://docs.stripe.com/invoicing/bank-transfer.md) or [Subscriptions](https://docs.stripe.com/billing/subscriptions/bank-transfer.md) guide. Make sure to pass the `Stripe-Account` header to create the objects on the customer of the connected account. Creating a `customer_balance` Invoice or Subscription in a testing environment always succeeds. However, in live mode, [direct charges](https://docs.stripe.com/connect/direct-charges.md) require the connected account itself (not the platform) to activate Bank Transfers. Before you create the Invoice or Subscription on the connected account, the platform must use the [us_bank_transfer_payments capability](https://docs.stripe.com/connect/account-capabilities.md#payment-methods) to determine whether Bank Transfers is activated. If it isn’t activated, your integration logic might fall back to the legacy ACH Credit Transfer payment method. ```python import stripe stripe.api_key = "<>" def create_invoice(connected_account: str, customer: stripe.Customer) -> stripe.Invoice: bank_transfer_payments_capability = stripe.Account.retrieve_capability( connected_account, "us_bank_transfer_payments", ) if bank_transfer_payments_capability["status"] == "active": return stripe.Invoice.create( stripe_account=connected_account, customer=customer["id"], payment_settings={"payment_method_types": ["customer_balance"]}, collection_method="send_invoice", days_until_due=30, ) else: return stripe.Invoice.create( stripe_account=connected_account, customer=customer["id"], payment_settings={"payment_method_types": ["ach_credit_transfer"]}, collection_method="send_invoice", days_until_due=30, ) ``` Or for Subscriptions: ```python import stripe stripe.api_key = "<>" def create_subscription( connected_account: str, customer: stripe.Customer, price: stripe.Price ) -> stripe.Subscription: bank_transfer_payments_capability = stripe.Account.retrieve_capability( connected_account, "us_bank_transfer_payments", ) if bank_transfer_payments_capability["status"] == "active": return stripe.Subscription.create( stripe_account=connected_account, customer=customer["id"], items=[ { "price": price["id"], } ], collection_method="send_invoice", days_until_due=30, payment_settings={ "payment_method_types": ["customer_balance"], }, ) else: return stripe.Subscription.create( stripe_account=connected_account, customer=customer["id"], items=[ { "price": price["id"], } ], collection_method="send_invoice", days_until_due=30, payment_settings={ "payment_method_types": ["ach_credit_transfer"], }, ) ``` 1. Confirm that the integration works After you [test and confirm that the integration works](https://docs.stripe.com/payments/bank-transfers/accept-a-payment.md?payment-ui=direct-api#test-your-integration) with the test customer, open the PDF or Hosted Invoice Page of the bank transfer invoice. Confirm the bank transfer bank details match the Credit Transfer bank details obtained in Step 2. The customer of the connected account has been successfully migrated. ## Contact Stripe After you’ve built, tested, and deployed your integration to production, and have successfully served live traffic, **please [reach out to Stripe](mailto:usd-bank-transfers-connect-platforms@stripe.com) to let us know that your integration is compatible with Bank Transfers**. We’ll make sure that your integration is working as expected and lift the restrictions imposed on your connected accounts. We’ll also activate Bank Transfers for all your connected accounts, which allows you to completely stop supporting the *legacy* (Technology that's no longer recommended) payment method. ## See also - [Migrating from Sources-based Credit Transfers](https://docs.stripe.com/payments/customer-balance/migrating-from-sources.md)