Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Developer tools
Get started
Payments
Finance automation
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Overview
About Stripe payments
Upgrade your integration
Payments analytics
Online payments
OverviewFind your use caseManaged Payments
Use Payment Links
Build a checkout page
Build an advanced integration
Build an in-app integration
Payment methods
Add payment methods
    Overview
    Payment method integration options
    Manage default payment methods in the Dashboard
    Payment method types
    Cards
    Pay with Stripe balance
    Bank debits
    Bank redirects
    Bank transfers
      Accept a payment
      Customer balance
        Reconciliation
        Funding instructions
        Virtual bank account numbers
        Migrating from ACH Credit Transfer Sources
          Migrate with Invoicing or Billing
          Migrate from the Sources API
          Migrate your Standard Connect integration
          Automatic migration to Bank Transfers
      Refunds
    Credit transfers (Sources)
    Buy now, pay later
    Real-time payments
    Vouchers
    Wallets
    Enable local payment methods by country
    Custom payment methods
Manage payment methods
Faster checkout with Link
Payment interfaces
Payment Links
Checkout
Web Elements
In-app Elements
Payment scenarios
Custom payment flows
Flexible acquiring
Orchestration
In-person payments
Terminal
Other Stripe products
Financial Connections
Crypto
Climate
HomePaymentsAdd payment methodsBank transfersCustomer balanceMigrating from ACH Credit Transfer Sources

Automatic migration to Bank Transfers

Learn what changes you can expect when Bank Transfers replace ACH Credit Transfers.

Copy page

Warning

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.

For information about migrating to USD Bank Transfer supported by the current APIs, refer to the documentation below.

Stripe is replacing the ACH Credit Transfers payment method with Bank Transfers. As part of the Sources API deprecation, Stripe is replacing the ACH Credit Transfers payment method with Bank Transfers, so you won’t be able to use ACH Credit Transfers in your workflows moving forward. This migration occurs automatically for accounts processing ACH Credit Transfers through invoices or subscriptions.

You might need to adjust your integration if:

  • Your setup includes webhook endpoints listening for source.transaction.created, source.chargeable, source.refund_attributes_required, or customer.source.created events. Learn more about changes to webhooks.
  • You use the Billing API and depend on ACH Credit Transfer source objects. Learn more about changes to the API.

Otherwise, you don’t need to take any action, and the migration won’t disrupt your operations or those of your customers.

During the migration to Bank Transfers:

  • There won’t be any change to the bank account information that your customers currently use to send credit transfers.
  • The automatic migration appears seamless from your customer’s perspective. The structure of the hosted invoice page or PDF that you currently share with your customer won’t change.
  • Existing open invoices and subscriptions with ACH Credit Transfer as an enabled payment method update to present Bank Transfers instead.

Bank Transfer improvements

Bank Transfers allow you to:

  • Reconcile multiple invoices: You can reconcile multiple invoices with a single transfer using our reconciliation algorithm, allowing your customers to pay batches of invoices with one bank transfer. You can also use manual reconciliation mode, configurable at an account or customer level.
  • Use an enhanced refund process: This includes a customer refund email outreach flow with a UI that allows your customers to enter their bank account details for refunds.
  • Use a sandbox: You can simulate bank transfer fundings in a sandbox to test edge cases of overfunding or underfunding, and fundings associated with specific banking rails such as ACH, Fedwire, or SWIFT.
  • Generate a self-serve VBAN ownership letter: You can generate a self-serve VBAN ownership letter for your customers through the Dashboard.
  • Add the USD Cash Balance payment method: Stripe removes and replaces the ACH Credit Transfer payment method linked to your customers with the USD Cash Balance payment method.

Dashboard changes

Invoice page

Access the Invoice page through dashboard.stripe.com/invoices/:id.

BeforeAfter
Enabled payment methods on an ACH CT finalized invoice
Enabled payment methods on an US BT finalized invoice

Subscription page

Access the Subscription page through dashboard.stripe.com/subscriptions/:id.

BeforeAfter
Enabled payment methods on an active ACH CT subscription
Enabled payment methods on an active US BT subscription

Stripe removes and replaces the ACH Credit Transfer payment method linked to your customers with the USD Cash Balance payment method. If your customer has unreconciled funds in their ACH Credit Transfer payment method, those funds move to their cash balance. You’ll no longer have the ability to use the ACH Credit Transfer payment method for any operation. This change appears in the Payment methods section of the Customer page.

Customer page

Access the Customer page through dashboard.stripe.com/customers/:id.

