Debiting Managed Accounts U.S.-only Preview

    With Connect, your platform can directly debit the Stripe balance of a Managed Account. This feature is currently in U.S.-only Preview. Please contact our sales team to learn more about the feature and pricing.

    At times, your platform might need to transfer funds from its connected accounts to your platform account:

    • 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 Managed Accounts, you can debit a connected account’s Stripe balance to credit to your platform account’s Stripe balance. Stripe supports two approaches for doing so:

    Both approaches create the same flow of funds: a Transfer is created on the Managed Account and a Payment is created on the platform account.

    Requirements

    This functionality is only supported for Managed Accounts in the U.S. Additionally:

    • The currency value must match the default currency of your platform account
    • An account debit cannot make the Managed Account balance become negative unless you have reserves enabled (on by default for all new platforms created after January 31st)
    • The Managed Account must be verified with at least a name and date of birth

    Charging a Managed Account

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

    curl https://api.stripe.com/v1/charges \
       -u sk_test_BQokikJOvBiI2HlWgH4olfQ2: \
       -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(array(
      "amount"   => 1500,
      "currency" => "usd",
      "source" => "{CONNECTED_STRIPE_ACCOUNT_ID}"
      ));
    
    Map<String, Object> otherChargeParams = new HashMap<String, Object>();
    otherChargeParams.put("amount", 1500);
    otherChargeParams.put("currency", "usd");
    otherChargeParams.put("source", "{CONNECTED_STRIPE_ACCOUNT_ID}");
    
    Charge.create(otherChargeParams);
    
    stripe.charges.create({
      amount: 1500,
      currency: "usd",
      source: "{CONNECTED_STRIPE_ACCOUNT_ID}"
    });
    

    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 Managed Accounts for goods and services (i.e., for using the platform). For example, a platform can charge its connected accounts for their subscriptions directly through their Stripe balance, minimizing any need to collect an additional payment method and allowing for nearly instant availability of the funds. To help keep track of this additional revenue source, Stripe makes sure this revenue is appropriately added to the right tax forms (e.g., 1099).

    Transferring from a Managed Account

    The second method for debiting a connected account is to make a transfer from the connected account to your platform account. Use the Stripe-Account header to authenticate as the connected account and provide your platform’s Stripe account ID as the destination:

    curl https://api.stripe.com/v1/transfers \
       -u sk_test_BQokikJOvBiI2HlWgH4olfQ2: \
       -H "Stripe-Account: {CONNECTED_STRIPE_ACCOUNT_ID}" \
       -d amount=1500 \
       -d currency=usd \
       -d destination="{PLATFORM_STRIPE_ACCOUNT_ID}"
    
    Stripe::Transfer.create(
      {
        :amount => 1000,
        :currency => "usd",
        :destination => "{PLATFORM_STRIPE_ACCOUNT_ID}"
      },
      {:stripe_account => "{CONNECTED_STRIPE_ACCOUNT_ID}"}
    )
    
    stripe.Transfer.create(
      amount=1000,
      currency="usd",
      destination="{PLATFORM_STRIPE_ACCOUNT_ID}",
      stripe_account="{CONNECTED_STRIPE_ACCOUNT_ID}"
    )
    
    \Stripe\Transfer::create(
      array(
        "amount" => 1000,
        "currency" => "usd",
        "destination" => "{PLATFORM_STRIPE_ACCOUNT_ID}"
      ),
      array("stripe_account" => "{CONNECTED_STRIPE_ACCOUNT_ID}")
    );
    
    RequestOptions requestOptions = RequestOptions.builder().setStripeAccount("{CONNECTED_STRIPE_ACCOUNT_ID}").build();
    
    Map<String, Object> transferParams = new HashMap<String, Object>();
    transferParams.put("amount", 1000);
    transferParams.put("currency", "usd");
    transferParams.put("destination", "{PLATFORM_STRIPE_ACCOUNT_ID}");
    
    Transfer.create(transferParams, requestOptions);
    
    stripe.transfers.create(
      {
        amount: 1000,
        currency: "usd",
        destination: "{PLATFORM_STRIPE_ACCOUNT_ID}"
      },
      {stripe_account: "{CONNECTED_STRIPE_ACCOUNT_ID}"}
    );
    

    This API call returns the Transfer created on the Managed Account.

    This approach is best for making adjustments within a platform (e.g., correcting a mispayment or recovering fees). Account debits created as transfers are not reported as revenue (i.e., do not appear on a 1099 tax form).

    Note that you do need your platform’s Stripe account ID to perform this request. If you don’t know that value already, perform a retrieve account API call using your platform’s API key.

    Further reading

    Discover what other Connect functionality is available!