Stripe | Financial Infrastructure to Grow Your Revenue

Stripe | Financial Infrastructure to Grow Your Revenue

5282 articles

Reuse payment credentials for Global Payouts


Public preview

Reuse payment credentials for Global Payouts Public preview

Reuse a customer's payment method as a payout method for sending payouts.

If you’ve already collected identity and payment method information from a customer (for example, debit card or bank account details) to accept payments, you can reuse those same details to enable the same account as a payout method for Global Payouts, instead of collecting the information again. For example, if you already have payment method information for a customer, you can reuse it to pay out to that customer instead of asking them to submit their details again.

Potential use cases include:

  • Insurance : Collect an insurance premium from a customer up front, and pay out approved claims later using the same payout details.
  • Prediction market : Collect a bet from a customer up front, and pay out winnings using the same payout details.

Availability

Credential reuse for Global Payouts is in public preview, and is available to all users who are using V2 Accounts. You can reuse credentials attached to customer-configured Account objects that you create with Accounts v2. You can also enable Reusable payment methods for Global Payouts in your Dashboard to project existing Customer objects and their eligible PaymentMethod objects to v2 Account and PayoutMethod objects.

Use the latest preview API version compatible with your integration. The earliest supported version of credential reuse is 2026-04-22.preview.

Limitations

  • You can only reuse credentials for US, EU and UK debit cards and US bank accounts (ACH direct debit).
  • You can’t reuse credentials from cards added through a digital wallet, such as Apple Pay or Google Pay.
  • If you share customers and payment methods across accounts , you can’t reuse payment method credentials collected from one account to create a payout method for a different account in its sharing group.
  • You can only reuse credentials for PaymentMethods , not legacy Cards or Sources .

Use API keys

You must use restricted API keys to make live requests to the Global Payouts APIs. For a standard integration, create a restricted key with the following permissions:

  • Recipient Configuration: Write
  • Merchant Configuration: Write
  • Money Management Financial Accounts: Read
  • Money Management Payout Methods: Write
  • Money Management Outbound Payments: Write

Grant additional permissions for these scenarios:

  • For UK Confirmation of Payee or the related setting/Eurozone payments that require Recipient Verifications, grant Money Management Recipient Verifications: Write .
  • If you use the gated Payout Intents API path, grant Money Management Payout Intents: Write .

How credential reuse works

Use the Accounts v2 API to represent each of your end users with one Account object that supports all interactions with them, including both payments and payouts.

When you create an Account with the customer configuration using the v2 API, Stripe automatically creates a v1 Customer object (ID prefix cus_) alongside the v2 Account object (ID prefix acct_).

When you opt in to the credential reuse preview feature in Dashboard Settings, Stripe enables the Accounts v2 preview and copies each existing Customer object to a related v2 Account object with the customer configuration. You can find the ID of the Account object in the Customer object’s customer_account property.

If you create a Customer object after opting in to the credential reuse preview, Stripe automatically creates a corresponding Account object with the customer configuration. However, we recommend that you create Account objects directly. If you create a Customer, listen for the v2.core.account.created webhook event. An event with a related_object.id that matches the customer_account property of the Customer object indicates that the related Account object has been created.

The following Customer object properties are related to the corresponding Account object properties:

Create an Account

This workflow assumes that you are directly creating Account objects using the Accounts v2 API. Each Account must have the customer and recipient configurations, which you can set when you create the Account. You can also add them later by updating the Account.

Command Line

cURL

If you create Customer objects instead, retrieve the Account ID from the Customer’s customer_account property.

Optional Retrieve Account IDs for existing Customer objects

Collect credentials

Configure webhook notifications

Before you collect payment method information, set up an event destination to receive the v2.money_management.payout_method.created event. When receiving webhooks, verify event signatures and use Stripe’s public IP address list.

Collect payment method information

  1. Enable Cards and ACH Direct Debit in the Dashboard Payment methods page.
  2. Use the Payment Element or any custom Checkout integration to collect payment method credentials. Create a SetupIntent or PaymentIntent and attach it to the Account object using the customer _ account parameter.
  3. Use payment _ method _ data to specify information about the bank account or debit card. This example uses us _ bank _ account :

Command Line

cURL