BeforeAfter
Customer payment methods include an ACH CT Source
Customer payment methods include an cash balance

Payment method view

Access the Payment method view through dashboard.stripe.com/sources/:id for ACH credit transfers and dashboard.stripe.com/customers/:id/cash_balance_transactions/usd for Bank Transfers.

BeforeAfter
Source pageSource object view
Customer cash balance pageView balance details page

Balance details view

The Balance details view for a customer offers a comprehensive overview of all bank transfer data associated with that customer:

  • Shows the customer’s bank account information.
  • Lists all transactions applied to the customer’s cash balance.
  • Records all bank transfer refunds.
  • Allows you to download a PDF letter confirming the ownership of the bank account that you share with the customer. We encourage you to share this PDF with your customers if they request it.

Charge invoices

If you’re manually charging invoices through the Dashboard, you can continue doing so using the same Charge customer button on dashboard.stripe.com/invoices/:id:

Manually charge invoice

In the Charge customer dialog, select Cash Balance instead of ACH Credit Transfer:

BeforeAfter
Manually charge invoice with ACH CT modal
Manually charge invoice with US BT modal

Note

You can charge old ACH credit transfer invoices using the Cash Balance if they don’t have bank transfer as an enabled payment method.

ACH Credit Transfer settings

If you currently set ACH Credit Transfer as enabled by default for all your invoices, you see a change in your account’s invoice settings under Default payment terms:

Invoice template settings

Because Bank Transfers have automatically been enabled in your invoice settings, all new invoices generated on your account (either manually or through existing or new subscriptions) will enable Bank Transfers by default.

If ACH Credit Transfer is currently disabled (meaning, it’s not included by default on all your invoices), Stripe doesn’t update your account’s invoice settings.

Reconciliation

Overall, the reconciliation logic of Bank Transfers aligns with Credit Transfers when a transfer reaches Stripe:

  • First, it attempts to match the bank transfer reference with the invoice number.
  • If that doesn’t work, it then tries to match the transfer amount with the amount of the customer’s open invoices.
  • If there’s no exact amount match, the algorithm funds as many invoices as possible in full, prioritizing the oldest finalized invoices first.

However, there’s a slight difference in the detailed logic of the step where Stripe matches by exact amount:

  • In ACH Credit Transfer, Stripe attempts to match only one invoice by the exact amount.
  • With Bank Transfers, Stripe searches for a group of 1-5 invoices that total the exact amount the user sent. Stripe then sorts those groups based on their size and finalization date, enabling your customers to batch pay multiple invoices with the same transfer.

Learn more about how Bank Transfers reconciliation works.

Refunds

Overall, the refund logic of Bank Transfers aligns with ACH Credit Transfers:

  1. You issue a credit or bank transfer invoice to your customer.
  2. Your customer sends a transfer to the specified bank account.
  3. The transfer reaches Stripe and gets reconciled to the open invoice. The invoice status changes to paid.
  4. You issue a refund for the payment related to that invoice.
  5. The customer receives an email prompting them to enter their bank account details for the refund.
  6. Stripe processes the refund to the provided bank account.

You can process refunds using the same interface you currently use. Learn more about refunding a customer.

You can send the refunded funds to the cash balance instead of sending them to the customer’s bank account. This allows you to use those funds for the customer’s future invoices:

Refund to customer cash balance

We have also updated the user interface that your customers use to enter their bank account details in response to the email outreach:

BeforeAfter
ACH CT refund email
US BT refund email

Learn more about bank transfer refunds.

Unreconciled funds

Similar to ACH Credit Transfers, Bank Transfers can manage cases of over-funding. In the deprecated product, the remaining funds are stored in the Source object, but in Bank Transfers, unreconciled funds go to the customer’s cash balance. In both situations, you can either capture those funds by creating a payment or choose to return them to the sender. If the unreconciled funds remain unclaimed for a certain period, Stripe performs specific actions to address it.

