# Create a multi-currency Financial Account

Learn how to hold multiple currencies, convert funds, and send local payouts.

This example use case shows an integration using a SaaS platform that supports wholesalers using *Connect* (Connect is Stripe's solution for multi-party businesses, such as marketplace or software platforms, to route payments between sellers, customers, and other recipients) and [Treasury for platforms](https://docs.stripe.com/treasury/connect.md). One of its US wholesalers wants to set up a multi-currency financial account that can hold GBP so it can convert funds and send EUR payments to suppliers in Europe.

## Availability

Multi-currency financial accounts are available in the following countries:

| Country | Supported currencies |
| --- | --- |
| Australia | AUD, EUR, GBP, USD |
| United Kingdom | EUR, GBP, USD |
| United States | EUR, GBP, USD |

The example integration requires the following steps:

- Create and onboard a [connected account](https://docs.stripe.com/treasury/connect/account-management/connected-accounts.md) for Treasury for platforms.
- Create a multi-currency [financial account](https://docs.stripe.com/treasury/connect/account-management/financial-accounts.md).
- Create a financial address so the wholesaler can bank-transfer funds into a financial account.
- Get an exchange rate quote for currency conversion and then convert the funds.
- Create a cross-border payout from the wholesaler to its supplier.

> #### Develop in a sandbox
> 
> Begin in a [sandbox](https://docs.stripe.com/sandboxes.md) 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](https://docs.stripe.com/api/v2/core/accounts/create.md) for the wholesaler with the `merchant` and `money_manager` configurations and requests the associated capabilities.

> A connected account can only hold currencies that the platform also holds.

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-06-24.preview" \
  --json '{
    "include": [
        "configuration.money_manager"
    ],
    "contact_email": "euro.supplies.inc@example.com",
    "display_name": "Euro Supplies Inc",
    "identity": {
        "country": "US",
        "entity_type": "company"
    },
    "configuration": {
        "merchant": {
            "mcc": "6513",
            "support": {
                "phone": "0000000000"
            },
            "capabilities": {
                "card_payments": {
                    "requested": true
                }
            }
        },
        "money_manager": {
            "capabilities": {
                "received_credits": {
                    "bank_accounts": {
                        "requested": true
                    }
                },
                "business_storage": {
                    "inbound": {
                        "gbp": {
                            "requested": true
                        },
                        "eur": {
                            "requested": true
                        },
                        "usd": {
                            "requested": true
                        }
                    },
                    "outbound": {
                        "gbp": {
                            "requested": true
                        },
                        "eur": {
                            "requested": true
                        },
                        "usd": {
                            "requested": true
                        }
                    }
                },
                "outbound_transfers": {
                    "bank_accounts": {
                        "requested": true
                    }
                },
                "outbound_payments": {
                    "bank_accounts": {
                        "requested": true
                    }
                }
            }
        }
    },
    "dashboard": "none",
    "defaults": {
        "currency": "usd",
        "responsibilities": {
            "fees_collector": "application",
            "losses_collector": "application"
        }
    }
  }'
```

```json
{
  "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" }, "eur": { "requested": true, "status": "restricted" }, "usd": { "requested": true, "status": "restricted" } }, "outbound": { "gbp": { "requested": true, "status": "restricted" }, "eur": { "requested": true, "status": "restricted" }, "usd": { "requested": true, "status": "restricted" } } }
      }
    }
  },
  "display_name": "Euro Supplies Inc",
  "dashboard": "none",
  "livemode": false
}
```

## Onboard the wholesaler

The platform then [onboards the connected account](https://docs.stripe.com/connect/api-onboarding.md) 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: `{{CONNECTED_ACCOUNT_ID}}` to identify the connected account as the account to update.

Alternatively, the platform might create an [account link](https://docs.stripe.com/connect/hosted-onboarding.md?accounts-namespace=v2&lang=curl#create-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](https://docs.stripe.com/webhooks.md) to confirm the capabilities are active for its connected account.

## Create a multi-currency financial account

The platform creates a [storage financial account](https://docs.stripe.com/api/v2/money-management/financial-accounts/create.md?api-version=preview) that can store funds in EUR, USD, and GBP, specifying the wholesaler’s account ID in the `Stripe-Context` header to associate the financial account with the wholesaler.

```curl
curl -X POST https://api.stripe.com/v2/money_management/financial_accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-06-24.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "type": "storage",
    "storage": {
        "holds_currencies": [
            "gbp",
            "eur",
            "usd"
        ]
    }
  }'
