Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
Overview
Get started with Connect
Integration fundamentals
Example integrations
Account management
Onboard accounts
Configure account Dashboards
Work with connected account types
Payment processing
Accept payments
Pay out to accounts
Platform administration
Manage your Connect platform
    Understand your Connect business
    Dashboard account management
    Remediation links
    Risk management with Connect
    Platform pricing tools
    Network cost passthrough for platforms
Tax forms for your Connect platform
HomePlatforms and marketplacesManage your Connect platform

Network cost passthrough for platformsPrivate preview

Learn how to pass network costs from a platform to your connected accounts.

Network cost passthrough (IC++) is a capability for platforms to pass network costs through to their connected accounts. This allows you to offer IC+ pricing to your connected accounts instead of charging a blended rate for all card payments.

Stripe first charges network costs to your platform account. Within a few hours, we help you recover these costs from the connected account’s balance and add them to the platform’s balance, to ensure that the platform is fully compensated for the network costs. This includes all network cost adjustments related to network costs, including non-transactional scheme fees, refunds, and disputes.

Manage network cost passthrough status for your connected accounts

If you created the connected account in Stripe and have access to the stripe_account_id, you can set new accounts as network cost passthrough or transition existing accounts to network cost passthrough.

Set an account as network cost passthrough

To set an account as network cost passthrough, you must schedule a new Pricing Config Scheme object with the network_costs type using the Pricing Config Scheme Create API:

Command Line
cURL
No results
curl https://api.stripe.com/v1/pricing_configs/network_costs/schemes \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-07-30.preview; network_costs_private_preview=v1" \ -H "Stripe-Account:
{{CONNECTED_ACCOUNT_ID}}
" \
-d enabled=true
{ "id": "pcsch_1RtBMrPGj7LS2ZC4NtVvHirY", "object": "pricing_config_scheme", "enabled": true, "ends_at": null, "livemode": true, "pricing_config": "network_costs", "starts_at": 1754502193 }

This immediately sets the account for network cost passthrough, allowing Stripe to begin passing through network costs to the connected account. If you enable network cost passthrough on an account in the middle of the month, network costs get recovered from the connected account from the time of enablement, not the entire month.

Optionally, to set the account as network cost passthrough at a future date, you can pass the timestamp in the starts_at parameter. This determines the time that network costs begin to pass through to the connected account.

You can only create one scheduled scheme at a time for each connected account. If you attempt to create a new scheme while you already have one scheduled, it results in a 400 error. Schemes are immutable, meaning you need to delete and re-create scheduled schemes to make any changes.

You can find current and scheduled schemes in the Pricing Config object using the current_scheme and next_scheme parameters.

Command Line
cURL
No results
curl -G https://api.stripe.com/v1/pricing_configs/network_costs \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-07-30.preview; network_costs_private_preview=v1" \ -H "Stripe-Account:
{{CONNECTED_ACCOUNT_ID}}
" \
-d "expand[]"=current_scheme \ -d "expand[]"=next_scheme
{ "id": "network_costs", "object": "pricing_config", "current_scheme": { "id": "pcsch_1RtBSlPGj7LS2ZC4P6VEQe8l", "object": "pricing_config_scheme", "enabled": false, "ends_at": 1754614254, "livemode": true, "pricing_config": "network_costs", "starts_at": 1754502559 }, "livemode": true, "next_scheme": { "id": "pcsch_1RtBhkPGj7LS2ZC4U7LWEvLX", "object": "pricing_config_scheme", "enabled": true, "ends_at": null, "livemode": true, "pricing_config": "network_costs", "starts_at": 1754614254 } }

Unset an account as network cost passthrough

You can unset accounts as network cost passthrough by creating a new network_costs Pricing Scheme and setting it to enabled = false.

Command Line
cURL
No results
curl https://api.stripe.com/v1/pricing_configs/network_costs/schemes \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-07-30.preview; network_costs_private_preview=v1" \ -H "Stripe-Account:
{{CONNECTED_ACCOUNT_ID}}
" \
-d enabled=false
{ "id": "pcsch_1RtBSlPGj7LS2ZC4P6VEQe8l", "object": "pricing_config_scheme", "enabled": false, "ends_at": null, "livemode": true, "pricing_config": "network_costs", "starts_at": 1754502559 }