FunctionalityBeforeAfter
Storage of unreconciled fundsSource objectCustomer cash balance
Inspect unreconciled funds
Uncharged sources pagedashboard.stripe.com/uncharged_sources
Unreconciled customer balances pageRemaining Balances tab ofdashboard.stripe.com/customers
Take action on unreconciled funds
Actioning uncharged sourcedashboard.stripe.com/uncharged_sources
Actioning unreconciled customer balancedashboard.stripe.com/customers
Failing to timely action unreconciled fundsIf an unreconciled funding remains at the Source for more than 45 days, it automatically sweeps to your account balance. The sweeping process is executed on a monthly basis (on the 15th of each month) and sweeps fundings that are older than 45 days. Hence, a funding can remain un-actioned in the source from 45 to 60 days.An unreconciled funding can remain un-actioned in the cash balance of a customer for 75 days. At that point, Stripe attempts to automatically refund the funds back to the customer. If the refund to your customer fails (for example, if the customer doesn’t enter their bank information following the email outreach), Stripe leaves the funds in the cash balance for another 15 days. At the 90-day mark, Stripe sweeps the unreconciled funding to your Stripe account balance.

Learn more about how unreconciled funds are handled in Bank Transfers.

Webhooks

Note

Skip this section if you haven’t configured webhook endpoints listening for source.transaction.created, source.chargeable, source.refund_attributes_required, or customer.source.created events. See what endpoints you’ve configured in the Dashboard.

After your account automatically migrates to Bank Transfers, the following webhook events related to ACH Credit Transfer stop:

  • source.transaction.created
  • source.chargeable
  • customer.source.created
  • source.refund_attributes_required

Verify that the suspension of ACH Credit Transfer webhook events won’t impact your workflows. If your integration depends on these events (for example, a plugin or app installed on your Stripe account might be listening for them), contact us.

Changes with the Billing API

Note

Skip this section if you don’t integrate with the Stripe API for Billing.

The Invoice objects created as part of your Billing API integration start referencing customer_balance (the payment method type of Bank Transfers) instead of ach_credit_transfer.

To create an invoice, send the following request:

Command Line
cURL
curl https://api.stripe.com/v1/invoices \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d customer=
{{CUSTOMER_ID}}
\ -d currency=usd \ -d collection_method=send_invoice \ -d days_until_due=30

To finalize an invoice, send the following request:

Command Line
cURL
curl https://api.stripe.com/v1/invoices/
{{INVOICE_ID}}
/finalize
\ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d "expand[]"=payment_intent

Here’s the finalized Invoice object:

{ "id": "{{INVOICE_ID}}", "object": "invoice", "payment_intent": { "object": "payment_intent", "id": "{{PAYMENT_INTENT_ID}}", "payment_method_types": [ "ach_credit_transfer", "customer_balance" ] } }

If you create Invoice and Subscription objects by explicitly including ach_credit_transfer in the payment_settings.payment_method_types array parameter, your integration still functions properly and you can continue to pass ach_credit_transfer as part of your request. However, Stripe adjusts your request, and the Invoice and Subscription objects you created list customer_balance instead of ach_credit_transfer:

Command Line
cURL
curl https://api.stripe.com/v1/invoices \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d customer=
{{CUSTOMER_ID}}
\ -d currency=usd \ -d collection_method=send_invoice \ -d days_until_due=30 \ -d "payment_settings[payment_method_types][]"=ach_credit_transfer \ -d "payment_settings[payment_method_types][]"=card

Here’s the finalized Invoice and PaymentIntent objects:

{ "id": "{{INVOICE_ID}}", "object": "invoice", "payment_settings": { "payment_method_types": [ "ach_credit_transfer", "card", "customer_balance" ] }, "payment_intent": { "object": "payment_intent", "id": "{{PAYMENT_INTENT_ID}}", "payment_method_types": [ "ach_credit_transfer", "customer_balance" ] } }

Stripe also updates historical Subscription objects in your account that you created with ach_credit_transfer included in the payment_settings.payment_method_types array parameter. The payment_settings.payment_method_types array of your existing Subscription objects updates to include customer_balance instead of ach_credit_transfer.

If your API integration relies on ach_credit_transfer being present in any of the following API response fields, contact us because the automatic migration might disrupt your integration:

  • The Invoice object’s payment_settings.payment_method_types
  • The Subscription object’s payment_settings.payment_method_types
  • The Payment Intent object’s payment_method_types

The ACH Credit Transfer Source objects detach from your customers. This means that if you depend on the Customer.default_source field being present, you might find that it starts returning as null instead of the src_ ID of the ACH Credit Transfer source previously attached to the customer.

Opt out

To exclude your account from the automatic migration, contact us. We’ll provide you with a deadline to manually migrate your account to Bank Transfers. You won’t be able to continue using the deprecated ACH Credit Transfer product.

Was this page helpful?
YesNo
Need help? Contact Support.
Join our early access program.
Check out our changelog.
Questions? Contact Sales.
LLM? Read llms.txt.
Powered by Markdoc