```

The response includes the financial account ID:

```json
{
  "id": "{{FINANCIAL_ACCOUNT_ID}}",
  "object": "v2.money_management.financial_account",
  "balance": {
    "available": {
      "gbp": { "value": 0, "currency": "gbp" },
      "eur": { "value": 0, "currency": "eur" },
      "usd": { "value": 0, "currency": "usd" }
    },
    "inbound_pending": {
      "gbp": { "value": 0, "currency": "gbp" },
      "eur": { "value": 0, "currency": "eur" },
      "usd": { "value": 0, "currency": "usd" }
    },
    "outbound_pending": {
      "gbp": { "value": 0, "currency": "gbp" },
      "eur": { "value": 0, "currency": "eur" },
      "usd": { "value": 0, "currency": "usd" }
    }
  },
  "country": "US",
  "created": "2025-11-17T11:05:27.930Z",
  "status": "pending",
  "status_details": null,
  "storage": { "holds_currencies": ["gbp", "eur", "usd"] },
  "type": "storage",
  "livemode": false
}
```

## Create financial addresses

To allow the wholesaler to add funds through bank transfers, the platform [creates a GBP financial address](https://docs.stripe.com/api/v2/money-management/financial-addresses/create.md?api-version=preview) for the wholesaler’s financial account.

```curl
curl -X POST https://api.stripe.com/v2/money_management/financial_addresses \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-06-24.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "financial_account": "{{FINANCIALACCOUNTID_ID}}",
    "type": "gb_bank_account"
  }'
```

The response includes the ID of the financial address:

```json
{
  "id": "{{FINANCIAL_ADDRESS_ID}}",
  "object": "v2.money_management.financial_address",
  "created": "2025-06-19T19:17:54.607Z",
  "credentials": null,
  "currency": "gbp",
  "financial_account": "fa_12345",
  "settlement_currency": "gbp",
  "status": "pending",
  "livemode": false
}
```

The platform simulates receiving funds through the financial address using the [Credit a FinancialAddress object test helper](https://docs.stripe.com/api/v2/money-management/financial-addresses/credit.md?api-version=preview) in a sandbox instead of [funding in live mode](https://docs.stripe.com/treasury/connect/moving-money/fund-a-financial-account.md#external-account) using an external bank account.

```curl
curl -X POST https://api.stripe.com/v2/test_helpers/financial_addresses/{{FINANCIAL_ADDRESS_ID}}/credit \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-06-24.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "amount": {
        "value": 5000,
        "currency": "gbp"
    },
    "network": "fps"
  }'
```

The response indicates if the transfer of virtual funds was successful.

The platform listens for the `v2.money_management.received_credit.created` [webhook](https://docs.stripe.com/api/events/types.md?api-version=preview&rds=1#event_types-received_credit.created) to learn when the money movement has started.

## Retrieve an exchange rate quote

The platform [obtains an FX quote](https://docs.stripe.com/api/fx_quotes.md?api-version=preview) to display an indicative rate to its wholesaler. This quote represents the current exchange rate, but isn’t lockable for currency conversion, which calculates its own rate at execution and might differ from the quote rate.

```curl
curl https://api.stripe.com/v1/fx_quotes \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Version: 2026-06-24.preview" \
  -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \
  -d to_currency=eur \
  -d "from_currencies[]=gbp" \
  -d lock_duration=none
