Debit connected accounts

Debiting Express and Custom accounts Beta

With Connect, your platform can directly debit the Stripe balance of an Express or Custom account.

At times, your platform may need to collect funds from your connected accounts:

  • To charge the connected account directly for products or services
  • To recover funds for a previous refund
  • To make other adjustments to connected account balances (e.g., to correct an error)

When using Express or Custom accounts, you can debit a connected account’s Stripe balance to credit to your platform account’s Stripe balance. This creates a Transfer on the connected account and a Payment on the platform account.


This functionality is only supported for Express and Custom. Additionally:

  • The connected account and the platform must be in the same region (i.e., both must be in Europe or in the U.S.).
  • The currency value must match the default currency of the connected account.
  • Debiting an account cannot make the connected account balance become negative unless you have reserves enabled (on by default for all new platforms created after January 31st, 2017) and have a bank account in the same currency as the debit.
  • If a connected account balance becomes negative, Stripe may auto debit the external account on file, depending on what country the connected account is in.

To allow for the most seamless experience, we strongly recommend verifying the connected account’s bank before using Account Debits.

Charging a connected account

The create a charge API call supports providing a connected account ID as the source value:

curl \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d amount=1500 \ -d currency=usd \ -d source="{{CONNECTED_STRIPE_ACCOUNT_ID}}"
charge = Stripe::Charge.create({ amount: 1500, currency: 'usd', source: '{{CONNECTED_STRIPE_ACCOUNT_ID}}', })
charge = stripe.Charge.create( amount=1500, currency='usd', source='{{CONNECTED_STRIPE_ACCOUNT_ID}}' )
$charge = \Stripe\Charge::create([ 'amount' => 1500, 'currency' => 'usd', 'source' => '{{CONNECTED_STRIPE_ACCOUNT_ID}}' ]);
ChargeCreateParams params = ChargeCreateParams.builder() .setAmount(1500L) .setCurrency("usd") .setSource("{{CONNECTED_STRIPE_ACCOUNT_ID}}") .build(); Charge charge = Charge.create(params);
const charge = await stripe.charges.create({ amount: 1500, currency: "usd", source: "{{CONNECTED_STRIPE_ACCOUNT_ID}}" });
params := &stripe.ChargeParams{ Amount: stripe.Int64(1500), Currency: stripe.String(string(stripe.CurrencyUSD)), } params.SetSource("{{CONNECTED_STRIPE_ACCOUNT_ID}}") ch, _ := charge.New(params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new ChargeCreateOptions { Amount = 1500, Currency = "usd", Source = "{{CONNECTED_STRIPE_ACCOUNT_ID}}", }; var chargeService = new ChargeService(); var charge = chargeService.Create(options);

The API call returns the Payment created on the platform account (note: it does not return a Charge).

This approach is appropriate for platforms that charge their connected accounts for goods and services (i.e., for using the platform). For example, a platform can charge its connected accounts for additional fees or services through their Stripe balance, minimizing any need to collect an additional payment method and allowing for nearly instant availability of the funds.

Further reading

Discover what other Connect functionality is available!