After you apply this scheme, Stripe doesn’t charge network costs to the connected account, meaning the account is no longer on network cost passthrough pricing.

To delete a scheduled scheme, use the DELETE endpoint:

Command Line
cURL
No results
curl -X DELETE https://api.stripe.com/v1/pricing_configs/network_costs/schemes/pcsch_1RtBWbPGj7LS2ZC4q5lrEuNG \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-07-30.preview; network_costs_private_preview=v1" \ -H "Stripe-Account:
{{CONNECTED_ACCOUNT_ID}}
"
{ "id": "pcsch_1RtBWbPGj7LS2ZC4q5lrEuNG", "object": "pricing_config_scheme", "deleted": true }

You can’t delete a scheme that has a starts_at date that’s in the past. If you attempt to do so, Stripe returns a 400 error that prompts you to schedule a new scheme.

View the network cost passthrough status for an account

The Pricing Config Scheme current_at endpoint returns the pricing scheme that you applied at a specific timestamp:

Command Line
cURL
No results
curl -G https://api.stripe.com/v1/pricing_configs/network_costs/schemes/current_at \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-07-30.preview; network_costs_private_preview=v1" \ -H "Stripe-Account:
{{CONNECTED_ACCOUNT_ID}}
" \
-d current_at=1754502879
{ "id": "pcsch_1RtBSlPGj7LS2ZC4P6VEQe8l", "object": "pricing_config_scheme", "enabled": true, "ends_at": 1754503791, "livemode": true, "pricing_config": "network_costs", "starts_at": 1754502879 }

If you call this endpoint with an current_at date before the account’s creation date, Stripe returns a 400 error.

Adjust the application fee for your connected accounts

Connected accounts on blended pricing typically incur higher application fees to cover the underlying network cost, and connected accounts that pay for their own network costs typically pay lower application fees. You can update your pricing logic for application fees in one of two ways:

  1. Update your internal pricing engine: If you maintain the logic of how much to charge in application fees for each charge and connected account, you need to add the conditional logic in your internal engine to lower the application fees and set the contracted price for a connected account that also pays their own network costs.
  2. Update your pricing in the platform pricing tool: If you use the platform pricing tool to execute your application fee pricing strategy, you need to edit your strategy to incorporate differentiated pricing for card payments for users set for network cost passthrough. Typically, the pricing for blended and IC+ priced connected accounts are identical in every aspect except for card payments, where the IC++ connected accounts’ application fee is lower because they’re also paying network costs.

To manage your pricing strategy, we recommend that you:

  1. Create a pricing group for your IC++ connected accounts.
  2. Copy the pricing scheme you use for blended rate users.
  3. Modify the card payments price, assign that new pricing scheme to the IC++ connected account group, then add your IC++ connected accounts to the group.

Provide network cost reports to your connected accounts

We provide two reports that you can share with your connected accounts to help them understand their network costs:

  • IC plan-level report: This report helps connected accounts understand the monthly network costs across all their charges. It provides interchange plan names and an aggregated scheme fee total. This is similar to what other payment service providers offer. This report shows data at the calendar month level.
  • IC+ transaction-level report: This report helps connected accounts understand transaction costs at an individual transaction-level. It provides information about which charges led to higher network costs and how refunds and disputes impact network costs. This report shows data at the calendar month level.

