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
| Property | Value |
|---|---|
| Presentment currencies | EUR, GBP, JPY, MXN, USD |
| Payment confirmation | No — delayed |
| Recurring payments | Yes (requires customer action each time) |
| Manual capture | No |
| Refunds / Partial refunds | Yes / Yes |
| Disputes | USD only |
| Connect support | Yes |
Supported business locations
| Currency | Business locations |
|---|---|
| EUR or USD | AT, 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 |
| GBP | GB |
| JPY | JP |
| MXN | MX |
Product support
| Connect | Checkout | Subscriptions | Invoicing | Elements |
|---|---|---|---|---|
| Yes | Yes | Yes | Yes | Yes |
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.