```

```json
{
  "id": "fxq_123",
  "object": "fx_quote",
  "created": 1731498806.6424642,
  "lock_duration": "none",
  "rates": {
    "gbp": {
      "exchange_rate": 1.10167,
      "rate_details": {
        "base_rate": 1.12415,
        "fx_fee_rate": 0.02,
        "reference_rate": 1.12437,
        "reference_rate_provider": "ecb"
      }
    }
  },
  "to_currency": "eur",
  "usage": {
    "payment": null,
    "transfer": null,
    "type": "payment"
  }
}
```

## Convert GBP funds to EUR

The platform [converts the financial account funds](https://docs.stripe.com/api/v2/currency-conversions.md?api-version=preview) from GBP to EUR on behalf of the wholesaler. Stripe charges the platform’s financial account for the FX fee, and the platform can create an `OutboundPayment` from the wholesaler to its own financial account to recover the fee.

```curl
curl -X POST https://api.stripe.com/v2/money_management/currency_conversions \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-06-24.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}" \
  --json '{
    "financial_account": "{{FINANCIALACCOUNTID_ID}}",
    "from": {
        "amount": {
            "value": 2500,
            "currency": "gbp"
        }
    },
    "to": {
        "currency": "eur"
    }
  }'
```

```json
{
  "id": "cnvr_test_123",
  "object": "v2.money_management.currency_conversion",
  "created": "2025-11-17T14:28:48.000Z",
  "exchange_rate": "1.1324",
  "financial_account": "{{FINANCIAL_ACCOUNT_ID}}",
  "from": {
    "amount": {
      "value": 2500,
      "currency": "gbp"
    }
  },
  "to": {
    "amount": {
      "value": 2831,
      "currency": "eur"
    }
  },
  "livemode": false
}
```

The platform verifies that the wholesaler’s financial account has enough EUR to pay their supplier.

```curl
curl https://api.stripe.com/v2/money_management/financial_accounts/{{FINANCIALACCOUNTID_ID}} \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-06-24.preview" \
  -H "Stripe-Context: {{CONTEXT_ID}}"
```

```json
{
  "id": "{{FINANCIAL_ACCOUNT_ID}}",
  "object": "v2.money_management.financial_account",
  "balance": {
    "available": {
      "gbp": {
        "value": 2500,
        "currency": "gbp"
      },
      "eur": {
        "value": 2831,
        "currency": "eur"
      },
      "usd": {
        "value": 0,
        "currency": "usd"
      }
    },
    "inbound_pending": {
      "gbp": {
        "value": 0,
        "currency": "gbp"
      },
      "eur": {
        "value": 0,
        "currency": "eur"
      },
      "usd": {
        "value": 0,
        "currency": "usd"
      }
    },
    "outbound_pending": {
      "gbp": {
        "value": 0,
        "currency": "gbp"
      },
      "eur": {
        "value": 0,
        "currency": "eur"
      },
      "usd": {
        "value": 0,
        "currency": "usd"
      }
    }
  },
  "country": "US",
  "created": "2025-11-17T16:20:14.943Z",
  "display_name": null,
  "metadata": null,
  "other": null,
  "status": "open",
  "status_details": null,
  "storage": {
    "holds_currencies": ["gbp", "eur", "usd"]
  },
  "type": "storage",
  "livemode": false
}
```

## Create a cross-border outbound payment

Follow the instructions in the [Cross-border payouts use case](https://docs.stripe.com/treasury/connect/examples/cross-border-and-automatic-transfer-rules.md) to:

- Create a recipient-configured connected account for the supplier under the wholesaler’s account.
- Onboard the supplier.
- Add a payout method for the supplier.
- Create an outbound payment quote.
- Create the cross-border outbound payment to the supplier.

Stripe charges the platform’s financial account for all FX fees, and the platform can create an `OutboundPayment` from the wholesaler to its own financial account to recover the fee.