You can choose which reports to offer your connected accounts. Use the Reporting API to run these reports for each connected account for each calendar month. Learn more about running a report from the API.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/reporting/report_runs \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Account:
{{CONNECTED_ACCOUNT_ID}}
"
\ -d report_type="connect_card_payments_fees.plan_level.1" \ -d "parameters[interval_start]"=1680000000 \ -d "parameters[interval_end]"=1680100000
{ "id": "frr_1RmMIdPHHHwdjQjw3kOoBamc", "object": "reporting.report_run", "created": 1752875919, "error": null, "livemode": true, "parameters": { "interval_end": 1680100000, "interval_start": 1680000000 }, "report_type": "connect_card_payments_fees.plan_level.1", "result": { "id": "file_1RmM67PHHHwdjQjwvvCB2JwD", "object": "file", "created": 1752875143, "expires_at": 1784411143, "filename": "frr_1RmM5wPHHHwdjQjwgfvy9rXJ.csv", "links": { "object": "list", "data": [], "has_more": false, "url": "/v1/file_links?file=file_1RmM67PHHHwdjQjwvvCB2JwD" }, "purpose": "finance_report_run", "size": 464, "title": "FinanceReportRun frr_1RmM5wPHHHwdjQjwgfvy9rXJ", "type": "csv", "url": "https://files.stripe.com/v1/files/file_1RmM67PHHHwdjQjwvvCB2JwD/contents" }, "status": "succeeded", "succeeded_at": 1752875919 }

The IC+ plan-level and transaction-level reports can take several minutes to execute. If the status in the response from the above API call is pending, we recommend adding an Event Listener for the reporting.report_run.succeeded event. After you receive the event for the report run that you created, make sure that you compare it with the ID (for example, frr_...) associated with your report run. Learn more about the recommended integration pattern for automated reporting.

The following table outlines the key columns and their descriptions for understanding the IC+ plan-level and transaction-level reports. These reports help connected accounts track their associated network costs.

Column nameDescription
platform_idThe ID of the platform that’s facilitating the charge.
connected_account_idThe ID of the connected account that the charge was processed for, and the one that eventually paid for the network costs.
connected_account_nameThe name of the connected that the charge was processed for, and the one that eventually paid for the network costs.
plan_nameThe name of the interchange plan. All scheme plans are aggregated into a single row called Scheme fees.
variable_rateThe variable rate charged by the networks for the specific plans.
variable_volumeThe volume that was evaluated for network costs for the specific plans.
fixed_rateThe fixed fees associated with the volume that was evaluated for the specific plans.
countThe number of charges that were evaluated for network costs for the specific plan.
fee_amountThe total amount of network costs charged.
fee_currencyThe currency of the network costs fee charged.
network_cost_categoryThe category of the network cost being charged. One of either card_scheme or interchange_or_discount.
billing_amountThe total amount for this fee deducted from your Stripe balance, including taxes and after any currency conversion. Expressed in major units of billing_currency.
billing_currencyThe three-letter ISO code for the currency that your Stripe balance is debited in for this fee.

The following table outlines the key columns and their descriptions related to the billing transactions associated with network cost recovery. Understand these columns to help clarify the financial interactions between connected accounts and the platform.

Column nameDescription
connected_account_idThe ID of the connected account that the charge was processed for, and the account that eventually paid for the network costs.
connected_account_nameThe ID of the connected account that the charge was processed for, and the account that eventually paid for the network costs.
balance_transaction_idThe unique identifier for the balance transaction for the network cost fees recovered by the platform.
balance_transaction_createdThe timestamp of when the balance transaction was created for the network cost that was recovered by the platform.
automatic_payout_idThe ID of the automatically created payout associated with this balance transaction (only set if your account is on an automatic payout schedule).
fee_incurred_atThe time (in UTC) of the event that incurred this fee.
charge_idThe unique ID of the charge presented to the connected account. For charges that settle on the connected account, this field contains the value of the ID of the charge. For charges that settle on the platform and are then transferred to the connected account, this field contains the value of the transfer.
source_transaction_idThe unique ID of the related charge, if any. For charges, this is the charge itself; for refunds or disputes, this is the original charge being refunded or disputed.
captured_amountThe amount captured on the charge.
captured_currencyThe currency of the captured amount.
refund_idThe unique ID of the related refund, if any.
dispute_idThe unique ID of the related dispute, if any.
card_brandThe card brand, if applicable.
binThe Bank Identification Number (BIN) associated with the card used in the transaction. The BIN is associated with the bank that issued the card. You can use BINs to look up information about the issuing bank and about the card itself.
transfer_idThe ID of the transfer object that captures the network cost recovery between the connected account and the platform.
platform_transfer_idThe ID of the transfer object for the platform to receive the network costs from the connected account. This is only relevant for platforms.
transfer_createdThe timestamp of the transfer between the connected account and the platform for network cost recovery.
issuing_bankThe name of the bank that issued the card, which is usually (but not always) available to Stripe.
card_fundingThe card funding type, if applicable.
card_countryThe two-letter ISO code representing the country of the card.
card_presentIf true, it indicates that a charge associated with this fee was initiated by either a magnetic Stripe swipe or EMV chip read.
fee_categoryEither platform_fee (that denotes the application fees charged by the platform) or network_cost (that denotes the fees set by a payment network).
card_scheme_feeThe transactional scheme fees associated with the particular charge.
interchange_or_discount_feeThe Interchange or discount fees associated with the charge.
non_transactional_card_scheme_feeThe non-transactional card scheme fees associated with the charge.
platform_application_feeThe application fees charged by the platform for this charge.
billing_amountThe total amount for this fee deducted from your Stripe balance, including taxes and after any currency conversion. Expressed in major units of billing_currency.
billing_currencyThe three-letter ISO code for the currency that your Stripe balance is debited in for this fee.

