Debiting Express and Custom accounts Public 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.

    Requirements

    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

    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 https://api.stripe.com/v1/charges \ -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: https://dashboard.stripe.com/account/apikeys 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!

    Was this page helpful?

    Feedback about this page?

    Thank you for helping improve Stripe's documentation. If you need help or have any questions, please consider contacting support.

    On this page