Skip to content
Sign in
An image of the Stripe logo
Create account
Sign in
Home
Payments
Finance automation
Banking as a service
Developer tools
No-code
All products
Home
Payments
Finance automation
Home
Payments
Finance automation
Banking as a service
Developer tools
Overview
Online payments
In-person payments
Multiparty payments
    Overview
    Get started
    Collect payments then pay out
    Enable other businesses to accept payments directly
    Pay out money
    Explore Connect
    Onboard your accounts
    Choose your account type
    Standard
    Express
    Custom
    Service agreement types
    Payment methods
    Account capabilities
    Additional Verifications
    Update verified info
    Connect embedded components
    Quickstart
    Get started with Connect embedded components
    Accept payments
    Create a charge
      Direct charges
      Destination charges
      Separate charges and transfers
    Create a payments page
    Create payment links with Connect
    Connect integration guide
    Automatic payment methods
    Set statement descriptors
    Connect platforms using the Payment Methods API
    Create subscriptions
    Create invoices
    Debit Express and Custom connected accounts
    Pay out
    Set bank and debit card payouts
    Bank accounts
    Manage payout schedule
    Manual payouts
    Payout reversals
    Instant Payouts
    Cross-border payouts
    Crypto payouts
    Manage funds
    Add money to your platform balance
    Account balance
    Handle multiple currencies
    Manage accounts
    Best practices
    Listen for updates
    Dashboard account management
    Understanding risk offerings
    Platform controls for Standard accounts
    Make API calls for connected accounts
    Set MCCs
    Testing
    Payment Method Configurations API
    Migrate to Payment Method Configurations API
    Manage tax forms
    Overview
    Get started with tax reporting
    1099 Tax Support and Communication Guide
    Tax form settings
    Calculation methods
    File tax forms
    File tax forms with states
    Identify forms with missing information
    Update tax forms
    Deliver tax forms
    E-delivery for 1099 tax forms
    Correct tax forms
    Split tax forms
    Tax year changeover
    What's new for tax year 2022
After the payment
Add payment methods
Fraud detection
Payment Links
Stripe Checkout UI
Stripe Elements UI
Financial Connections
Crypto
Identity
Climate
About the APIs
Regulation support
Implementation guides
Testing
Connect
·
HomePaymentsMultiparty paymentsCreate a charge

Creating separate charges and transfers

With Connect, you can make charges on your platform account on behalf of connected accounts, perform transfers separately, and retain funds in the process.

Separate charges and transfers are recommended for Express or Custom accounts where you collect charges that can be a different amount than what’s paid out to your connected accounts. The platform is responsible for Stripe fees, refunds, and chargebacks. For more information about the different types of Connect charges, see the documentation on choosing an approach.

Caution

Stripe supports separate charges and transfers in the following regions: Australia, Brazil, Canada, Europe, Japan, Malaysia, New Zealand, Singapore, and the US. Separate charges and transfers are supported if both your platform and the connected account are in the same region (for example, both in Australia). For cross-region support, see the cross-border transfers docs.

To create a charge and set up the associated transfer, create a transfer_group and assign the charge to the transfer_group.

Command Line
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d amount=10000 \ -d currency=usd \ -d transfer_group=ORDER10
Command Line
curl https://api.stripe.com/v1/transfers \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d amount=7000 \ -d currency=usd \ -d destination={{CONNECTED_STRIPE_ACCOUNT_ID}} \ -d transfer_group=ORDER10
Command Line
curl https://api.stripe.com/v1/transfers \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d amount=2000 \ -d currency=usd \ -d destination={{OTHER_CONNECTED_STRIPE_ACCOUNT_ID}} \ -d transfer_group=ORDER10

For the complete flow, see accept a payment.

Transfer options

You can assign any value to the transfer_group string, but it must represent a single business action. You can also make a transfer with neither an associated charge nor a transfer_group—for example, when you must pay a provider but there’s no associated customer payment.

Transfer and charge amounts don’t have to match. You can split a single charge between multiple transfers or include multiple charges in a single transfer. You can perform transfers and charges in any order.

By default, a transfer request fails when the amount exceeds the platform’s available account balance. If the transfer has a source_transaction defined, the transfer request automatically succeeds but the transfer itself doesn’t occur until the funds from the source_transaction become available.

Note

If you use separate charges and transfers, take that into account when planning your payout schedule. Automatic payouts can interfere with transfers that don’t have a defined source_transaction.

Collecting fees

When using separate charges and transfers, the platform can collect fees on a charge by reducing the amount it transfers to the destination accounts. For example, consider a restaurant delivery service transaction that involves payments to the restaurant and to the driver:

  1. The customer pays a 100 USD charge.
  2. Stripe collects a 3.20 USD fee and adds the remaining 96.80 USD to the platform account’s pending balance.
  3. The platform transfers 70 USD to the restaurant’s connected account and 20 USD to the driver’s connected account.
  4. A platform fee of 6.80 USD remains in the platform account.
