Creating separate charges and transfers
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.
Stripe supports separate charges and transfers in the following regions: Australia, Brazil, Canada, Europe, Japan, Malaysia, New Zealand, Singapore, and the U.S. 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
.
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 without either an associated charge or a transfer_group
—for example, when you must pay a provider but there’s no associated customer payment.
The platform:
- Does not have to transfer the same amount as the original charge
- Can transfer a maximum of the platform’s available account balance (with an exception when using source_transaction)
- Must be configured to use manual payouts or a combination of automatic payouts and the source_transaction parameter to ensure the account has sufficient funds to cover the transfer
You can group together multiple charges with a single transfer or multiple transfers with a single charge. You can also perform transfers and charges in any order.
Collecting fees
When creating charges on your platform and separately creating a transfer, the platform can earn money by allocating less of the charge amount to the destination Stripe account, as in the above code example. Assuming that represents a delivery service transaction, with a charge to the customer of 100 USD, a transfer of 20 USD to the delivery person, and a transfer of 70 USD to the restaurant:
- The charge amount less the Stripe fees is added to the platform account’s pending balance
- When the platform’s available balance is sufficient (at least 90 USD), the transfers can be made, reducing the platform’s available balance by the specified amounts and increasing both connected account’s available balances by that same amount
- Assuming standard U.S. Stripe fees, the platform retains an additional 6.80 USD (100.00 USD - 70.00 USD - 20.00 USD - 3.20 USD).
If you process payments in multiple currencies, you should also read how that is handled in Connect.
Refunding charges
Charges created on your platform can be refunded using your platform’s 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 your platform by reducing subsequent transfer amounts or by reversing transfers (as explained next).
Reversing transfers
Connect supports the ability to reverse transfers made to connected accounts, either entirely or partially (by setting an amount
value):
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, you’ll receive an error if the reversal amount results in a zero balance after the conversion.
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.
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
.
Transfer availability
When creating separate charges and transfers, your platform can inadvertently attempt a transfer without having a sufficient 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. By using source_transaction
, the transfer request succeeds regardless of your available balance and the transfer itself only occurs once the charge’s funds become available.
When using this parameter:
- The amount of the transfer must not exceed the amount of the source charge
- You may 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
Certain payment methods, like ACH, can fail asynchronously. For these payments, you should avoid using source_transaction
and wait until a charge.succeeded event is triggered before transferring the funds. If you have to use source_transaction
with these payments, you’ll have to 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
.