RyzeDeskRyzeDesk

Stripe

4105 articles

Create direct charges


Create direct charges

Create charges directly on the connected account and collect fees.

Create direct charges when customers transact directly with a connected account, often unaware of your platform’s existence. With direct charges:

  • The payment appears as a charge on the connected account, not your platform’s account.
  • The connected account’s balance increases with every charge.
  • Your account balance increases with application fees from every charge.

This charge type is best suited for platforms providing software as a service. For example, Shopify provides tools for building online storefronts, and Thinkific enables educators to sell online courses.

Platform visibility limitations

Direct charges have limited visibility at the platform level. When you create direct charges:

  • Transaction objects such as PaymentIntents and Charges exist on the connected account, not on the platform.
  • To access direct charge data, you must query the Stripe API using the connected account ID in the Stripe-Account header .

This scoping behaviour affects data synchronisation services like Fivetran, as well as other third-party integrations that rely on platform-level API queries. To retrieve direct charge data, they must query the connected account, not the platform.

Note

We recommend using direct charges for connected accounts that have access to the full Stripe Dashboard.

Web

iOS

Android

React Native

Redirect to a Stripe-hosted payment page using Stripe Checkout. See how this integration compares to Stripe’s other integration types.

Integration effort

Low code

Integration type

Redirect to Stripe-hosted payment page

UI customisation

Limited customisation

Try it out

First, register for a Stripe account.

Use our official libraries to access the Stripe API from your application:

Command Line

Select a language

Ruby

Python

PHP

Java

Node.js

Go

.NET

No results

# Available as a gem
sudo gem install stripe

Gemfile

Select a language

Ruby

Python

PHP

Java

Node.js

Go

.NET

No results

# If you use bundler, you can add this line to your Gemfile
gem 'stripe'

Create a Checkout Session Client-side Server-side

A Checkout Session controls what your customer sees in the payment form such as line items, the order amount, and currency. Add a checkout button to your website that calls a server-side endpoint to create a Checkout Session.

checkout.html

<html>
 <head>
 <title>Checkout</title>
 </head>
 <body>
 <form action="/create-checkout-session" method="POST">
 <button type="submit">Checkout</button>
 </form>
 </body>
</html>

On your server, create a Checkout Session and redirect your customer to the URL returned in the response.

Command Line

Select a language

cURL

Stripe CLI

Ruby

Python

PHP

Java

Node.js

Go

.NET

No results

  • Stripe-Account: This header indicates a direct charge for your connected account. The connected account’s branding is used in Checkout, which allows their customers to feel like they’re interacting directly with the connected account instead of your platform.
  • line_items: This attribute represents items that your customer is purchasing and shows up in the Stripe-hosted checkout page.
  • payment_intent_data[application_fee_amount]: This attribute specifies the amount your platform deducts from the transaction as an application fee. After the payment is processed on the connected account, the application_fee_amount is transferred to the platform. See collect fees for more information.
  • success_url: Stripe redirects the customer to the success URL after they complete a payment and replaces the {the related setting} string with the Checkout Session ID. Use this to retrieve the Checkout Session and inspect the status to decide what to show your customer. You can also append your own query parameters, which persist through the redirect process. See customize redirect behaviour with a Stripe-hosted page for more information.

View charges that you create on your connected account in your payments list. Direct charges don’t show in exports, but you can find them in reports, Sigma or using the API.

Handle post-payment events Server-side

Stripe sends a checkout.session.completed event when the payment completes. Use a webhook to receive these events and run actions, such as 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 the following events when collecting payments with Checkout:

EventDescriptionNext steps
checkout.session.completedThe customer has successfully authorised the payment by submitting the Checkout form.Wait for the payment to succeed or fail.
checkout.session.async_payment_succeededThe customer’s payment succeeded.Fulfil the purchased goods or services.
checkout.session.async_payment_failedThe payment was declined, or failed for some other reason.Contact the customer through email and ask them to 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

