Skip to content
Create account or Sign in
The Stripe Docs logo
/
Ask AI
Create accountSign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp

Funds segregation for separate charges and transfersPrivate preview

Track funds that are designated for transfer to connected accounts.

Funds segregation lets you allocate funds from separate charges and transfers to a holding state on your platform account before transferring them to connected accounts. Funds in this state don’t appear in your platform balance, and you can only transfer them to a connected account.

You can view the allocated balance from a specific payment, which lets you track the complete flow of those funds.

Allocating funds prevents them from being used for any other purpose, such as:

  • Platform-level automatic payouts
  • Unrelated refunds and chargebacks
  • Stripe fees
  • Other debits from your platform’s payments balance

Available in:

Belgium
Denmark
France
Germany
Netherlands
Spain
Sweden
Switzerland
United Kingdom
United States

Prerequisites and limitations

Before implementing funds segregation, review these requirements and limitations:

Requirements

  • Your platform must be responsible for negative balances on connected accounts.
  • You must include the preview header allocated_funds_preview=v1 in all API requests.

Limitations

  • The Stripe Dashboard doesn’t identify allocated funds. Any balances and transactions in the Dashboard might combine allocated and other funds.
  • All fee billing is asynchronous; fees might not display in line with the payment. Fees are later billed to the platform’s Stripe balance.
  • You can only view the details of allocated funds by expanding individual Charge objects.
  • Avoid using the automatic_payment_methods parameter. Allocated funds can only be derived from payments made with Visa, Mastercard, Discover, American Express, and Swish payment methods.
  • You can’t use funds segregation with overcapture, multicapture, or incremental authorization.
  • You can’t use cross-border payouts with funds segregation in the US. You can only transfer allocated funds to US connected accounts.

Create payments with allocated funds

To use funds segregation, create a PaymentIntent with allocated_funds set to enabled: true. At payment capture, Stripe allocates the funds.

You can track the flow of the allocated funds by specifying a unique transfer_group value.

After successful capture, the full amount becomes available (subject to payment method settlement timing) as allocated funds that you can transfer to a connected account.

Command Line
cURL
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-12-15.clover; allocated_funds_preview=v1" \ -d "allocated_funds[enabled]"=true \ -d amount=10000 \ -d currency=eur \ -d payment_method=pm_xxxxxxxxx \ -d transfer_group=ORDER100 \ -d confirm=true \ -d capture_method=automatic

View allocated funds for a specific payment

To see the balance of allocated funds from a specific payment, expand the allocated_funds.balance property of the charge:

Command Line
cURL
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl -G https://api.stripe.com/v1/payment_intents/
{{PAYMENT_INTENT_ID}}
\ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-12-15.clover; allocated_funds_preview=v1" \ -d "expand[]"="latest_charge.allocated_funds.balance"
Charge response
{ "id": "{{PaymentIntent ID}}", "object": "payment_intent", "latest_charge": { "id": "{{Charge ID}}", "object": "charge", "allocated_funds": { "enabled": true, "balance": { "available": 0, "pending": 10000, "currency": "eur" } } } }

Transfer allocated funds

When you transfer allocated funds, you must set the source_transaction parameter to the ID of the associated charge and the destination parameter to the ID of the associated connected account.

If you specify an application fee amount, that amount is debited from the allocated funds and credited to your platform’s payments balance. The create transfer response includes details about the application fee.

Command Line
cURL
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/transfers \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-12-15.clover; allocated_funds_preview=v1" \ -d destination="{{Connected Account ID}}" \ -d source_transaction="{{Charge ID}}" \ -d amount=3800 \ -d currency=eur \ -d application_fee_amount=200

You don’t need to transfer the full payment amount in a single transfer or to a single connected account. You can split allocated funds across multiple transfers, as long as the total doesn’t exceed the original payment amount.

The transfer response includes details about the application fee when specified:

Transfer response
{ "id": "{{Transfer ID}}", "object": "transfer", "amount": 3800, "currency": "eur", "destination": "{{Connected Account ID}}", "source_transaction": "{{Charge ID}}", "application_fee_amount": 200, "application_fee": { "id": "{{Application Fee ID}}", "object": "application_fee", "amount": 200, "currency": "eur", "fee_source": { "type": "transfer", "transfer": "{{Transfer ID}}" } } }

Collecting application fees on transfers directly moves funds from the allocated funds to the platform account balance. This avoids unnecessary foreign exchange (FX) conversions when the platform’s currency and the connected account’s currency are different, because the application fee never leaves the platform account.

Handle refunds and disputes

Refunds and disputes for payments with allocated funds draw from those allocated funds before using funds from your platform account balance. Stripe only debits from your platform account balance if the associated payment’s remaining allocated funds can’t cover the refund or dispute.

For example, if you transferred 60 EUR from a 100 EUR payment and then process a 100 EUR refund:

  • 40 EUR comes from remaining allocated funds.
  • 60 EUR comes from your platform’s account balance.

Dispute fees are always debited from your platform account balance, and don’t affect allocated funds.

You can use Transfer Reversals to return funds from a connected account to the allocated funds balance before processing a refund or while awaiting the outcome of a dispute:

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/transfers/
{{TRANSFER_ID}}
/reversals
\ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d amount=6000 \ -d refund_application_fee=true

Transfer reversals always move funds into an allocated state if the payment was originally allocated.

If you set the refund_application_fee parameter to true, Stripe also debits the application fee amount from your platform’s payments balance and returns it to the allocated state.

If you reverse a transfer of allocated funds that are involved in a dispute, they remain allocated regardless of the dispute’s outcome. You can’t recover dispute fees from them.

If the dispute is won, you can transfer the allocated funds back to your connected account. If the dispute is lost, then you can contact Stripe to request that we unallocate the funds and add them to your platform account balance.

Transfer allocated funds to your platform account balance

You can use Balance Transfers to transfer funds from your allocated funds to your platform account balance. This is useful for clearing a hanging balance or collecting a platform fee at a time other than immediately at the time of the charge or transfer. The selected currency must match the currency that the charge was settled in.

For example, a hanging allocated funds balance can occur if a customer dispute was first refunded from your platform account balance, and you later reversed the transfer from the seller. In this scenario, the clawed-back funds are in your allocated funds, but since the customer has already been refunded, you would likely want to move these allocated funds to your platform account balance.

Command Line
cURL
No results
curl https://api.stripe.com/v1/balance_transfers \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-12-15.clover; allocated_funds_preview=v1" \ -d amount=6000 \ -d currency=eur \ -d "destination_balance[type]"=payments \ -d "source_balance[type]"=allocated_funds \ -d "source_balance[allocated_funds][type]"=charge \ -d "source_balance[allocated_funds][charge]"="{{Charge ID}}"

Test funds segregation

You can only test allocated funds in Sandbox environments, not in test mode. Refer to the testing guide to simulate payments for your integration.

Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc