Debiting Managed Accounts US-only Preview

    Connect supports the availability for your platform to debit the Stripe balance of a managed account. This feature is currently in Private Beta. 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 the platform account. Common uses include:

    • Charging the connected account directly for products or services
    • Recovering funds for a previous refund or chargeback
    • Making other adjustments to connected account balances (e.g., to correct an error)

    Stripe supports two approaches for debiting a connected account to credit your platform account. 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 US. 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
    • The Managed Account account needs to use manual transfers

    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 near 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).

    Further reading

    Discover what other Connect functionality is available!