Card numberScenarioHow to test
The card payment succeeds and doesn’t require authentication.Fill in the credit card form using the credit card number with any expiry date, CVC, and postal code.
The card payment requires authentication.Fill in the credit card form using the credit card number with any expiry date, CVC, and postal code.
The card is declined with a decline code like insufficient_funds.Fill in the credit card form using the credit card number with any expiry date, CVC, and postal code.
The UnionPay card has a variable length of 13-19 digits.Fill in the credit card form using the credit card number with any expiry date, CVC, and postal code.

See Testing for additional information to test your integration.

As a platform, you can charge your connected accounts a portion of each transaction in the form of application fees. You can set application fee pricing in the following ways:

  • Use the Platform Pricing Tool to set and test pricing rules. This no-code feature in the Stripe Dashboard is currently only available for platforms responsible for paying Stripe fees.
  • Specify application fees directly in a PaymentIntent . Fees set with this method override the pricing logic specified in the Platform Pricing Tool.

Review fee collector settings

Fee collection and reporting for direct charges differs based on your pricing model and how you configure fee responsibility. Make sure your application fee aligns with this behaviour.

Your platform can take an application fee with the following limitations:

  • The value of application _ fee _ amount must be positive and less than the amount of the charge. The application fee collected is capped at the captured amount of the charge.
  • There are no additional Stripe fees on the application fee itself.
  • In line with Brazilian regulatory and compliance requirements, platforms based outside of Brazil with Brazilian connected accounts can’t collect application fees through Stripe.
  • The currency of application _ fee _ amount depends upon a few multiple currency factors.

The resulting charge’s BalanceTransaction includes a detailed fee breakdown of both the Stripe and application fees. To provide a better reporting experience, collecting a fee generates an ApplicationFee object. Use the amount property on the ApplicationFee object for reporting.

You can view application fees in the Collected fees section of the Dashboard.

Caution

Application fees for direct charges are created asynchronously by default. If you expand the application_fee object in a charge creation request, the application fee is created synchronously as part of that request. Only expand the application_fee object if you must, because it increases the latency of the request.

To receive notifications of asynchronously created ApplicationFee objects, listen for the application_fee.created webhook event.

Flow of funds with fees

When you specify an application fee on a charge, the fee amount is transferred to your platform’s Stripe account. When processing a charge directly on the connected account, the charge amount – less the Stripe fees and application fee – is deposited into the connected account.

For example, if you make a charge of US$10 with a US$1.23 application fee (like in the previous example), US$1.23 is transferred to your platform account. US$8.18 (US$10 - US$0.59 - US$1.23) is netted in the connected account (assuming standard US Stripe fees).

If you process payments in multiple currencies, read how currencies are handled in Connect.

Customise branding

Your platform and connected accounts can use the Branding settings in the Dashboard to customise branding on the payments page. For direct charges, Checkout uses the brand settings of the connected account.

You can also use the API to update branding settings:

  • 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 _ color - Used as the background colour on the Checkout page.
  • secondary _ color - Used as the button colour on the Checkout page.

Command Line

Select a language

cURL

Stripe CLI

Ruby

Python

PHP

Java

Node.js

Go

.NET

No results

Issue refunds

Just as platforms can create charges on connected accounts, they can also create refunds of charges on connected accounts. Create a refund using your platform’s secret key while authenticated as the connected account.

Application fees aren’t automatically refunded when issuing a refund. Your platform must explicitly refund the application fee or the connected account – the account on which the charge was created – loses that amount. You can refund an application fee by passing a refund_application_fee value of true in the refund request:

Command Line

Select a language

cURL

Stripe CLI

Ruby

Python

PHP

Java

Node.js

Go

.NET

No results

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 application fee is refunded. Otherwise, a proportional amount of the application fee is refunded. Alternatively, you can provide a refund_application_fee value of false and refund the application fee separately.

Connect embedded components

Connect embedded components support direct charges. By using the payments embedded component, you can let your connected accounts view payment information, capture charges, and manage disputes from within your site.

The following components display information for direct charges:

See also

Last verified 2026-09-27

Is this helpful?