Create destination charges
Create charges on your platform account, collect fees, and immediately transfer the remaining funds to your connected accounts.
Create destination charges when customers transact with your platform for products or services provided by your connected accounts and you immediately transfer funds to your connected accounts. With this charge type:
- You create a charge on your platformâs account.
- You determine whether some or all of those funds are transferred to the connected account.
- Your account balance is debited for the cost of the Stripe fees, refunds, and chargebacks.
This charge type is most optimal for marketplaces such as Airbnb, a home rental marketplace or Lyft, a ridesharing app.
Destination charges are only supported if both your platform and the connected account are in the same country. For cross-border support, you must specify the settlement merchant to the connected account using the on_behalf_of parameter on the Payment Intent or other valid cross-border transfers scenarios.
Note
We recommend using destination charges for connected accounts that have access to the Express Dashboard or no dashboard access.
Redirect to a Stripe-hosted payment page using Stripe Checkout. See how this integration compares to Stripeâs other integration types.
Integration effort
Integration type
Redirect to Stripe-hosted payment page
UI customization
First, register for a Stripe account.
Use our official libraries to access the Stripe API from your application:
Create a Checkout SessionClient-sideServer-side
A Checkout Session controls what your customer sees in the payment form such as line items, the order amount and currency, and acceptable payment methods. Add a checkout button to your website that calls a server-side endpoint to create a Checkout Session.
<html> <head> <title>Checkout</title> </head> <body> <form action="/create-checkout-session" method="POST"> <button type="submit">Checkout</button> </form> </body> </html>
Handle post-payment eventsServer-side
Stripe sends a checkout.session.completed event when the payment completes. Use a webhook to receive these events and run actions, like sending an order confirmation email to your customer, logging the sale in a database, or starting a shipping workflow.
Listen for these events rather than waiting on a callback from the client. On the client, the customer could close the browser window or quit the app before the callback executes. Some payment methods also take 2-14 days for payment confirmation. Setting up your integration to listen for asynchronous events enables you to accept multiple payment methods with a single integration.
Stripe recommends handling all of the following events when collecting payments with Checkout:
Event | Description | Next steps |
---|---|---|
checkout.session.completed | The customer has successfully authorized the payment by submitting the Checkout form. | Wait for the payment to succeed or fail. |
checkout.session.async_payment_succeeded | The customerâs payment succeeded. | Fulfill the purchased goods or services. |
checkout.session.async_payment_failed | The payment was declined, or failed for some other reason. | Contact the customer through email and request that they place a new order. |
These events all include the Checkout Session object. After the payment succeeds, the underlying PaymentIntent status changes from processing
to succeeded
or a failure status.
Test the integration
See Testing for additional information to test your integration.
Collect fees
You can collect fees with either an application_fee_amount or transfer_data[amount].
Customize branding
Your platform uses the branding settings in the Dashboard to customize branding on the payments page. For destination charges, Checkout uses the branding settings of the platform account. For destination charges with on_
, Checkout uses the branding settings of the connected account.
Platforms can configure the branding settings of connected accounts using the Update Account API:
icon
- Displayed next to the business name in the header of the Checkout page.logo
- Used in place of the icon and business name in the header of the Checkout page.primary_
- Used as the background color on the Checkout page.color secondary_
- Used as the button color on the Checkout page.color
Specify the settlement merchant
The settlement merchant is dependent on the capabilities set on an account and how a charge is created. The settlement merchant determines whose information is used to make the charge. This includes the statement descriptor (either the platformâs or the connected accountâs) thatâs displayed on the customerâs credit card or bank statement for that charge.
Specifying the settlement merchant allows you to be more explicit about who to create charges for. For example, some platforms prefer to be the settlement merchant because the end customer interacts directly with their platform (such as on-demand platforms). However, some platforms have connected accounts that interact directly with end customers instead (such as a storefront on an e-commerce platform). In these scenarios, it might make more sense for the connected account to be the settlement merchant.
You can set the on_
parameter to the ID of a connected account to make that account the settlement merchant for the payment. When using on_
:
- Charges settle in the connected accountâs country and settlement currency.
- The fee structure for the connected accountâs country is used.
- The connected accountâs statement descriptor is displayed on the customerâs credit card statement.
- If the connected account is in a different country than the platform, the connected accountâs address and phone number are displayed on the customerâs credit card statement.
- The number of days that a pending balance is held before being paid out depends on the delay_days setting on the connected account.
If on_
is omitted, the platform is the business of record for the payment.
Caution
The on_
parameter is supported only for connected accounts with a payments capability such as card_payments. Accounts under the recipient service agreement canât request card_
or other payments capabilities.
Issue refunds
If you are using the Payment Intents API, refunds should be issued against the most recent charge that is created.
Charges created on the platform account can be refunded using the platform accountâs secret key. When refunding a charge that has a transfer_
, by default the destination account keeps the funds that were transferred to it, leaving the platform account to cover the negative balance from the refund. To pull back the funds from the connected account to cover the refund, set the reverse_
parameter to true
when creating the refund:
By default, the entire charge is refunded, but you can create a partial refund by setting an amount
value as a positive integer.
If the refund results in the entire charge being refunded, the entire transfer is reversed. Otherwise, a proportional amount of the transfer is reversed.
Refund application fees
When refunding a charge with an application fee, by default the platform account keeps the funds from the application fee. To push the application fee funds back to the connected account, set the refund_application_fee parameter to true
when creating the refund:
Note that if you refund the application fee for a destination charge, you must also reverse the transfer. If the refund results in the entire charge being refunded, the entire application fee is refunded as well. Otherwise, a proportional amount of the application fee is refunded.
Alternatively, you can provide a refund_
value of false and refund the application fee separately through the API.
Failed refunds
If a refund fails, or you cancel it, the amount of the failed refund returns to your platform accountâs Stripe balance. Create a Transfer to move the funds to the connected account, as needed.
Handle disputes
For destination charges, with or without on_
, Stripe debits dispute amounts and fees from your platform account.
We recommend setting up a webhook to listen to dispute created events. When that happens, you can attempt to recover funds from the connected account by reversing the transfer through the Dashboard or by creating a transfer reversal.
If the connected account has a negative balance, Stripe attempts to debit its external account if debit_
is set to true
.
If you challenge the dispute and win, you can transfer the funds that you previously reversed back to the connected account. If your platform has an insufficient balance, the transfer fails. Prevent insufficient balance errors by adding funds to your Stripe balance.
Common mistake
Retransferring a previous reversal is subject to cross-border transfer restrictions, meaning you might have no means to repay your connected account. Instead, wait to recover disputed cross-border payment transfers for destination charges with on_
until after a dispute is lost.