Public preview
Cross-border payouts and automatic transfer rules Public preview
Create a financial account, automate funding and send a cross-border OutboundPayment.
This example use case shows an integration using a SaaS platform that provides financial services to property managers using Connect and Treasury for platforms. One of its UK property managers needs a financial account to hold rental income and pay landlords internationally.
The example integration requires the following steps:
- Create and onboard a connected account for Treasury for platforms.
- Create a financial account .
- Configure automatic transfer rules to move funds from the connected account’s payments balance to the financial account during scheduled payouts.
- Send a cross-border OutboundPayment to the landowner in Norway.
Develop in a sandbox
Begin in a sandbox with access to Treasury for platforms and use that sandbox’s test API keys for all requests.
Create the connected account
The platform creates the connected account for the property manager with the merchant and money_manager configurations and requests the associated capabilities.
Command Line
cURL
Example response
{
"id": "{{CONNECTED_ACCOUNT_ID}}",
"object": "v2.core.account",
"applied_configurations": ["merchant","money_manager"],
"configuration": {
"money_manager": {
"capabilities": {
"business_storage": { "inbound": { "gbp": { "requested": true, "status": "restricted" } }, "outbound": { "gbp": { "requested": true, "status": "restricted" } } }
}
}
},
"display_name": "Property Manager Ltd",
"dashboard": "none",
"livemode": false
}
Onboard the connected account
The platform then onboards the connected account by:
- Retrieving the requirements generated for the requested capabilities.
- Providing a form to collect the information required from your connected account.
- Updating the Account with the collected information, specifying the connected account in the Stripe-Context header: {{the related setting}} to identify the connected account as the account to update.
Alternatively, the platform might create an account link specifying the type as the merchant and money_manager configurations, then send the returned URL to the connected account before it expires so they can provide the required information in a Stripe-hosted interface.
The platform listens for the v2.core.account[configuration.money_manager].capability_status_updated webhook to confirm the capabilities are active for its connected account.
Create the financial account
The platform creates a GBP storage financial account, specifying the property manager’s account ID in the Stripe-Context header to associate the financial account with the property manager.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
The response includes the financial account ID:
Example response
{
"id": "{{FINANCIAL_ACCOUNT_ID}}",
"object": "v2.money_management.financial_account",
"balance": {
"available": { "usd": { "value": 0, "currency": "usd" } },
"inbound_pending": { "usd": { "value": 0, "currency": "usd" } },
"outbound_pending": { "usd": { "value": 0, "currency": "usd" } }
},
"country": "US",
"created": "2025-06-18T11:05:27.930Z",
"status": "pending",
"status_details": null,
"storage": { "holds_currencies": ["usd"] },
"type": "storage",
"livemode": false
}
Simulate rental income
The platform creates and confirms a test PaymentIntent, using the property manager’s account ID in the Stripe-Context header, to simulate a rental payment that funds the property manager’s payments balance.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Configure automatic transfer rules
Automatic transfer rules require scheduled payouts (not manual). The platform updates the property manager’s balance settings to:
- Set payments. payouts. schedule. interval to daily to make sure the automatic transfer rule can run.
- Set automatic_transfer_rules_by_currency to transfer all GBP funds from the payments balance to the financial account during scheduled payouts.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
The platform listens for the v2.money_management.received_credit.created webhook to learn when the money movement has started, then lists financial accounts to verify balances:
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Example response
{
"data": [
{
"id": "{{FINANCIAL_ACCOUNT_ID}}",
"object": "v2.money_management.financial_account",
"balance": {
"available": { "gbp": { "value": 25000, "currency": "gbp" } },
"inbound_pending": { "gbp": { "value": 0, "currency": "gbp" } },
"outbound_pending": { "gbp": { "value": 0, "currency": "gbp" } }
},
"country": "GB",
"status": "open",
"storage": { "holds_currencies": ["gbp"] },
"type": "storage",
"livemode": false
}
],
"next_page_url": null,
"previous_page_url": null
}
Send a cross-border payment to a Norwegian property owner
The platform creates a recipient-configured connected account to represent the landlord in Norway that the property manager pays from the financial account. This set up follows the steps:
- Create a recipient-configured connected account.
- Onboard the recipient.
- Add a payout method using OutboundSetupIntents .
- Create an outbound payment quote (required for cross-border OutboundPayments).
- Create an outbound payment to the recipient using the payout method and quote.
Create the landlord recipient account
The platform creates a connected account for the landlord in Norway with the recipient configurations and requests the associated capabilities. It specifies the property manager’s account ID in the Stripe-Context header to identify the landlord as an account of the property manager rather than a direct account of the platform.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
The response includes the account ID and any onboarding requirements:
Example response
{
"id": "{{RECIPIENT_ACCOUNT_ID}}",
"object": "v2.core.account",
"applied_configurations": ["recipient"],
"configuration": {
"recipient": {
"capabilities": {
"bank_accounts": {
"local": {
"requested": true,
"status": "restricted",
"status_details": [
{
"code": "requirements_past_due",
"resolution": "provide_info"
}
]
}
}
}
}
},
"display_name": "NO Property Owner",
"requirements": {
"collector": "stripe",
"entries": [
{ "description": "identity.individual.date_of_birth.day", "impact": { "restricts_capabilities": [ { "capability": "bank_accounts.local", "configuration": "recipient", "deadline": { "status": "past_due" } } ] }, "minimum_deadline": { "status": "past_due" }, "awaiting_action_from": "user", "errors": [], "reference": null, "requested_reasons": [ { "code": "routine_onboarding" } ] },
{ "description": "identity.individual.date_of_birth.month", "impact": { "restricts_capabilities": [ { "capability": "bank_accounts.local", "configuration": "recipient", "deadline": { "status": "past_due" } } ] }, "minimum_deadline": { "status": "past_due" }, "awaiting_action_from": "user", "errors": [], "reference": null, "requested_reasons": [ { "code": "routine_onboarding" } ] },
{ "description": "identity.individual.date_of_birth.year", "impact": { "restricts_capabilities": [ { "capability": "bank_accounts.local", "configuration": "recipient", "deadline": { "status": "past_due" } } ] }, "minimum_deadline": { "status": "past_due" }, "awaiting_action_from": "user", "errors": [], "reference": null, "requested_reasons": [ { "code": "routine_onboarding" } ] },
{ "description": "identity.individual.given_name", "impact": { "restricts_capabilities": [ { "capability": "bank_accounts.local", "configuration": "recipient", "deadline": { "status": "past_due" } } ] }, "minimum_deadline": { "status": "past_due" }, "awaiting_action_from": "user", "errors": [], "reference": null, "requested_reasons": [ { "code": "routine_onboarding" } ] },
{ "description": "identity.individual.surname", "impact": { "restricts_capabilities": [ { "capability": "bank_accounts.local", "configuration": "recipient", "deadline": { "status": "past_due" } } ] }, "minimum_deadline": { "status": "past_due" }, "awaiting_action_from": "user", "errors": [], "reference": null, "requested_reasons": [ { "code": "routine_onboarding" } ] }
],
"summary": { "minimum_deadline": { "status": "past_due", "time": null } }
},
"livemode": false
}
Onboard the landlord
The platform then onboards the recipient-configured connected account by:
- Retrieving the requirements populated at account creation.
- Providing a form to collect the information required.
- Updating the Account with the collected information, specifying the connected account and recipient in the Stripe-Context header: {{the related setting}} / {{the related setting}} to identify that the platform makes a request on behalf of its property manager’s landlord account.
After submitting required information, the platform confirms the recipient’s capabilities are active before proceeding.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Example response
{
"id": "{{RECIPIENT_ACCOUNT_ID}}",
"object": "v2.core.account",
"configuration": {
"recipient": {
"capabilities": {
"bank_accounts": {
"local": {
"requested": true,
"status": "active"
}
}
}
}
},
"livemode": false,
"requirements": {
"collector": "stripe",
"entries": [],
"summary": { "minimum_deadline": { "status": "past_due", "time": null } }
},
}
Add a payout method
The platform creates a payout method for the landlord in Norway using an OutboundSetupIntent. The Stripe-Context header includes both the connected account and recipient: ``
{{the related setting}}
/ {{the related setting}} to identify the relationship: the platform making a request on behalf of its property manager’s landlord account.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
The response includes the payout method ID:
Example response
{
"id": "osi_test_61SITWK7KhLsQIGAK16QsOpAPpE97EJALhqt1U5mC4kq",
"object": "v2.money_management.outbound_setup_intent",
"created": "2025-06-19T17:52:34.829Z",
"payout_method": {
"id": "{{RECIPIENT_PAYOUT_METHOD_ID}}",
"object": "v2.money_management.payout_method"
},
"status": "succeeded",
"usage_intent": "payment",
"livemode": false
}
Create an outbound payment quote
The platform creates an OutboundPaymentQuote that contains an foreign exchange (FX) rate and fees for this cross-border OutboundPayment. Cross-border OutboundPayments require the quote, and it provides estimated fees and exchange rates.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
The response includes the quote ID and FX details:
Example response
{
"id": "{{OUTBOUND_PAYMENT_QUOTE_ID}}",
"object": "v2.money_management.outbound_payment_quote",
"amount": {
"value": 10000,
"currency": "gbp"
},
"created": "2025-09-09T09:21:17.201Z",
"estimated_fees": [
{
"amount": { "value": 50, "currency": "gbp" },
"type": "standard_payout_fee"
},
{
"amount": { "value": 200, "currency": "gbp" },
"type": "foreign_exchange_fee"
}
],
"from": {
"debited": { "value": 10250, "currency": "gbp" },
"financial_account": "{{FINANCIAL_ACCOUNT_ID}}"
},
"fx_quote": {
"lock_duration": "five_minutes",
"lock_expires_at": "2025-09-09T09:26:17.000Z",
"lock_status": "active",
"rates": {
"gbp": { "exchange_rate": "13.0000" }
},
"to_currency": "nok"
},
"to": {
"credited": { "value": 130000, "currency": "nok" },
"recipient": "{{RECIPIENT_ACCOUNT_ID}}"
},
"livemode": false
}
Create the cross-border outbound payment to Norwegian recipient
The platform sends an outbound payment from the property manager’s financial account to the recipient in Norway using the payout method and quote.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Example response