How a charge is divided into fees for the platform account and transfers for the connected accounts

To learn about processing payments in multiple currencies with Connect, see Working with multiple currencies.

Refunding charges

You can refund charges created on your platform using its secret key. However, refunding a charge has no impact on any associated transfers. It’s up to your platform to reconcile any amount owed back to it by reducing subsequent transfer amounts or by reversing transfers (as explained next).

Command Line
curl https://api.stripe.com/v1/refunds \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d charge=
{{CHARGE_ID}}

Reversing transfers

Connect supports the ability to reverse transfers made to connected accounts, either entirely or partially (by setting an amount value):

Command Line
curl https://api.stripe.com/v1/transfers/
{{TRANSFER_ID}}
/reversals
\ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d amount=500

Transfer reversals add the specified (or entire) amount back to the platform’s available balance, reducing the connected account’s available balance accordingly. It is only possible to reverse a transfer if the connected account’s available balance is greater than the reversal amount or has connected reserves enabled.

If the transfer reversal requires the currency to be converted, and the reversal amount results in a zero balance after the conversion, it returns an error.

Using on_behalf_of

Optionally, you can set the on_behalf_of parameter to the ID of a connected account to make that account the business of record for the payment. When using on_behalf_of:

  • Charges are settled in the connected account’s country and settlement currency.
  • The fee structure for the connected account’s country is used.
  • The connected account’s statement descriptor is displayed on the customer’s credit card statement.
  • If the connected account is in a different country than the platform, the connected account’s address and phone number are displayed on the customer’s credit card statement.
  • The number of days that a pending balance is held before being paid out depends on the delay_days setting on the connected account.

If on_behalf_of is omitted, the platform is the business of record for the payment.

Caution

The on_behalf_of attribute is supported only for connected accounts with the card_payments capability. Accounts under the recipient service agreement can’t request card_payments.

Command Line
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d amount=1000 \ -d currency="{% $merchant.currency %}" \ -d "automatic_payment_methods[enabled]"=true \ -d on_behalf_of=
{{CONNECTED_ACCOUNT_ID}}

Transfer availability

When creating separate charges and transfers, your platform can attempt a transfer that exceeds its available balance. Doing so raises an error and the transfer attempt fails. If you’re commonly experiencing this problem, you can use the source_transaction parameter to tie a transfer to an existing charge. With a source_transaction, the transfer request succeeds regardless of your available balance and the transfer itself only occurs after the charge’s funds become available.

Command Line
curl https://api.stripe.com/v1/transfers \ -u "
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:"
\ -d amount=1000 \ -d currency=usd \ -d source_transaction=
{{CHARGE_ID}}
\ -d destination=
{{CONNECTED_ACCOUNT_ID}}

When using this parameter:

  • The amount of the transfer must not exceed the amount of the source charge
  • You can create multiple transfers with the same source_transaction, as long as the sum of the transfers doesn’t exceed the source charge
  • The transfer takes on the pending status of the associated charge: if the funds from the charge become available in N days, the payment that the destination Stripe account receives from the transfer also becomes available in N days
  • Stripe automatically creates a transfer_group for you
  • The currency of the balance transaction associated with the charge must match the currency of the transfer

Asychronous payment methods, like ACH, can fail after a subsequent transfer request is made. For these payments, avoid using source_transaction. Instead, wait until a charge.succeeded event is triggered before transferring the funds. If you have to use source_transaction with these payments, you must implement functionality to manage payment failures.

When a payment used as a source_transaction fails, funds from your platform’s account balance are transferred to the connected account to cover the payment. To recover these funds, reverse the transfer associated with the failed source_transaction.

See also

  • Creating charges
  • Multiple currencies
  • Custom accounts
  • Cloning saved payment methods
  • Statement descriptors with Connect
  • Understanding Connect account balances
Was this page helpful?
Need help? Contact Support.
Watch our developer tutorials.
Check out our product changelog.
Questions? Contact Sales.
Powered by Markdoc
You can unsubscribe at any time. Read our privacy policy.
On this page
Collecting fees
Refunding charges
Reversing transfers
Using on_behalf_of
Transfer availability
See also
Stripe Shell
Test mode
Welcome to the Stripe Shell! Stripe Shell is a browser-based shell with the Stripe CLI pre-installed. Login to your Stripe account and press Control + Backtick on your keyboard to start managing your Stripe resources in test mode. - View supported Stripe commands: - Find webhook events: - Listen for webhook events: - Call Stripe APIs: stripe [api resource] [operation] (e.g. )
The Stripe Shell is best experienced on desktop.
$