Here’s an example of what the reporting.report_run.succeeded event might look like:

{ "id": "evt_1RtCRKPHHHwdjQjwfRPzuvep", "object": "event", "account": "acct_1234", "api_version": "2025-07-30.preview; network_costs_private_preview=v1", "context": "acct_1234", "created": 1754506314, "data": { "object": { "id": "frr_1RmMIdPHHHwdjQjw3kOoBamc", "object": "reporting.report_run", "created": 1754503324, "error": null, "livemode": true, "parameters": { "interval_end": 1751328000, "interval_start": 1748736000 }, "report_type": "connect_card_payments_fees.plan_level.1", "result": { "id": "file_1RtCRKPHHHwdjQjwDeGKimBi", "object": "file", "created": 1754506314, "expires_at": 1786042314, "filename": "frr_1RtBf6PHHHwdjQjwgr4SWj6Q.csv", "links": { "object": "list", "data": [], "has_more": false, "url": "/v1/file_links?file=file_1RtCRKPHHHwdjQjwDeGKimBi" }, "purpose": "finance_report_run", "size": 748, "title": "FinanceReportRun frr_1RtBf6PHHHwdjQjwgr4SWj6Q", "type": "csv", "url": "https://files.stripe.com/v1/files/file_1RtCRKPHHHwdjQjwDeGKimBi/contents" }, "status": "succeeded", "succeeded_at": 1754506314 } }, "livemode": true, "pending_webhooks": 1, "request": { "id": null, "idempotency_key": null }, "type": "reporting.report_run.succeeded" }

Then, you can retrieve the report for the connected account using result_url:

Command Line
curl
No results
curl https://files.stripe.com/v1/files/file_1RtCRKPHHHwdjQjwDeGKimBi/contents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
{ "platform_id": "acct_1GcldzAppfGnVJgH", "connected_account_id": "acct_1PzmZGPHHHwdjQjw", "connected_account_name": null, "plan_name": "All scheme fees", "network_cost_category": "card_scheme", "total_amount": "0.005991", "fee_currency": "usd", "livemode": true }, { "platform_id": "acct_1GcldzAppfGnVJgH", "connected_account_id": "acct_1PzmZGPHHHwdjQjw", "connected_account_name": null, "plan_name": "CPS Services", "network_cost_category": "interchange", "total_amount": "0.025750", "fee_currency": "usd", "livemode": true }, { "platform_id": "acct_1GcldzAppfGnVJgH", "connected_account_id": "acct_1PzmZGPHHHwdjQjw", "connected_account_name": null, "plan_name": "Visa Traditional - Product 1", "network_cost_category": "interchange", "total_amount": "0.016175", "fee_currency": "usd", "livemode": true }

Retrieve the IC+ transaction-level report for a connected account for a specific month

