Skip to content

Bank Transfers Fresh

Bank transfers let customers push money to a virtual bank account number Stripe provides. You get paid when the funds arrive — Stripe automates reconciliation and protects your real account details.

Properties

PropertyValue
Presentment currenciesEUR, GBP, JPY, MXN, USD
Payment confirmationNo — delayed
Recurring paymentsYes (requires customer action each time)
Manual captureNo
Refunds / Partial refundsYes / Yes
DisputesUSD only
Connect supportYes

Supported business locations

CurrencyBusiness locations
EUR or USDAT, BE, BG, CH, CY, CZ, DE, DK, EE, ES, FI, FR, GB, GR, HR, HU, IE, IT, LI, LT, LU, LV, MC, MT, NL, NO, PL, PT, RO, SE, SI, SK, SM, US
GBPGB
JPYJP
MXNMX

Product support

ConnectCheckoutSubscriptionsInvoicingElements
YesYesYesYesYes

Not supported: Payment Links, Express Checkout Element, Mobile Payment Element, Customer Portal.

Checkout does not support bank transfers in subscription mode or setup mode.

API enum

Bank transfers use the customer_balance payment method type.

javascript
const paymentIntent = await stripe.paymentIntents.create({
  amount: 10000,
  currency: 'usd',
  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' },
    },
  },
  customer: 'cus_123',
  confirm: true,
});

Note: Bank transfers require a customer on the PaymentIntent. They do not support SetupIntents, manual capture, or setup_future_usage.

Enable via dynamic payment methods

Enable bank transfers in Dashboard → Settings → Payment Methods. When enabled, Stripe automatically displays bank transfers to eligible customers.

javascript
// Bank transfers appear automatically with a customer specified
const session = await stripe.checkout.sessions.create({
  customer: 'cus_123', // required for bank transfers in Checkout
  line_items: [{ price: 'price_1234', quantity: 1 }],
  mode: 'payment',
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
});

Customer balance

Bank transfers are held in a customer balance before reconciliation. This handles cases where customers send more or less than the expected amount.

  • Unreconciled funds held for more than 75 days: Stripe attempts to return them to the customer's bank
  • If account details unavailable after 90 days: funds sweep to your Stripe account balance

Funding instructions

Show bank account details to customers before their first payment via Dashboard or API. This allows customers to initiate the transfer from their own bank.

Retrieve sender information

Access incoming transfer details via the Cash Balance Transactions API:

bash
curl https://api.stripe.com/v1/customers/cus_xxxxxxx/cash_balance_transactions/ccsbtxn_xxxx \
  -u "sk_test_YOUR_KEY:"

Incoming transfers have type: "funded". The funded object contains sender name, reference, and transfer network.

Example response (USD):

json
{
  "id": "ccsbtxn_1Nkr8vGH59QTMK2f9CIA34L5",
  "object": "customer_cash_balance_transaction",
  "currency": "usd",
  "type": "funded",
  "funded": {
    "bank_transfer": {
      "type": "us_bank_transfer",
      "us_bank_transfer": {
        "network": "ach",
        "sender_name": "John Doe"
      },
      "reference": "REF-4242"
    }
  }
}

If network is ach, it came via ACH. If network is domestic_wire_us, it came via domestic wire.

International wires

US accounts can accept domestic and international wire transfers (SWIFT). International wire considerations:

  • Fees may be deducted before funds arrive — the amount in the customer balance reflects what Stripe received
  • Settlement takes 3-5 business days
  • Stripe does not support refunds for international wires — you're responsible for those manually
  • US accounts accept SWIFT transfers in USD only

Cross-border payments

US accounts can accept EUR payments from SEPA countries. The customer gets a virtual bank account local to their country in their local currency. Cross-border transfers incur additional fees visible in the Dashboard.

To set up cross-border: Dashboard → Customers → select customer → Payment Methods → Add (+) → Add a bank transfer account → choose currency and country.

Refunds

Refund bank transfer payments:

  • Directly to the customer's bank account
  • Back to the customer's cash balance (for use on future payments)

When bank account details aren't available, Stripe emails the customer to collect them.

Disputes

  • Bank transfers generally cannot be reversed
  • USD ACH transfers: reversible within 5 days — your bank can request a reversal with evidence
  • CAD ACH transfers: reversals are always initiated by the remitting bank

Connect

Connect platforms can use bank transfers with any charge type (direct, destination, or separate charges and transfers). The on_behalf_of attribute is not supported.

For direct charges, the connected account must have bank transfers enabled. Standard accounts can enable it from their Dashboard. For other account types, request the relevant bank transfers capability.

Stripe API Reference - Self-contained docs reference, refreshed 2026-05-18