{
 "id": "seti_123",
 "object": "setup_intent",
 "customer_account": "acct_123",
 "payment_method": "pm_123",
 "payment_method_types": [
 "us_bank_account"
 ],
 // Other SetupIntent fields
 "status": "succeeded"
}

Stripe projects the eligible PaymentMethod to a PayoutMethod asynchronously. The ID starts with a different prefix than pm_, depending on the credential type (for example, usba_ or card_).

Retrieve the new payout method ID

When Stripe finishes projecting the credential, use related_object.id from the v2.money_management.payout_method.created event as the new PayoutMethod ID.

Listen for v2.money_management.payout_method.created:

A new PayoutMethod isn’t ready for money movement until you enable it. Its usage status is initially disabled for both payments and transfers:

{
 "id": "usba_test_123",
 "object": "v2.money_management.payout_method",
 "alternative_reference": {
 "id": "pm_123",
 "type": "payment_method"
 },
 "usage_status": {
 "payments": "disabled",
 "transfers": "disabled"
 }
}

Enable the payout method

To enable a credential for outbound payments, create an OutboundSetupIntent with the PayoutMethod ID from related_object.id. Set the Stripe-Context header to the customer Account ID:

Command Line

cURL

Create an OutboundSetupIntent to complete setup. The OutboundSetupIntent response contains the updated PayoutMethod:

{
 "id": "osi_test_123",
 "object": "v2.money_management.outbound_setup_intent",
 "next_action": null,
 "payout_method": {
 "id": "usba_test_123",
 "object": "v2.money_management.payout_method",
 "usage_status": {
 "payments": "eligible",
 "transfers": "eligible"
 }
 },
 "status": "succeeded",
 "usage_intent": "payment"
}

Send the payout to the recipient

Request Account recipient capabilities

To let an Account receive payouts, request Global Payouts capabilities on its recipient configuration the same way you would for any Global Payouts recipient, either when you create the Account or by updating it later. See Create a recipient for the Dashboard and API steps, and Capabilities for the full list of capabilities you can request. You can optionally set a default payout method for the Account, so Stripe knows which method to use for a currency if a payout doesn’t specify one.

Command Line

cURL

To confirm that a capability is active, retrieve the Account and inspect its capability status. Include configuration.recipient in the request, otherwise the property is null. The status must be active for the Account to receive payouts by that payout method.

Send the payout

After the payout method is active, send the payout the same way as for any other Global Payouts recipient. See Send money for the Dashboard and API steps to retrieve your FinancialAccount ID and send the payout.

Manage credentials

Any updates made to the underlying v1 PaymentMethod get propagated to the related v2 PayoutMethod if they’re relevant to the payout method (for example, detaching a payment method from a customer or updating a card’s expiry date). When the payout method updates, Stripe emits a payout_method.updated webhook event. Verify the webhook signature before acting on it, to make sure the event came from Stripe.

Command Line

Select a language

cURL

Stripe CLI

Ruby

Python

PHP

Java

Node.js

Go

.NET

No results

{
 "id": "pm_123",
 "object": "payment_method",
 "customer_account": null, // customer_account is null now that it is detached
 "livemode": false,
 "type": "card"
 // other PM fields
}

Listen for the v2.money_management.payout_method.updated event:

Set the Stripe-Context header to the customer Account ID when you retrieve the updated PayoutMethod.

The updated PayoutMethod looks like this:

Command Line

cURL

{
 "id": "usba_test_123",
 "object": "v2.money_management.payout_method",
 "alternative_reference": {
 "id": "pm_123",
 "type": "payment_method"
 },
 "bank_account": {
 "archived": true,
 "bank_account_type": "checking",
 "bank_name": "STRIPE TEST BANK",
 "branch_number": null,
 "country": "US",
 "enabled_delivery_options": [
 "local"
 ],
 "financial_connections_account": null,
 "last4": "6789",
 "routing_number": "110000000",
 "supported_currencies": [
 "usd"
 ],
 "swift_code": null
 },
 "created": "2026-04-29T12:00:00+0000",
 "latest_outbound_setup_intent": null,
 "type": "bank_account",
 "usage_status": {
 "payments": "eligible",
 "transfers": "eligible"
 },
 "livemode": false
}
Last verified 2026-09-25

Is this helpful?