You can generate the IC+ transaction-level report for a connected account for a specific month. Learn more about running a report from the API.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/reporting/report_runs \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Account:
{{CONNECTED_ACCOUNT_ID}}
"
\ -d report_type="connect_card_payments_fees.transaction_level.1" \ -d "parameters[interval_start]"=1680000000 \ -d "parameters[interval_end]"=1680100000
{ "id": "frr_1RmMK3PHHHwdjQjw0pJ2Nsga", "object": "reporting.report_run", "created": 1752876007, "error": null, "livemode": true, "parameters": { "interval_end": 1680100000, "interval_start": 1680000000 }, "report_type": "connect_card_payments_fees.transaction_level.1", "result": { "id": "file_1RmM8wPHHHwdjQjwkHoUYySJ", "object": "file", "created": 1752875318, "expires_at": 1784411318, "filename": "frr_1RmM8sPHHHwdjQjwHgTQ3dlv.csv", "links": { "object": "list", "data": [], "has_more": false, "url": "/v1/file_links?file=file_1RmM8wPHHHwdjQjwkHoUYySJ" }, "purpose": "finance_report_run", "size": 6307, "title": "FinanceReportRun frr_1RmM8sPHHHwdjQjwHgTQ3dlv", "type": "csv", "url": "https://files.stripe.com/v1/files/file_1RmM8wPHHHwdjQjwkHoUYySJ/contents" }, "status": "succeeded", "succeeded_at": 1752876007 }

We recommend that you listen for the reporting.report_run.succeeded event.

Then, you can retrieve the report for the connected account using result_url:

Command Line
curl
No results
curl https://files.stripe.com/v1/files/file_1RmM8wPHHHwdjQjwkHoUYySJ/contents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
{ "platform_id": "acct_1GcldzAppfGnVJgH", "connected_account_id": "acct_1PzmZGPHHHwdjQjw", "connected_account_name": null, "transfer_id": "tr_1RWQcfPHHHwdjQjwZtsZqox6", "transfer_created": "2025-06-04T23:21:32.000Z", "balance_transaction_id": "txn_1RWQckPHHHwdjQjwRZSrO0tE", "balance_transaction_created": "2025-06-04T23:21:32.000Z", "automatic_payout_id": "po_1RXu75PHHHwdjQjwNGy9TPIx", "fee_incurred_at": "2025-06-02T16:48:13.000Z", "charge_id": "ch_3RTq8hPHHHwdjQjw1qxQ9aBj", "captured_amount": null, "captured_currency": null, "refund_id": "re_3RTq8hPHHHwdjQjw1QQUI2VO", "dispute_id": null, "card_brand": "MasterCard", "bin": "545660", "issuing_bank": "SUTTON BANK", "card_funding": "prepaid", "card_country": "US", "card_present": false, "fee_category": "network_cost", "card_scheme_fee": "0.000203", "interchange_fee": "0.000000", "non_transactional_card_scheme_fee": "0.000000", "discount_fee": "0.000000", "platform_application_fee": "0.000000", "total_amount": "0.000203", "fee_currency": "usd", "livemode": true }, { "platform_id": "acct_1GcldzAppfGnVJgH", "connected_account_id": "acct_1PzmZGPHHHwdjQjw", "connected_account_name": null, "transfer_id": "tr_1RWMxzPHHHwdjQjwOH8PHSiq", "transfer_created": "2025-06-04T19:27:15.000Z", "balance_transaction_id": "txn_1RWMxzPHHHwdjQjwwZu9lZMg", "balance_transaction_created": "2025-06-04T19:27:15.000Z", "automatic_payout_id": "po_1RXu75PHHHwdjQjwNGy9TPIx", "fee_incurred_at": "2025-06-02T16:49:15.000Z", "charge_id": "ch_3RTq8hPHHHwdjQjw1qxQ9aBj", "captured_amount": null, "captured_currency": null, "refund_id": "re_3RTq8hPHHHwdjQjw1QQUI2VO", "dispute_id": null, "card_brand": "MasterCard", "bin": "545660", "issuing_bank": "SUTTON BANK", "card_funding": "prepaid", "card_country": "US", "card_present": false, "fee_category": "network_cost", "card_scheme_fee": "0.000218", "interchange_fee": "0.000000", "non_transactional_card_scheme_fee": "0.000000", "discount_fee": "0.000000", "platform_application_fee": "0.000000", "total_amount": "0.000218", "fee_currency": "usd", "livemode": true }
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Join our early access program.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc