Stripe | Financial Infrastructure to Grow Your Revenue

Stripe | Financial Infrastructure to Grow Your Revenue

4466 articles

Cross-border payouts and automatic transfer rules


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:

  1. Retrieving the requirements generated for the requested capabilities.
  2. Providing a form to collect the information required from your connected account.
  3. 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:

  1. Retrieving the requirements populated at account creation.
  2. Providing a form to collect the information required.
  3. 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

Last verified 2026-09-24

Is this helpful?