--- title: "Transaction fees" description: "Learn how to handle the fees incurred on a payment." url: "https://docs.adyen.com/platforms/online-payments/transaction-fees" source_url: "https://docs.adyen.com/platforms/online-payments/transaction-fees.md" canonical: "https://docs.adyen.com/platforms/online-payments/transaction-fees" last_modified: "2023-04-28T17:05:00+02:00" language: "en" --- # Transaction fees Learn how to handle the fees incurred on a payment. The information on this page applies to both online payments and in-person payments. Transaction fees refer to the costs you incur on a transaction in your platform that are not known at the time of payment. They are calculated by Adyen after we receive the payment request. By default, these costs are deducted from your liable balance account, but there are some payment-related fees that you can book to your user by including split instructions in your requests. ## Requirements If your platform can already process payments, there are no additional requirements, limitations, or preparations. ## Payment-related fees While Adyen deducts all payment-related fees from your platform's liable balance account by default, you can decide to book them directly to your user. This is useful if you want to pass on the transaction fees, instead of settling this later by transferring funds between balance accounts. You can charge the following fees directly to your user: * Interchange * Scheme Fees * Adyen's Markup * Adyen's Commission There are other fees due to Adyen that *cannot* be passed on to your users in payment requests: * Processing costs: These fees are aggregated and also applicable to refused and cancelled payments. Therefore, they cannot be allocated to individual payments. This also applies to other aggregated fees, such as 3DS enrollment costs. * Tiered pricing: Any discounts that are derived from tiered pricing structures cannot be allocated to individual payments. ## Transaction fee types You can book different types of transaction fees to different balance accounts in your platform. Depending on whether you want to aggregate fees or book individual fee types to specific balance accounts, you can include additional split items with a different `type` in your request. | Type | Aggregated fees | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | **AdyenCommission** | | The transaction fee due to Adyen under [blended rates](https://www.adyen.com/knowledge-hub/get-the-best-from-your-card-processing). | | **AdyenMarkup** | | The transaction fee due to Adyen under [Interchange ++ pricing](https://www.adyen.com/pricing). | | **Interchange** | | The fee paid to the issuer for each payment made with the card network. | | **SchemeFee** | | The fee paid to the card scheme for using their network. | | **AdyenFees** | ![Required](/user/pages/reuse/image-library/01.icons/required/required.svg?decoding=auto\&fetchpriority=auto) | The aggregated amount of Adyen's commission and markup fees. | | **AcquiringFees** | ![Required](/user/pages/reuse/image-library/01.icons/required/required.svg?decoding=auto\&fetchpriority=auto) | The aggregated amount of the interchange and scheme fees. | | **PaymentFee** | ![Required](/user/pages/reuse/image-library/01.icons/required/required.svg?decoding=auto\&fetchpriority=auto) | The aggregated amount of all transaction fees. | To make reconciliation easier, we recommend to always include split instructions for the transaction fees in your payment or capture request, even if you want to deduct the fees from your liable balance account. If you don't include booking instructions for any of the transaction fee types in your payment request, Adyen automatically updates the request to include the **PaymentFee** split type, deducting all transaction fees from your platform's liable balance account. The following diagram shows how the transaction fee types relate to each other. ![](/user/pages/reuse/pfs-payments/transaction-fees/fee-types/split_types.svg?decoding=auto\&fetchpriority=auto) If you send a payment request with multiple split items for different transaction fee types, they are processed based on the granularity of the fee type. The booking instructions sent for more granular fee types override the instructions for the aggregated fees. | Type | Behavior | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **PaymentFee** | If another fee type is sent in the request as well, it overrides part of the instructions sent for **PaymentFee**: that specific fee type is booked to another balance account, while the remaining fee types are booked to the balance account specified for **PaymentFee**. | | **AcquiringFees** | Overrides part of the instructions sent for the **PaymentFee** split type, booking the Interchange and Scheme fees to another balance account. | | **Interchange** | Overrides part of the instructions sent for the **PaymentFee** or **AcquiringFees** split types, booking the Interchange to another balance account. | | **SchemeFee** | Overrides part of the instructions sent for the **PaymentFee** or **AcquiringFees** split types, booking the Scheme fees to another balance account. | | **AdyenFees** | Overrides part of the instructions sent for the **PaymentFee** split type, booking Adyen's Commission and Markup to another balance account. | | **AdyenCommission** | Overrides part of the instructions sent for the **PaymentFee** or **AdyenFees** split type, booking Adyen's Commission to another balance account. | | **AdyenMarkup** | Overrides part of the instructions sent for the **PaymentFee** or **AdyenFees** split type, booking Adyen's Markup to another balance account. | For example, you can include two split items for transaction fees in your payment request: * `type` **AdyenMarkup**: book Adyen's Markup to your platform's liable balance account * `type` **PaymentFee**: book all other transaction fees (interchange, scheme fees, and Adyen's commission) to your user's balance account **Split items for transaction fees in a payment request** ```json { "account": "BA00000000000000000000001", "reference": "Your reference for the payment fees", "description": "Your description for the payment fees", "type": "PaymentFee" }, { "account": "BA00000000000000000LIABLE", "reference": "Your reference for the Markup", "description": "Your description for the Markup", "type": "AdyenMarkup" } ``` If only the **PaymentFee** were specified in the request, all transaction fees would be booked to the same balance account, because **PaymentFee** aggregates all fee types, including the Markup. However, because **AdyenMarkup** is also sent in the request, and it is on a more granular level than **PaymentFee**, **AdyenMarkup** overrides **PaymentFee** for booking the Markup. This means that the Interchange, Scheme fee, and Adyen's Commission are booked to the user's balance account **BA00000000000000000000001**, while the Markup is booked to your liable account **BA00000000000000000LIABLE**. ## Book transaction fees to specific balance accounts The following example shows a split payment request for EUR 80.00 where: * EUR 75.00 is credited to your user's balance account as payment for the goods or services rendered. * EUR 5.00 is credited to your liable balance account as your platform's commission. * The acquiring fees (the aggregated amount of the Interchange and Scheme fees) are deducted from your user's balance account. * The fees due to Adyen (the aggregated amount of Adyen's Commission and Markup) are deducted from your liable balance account. To book the transaction fees to different balance accounts: 1. Make a POST [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-splits) or POST [/sessions](https://docs.adyen.com/api-explorer/Checkout/latest/post/sessions#request-splits) request.\ In the `splits` array of your request, include two additional split items for the transaction fees. For each split item, specify the following fields: | Parameter | Required | Description | | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [account](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-splits-account) | ![Required](/user/pages/reuse/image-library/01.icons/required/required.svg?decoding=auto\&fetchpriority=auto) | The `balanceAccountId` of your user's balance account that you want to charge for the specific type transaction fee. | | [type](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-splits-type) | ![Required](/user/pages/reuse/image-library/01.icons/required/required.svg?decoding=auto\&fetchpriority=auto) | Defines the part of the payment you want to book to the specified `account`. Set this to:- **AcquiringFees** in the split item where you want to book the aggregated amount of the Interchange and Scheme fees. - **AdyenFees** in the split item where you want to book the aggregated amount of Adyen's Commission and Markup. | | [reference](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-splits-reference) | ![Required](/user/pages/reuse/image-library/01.icons/required/required.svg?decoding=auto\&fetchpriority=auto) | Your unique identifier for the specific transaction split. | | [description](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-splits-reference) | | Your description for the specific transaction split, which is returned in our reporting. | Here is an example split payment request where you book the transaction fees to different balance accounts. **Book transaction fees to different balance accounts** #### curl ```bash curl https://checkout-test.adyen.com/v72/payments \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -X POST \ -d '{ "paymentMethod": { "type": "scheme", "number": "4111111111111111", "cvc": "737", "expiryMonth": "03", "expiryYear": "2030", "holderName": "John Smith" }, "amount": { "value": 8000, "currency": "USD" }, "reference": "YOUR_ORDER_NUMBER", "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "returnUrl": "https://your-company.example.com/...", "splits":[ { "amount": { "value": 7500 }, "type": "BalanceAccount", "account": "BA00000000000000000000001", "reference": "Your reference for the sale amount", "description": "Your description for the sale amount" }, { "amount": { "value": 500 }, "type": "Commission", "reference": "Your reference for your commission", "description": "Your description for your commission" }, { "account": "BA00000000000000000000001", "reference": "Your reference for the acquiring fees", "description": "Your description for the acquiring fees", "type": "AcquiringFees" }, { "account": "BA00000000000000000LIABLE", "reference": "Your reference for the Adyen fees", "description": "Your description for the Adyen fees", "type": "AdyenFees" } ] }' ``` #### Java ```java // Adyen Java API Library v40.0.0 import com.adyen.Client; import com.adyen.enums.Environment; import com.adyen.model.checkout.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.model.RequestOptions; import com.adyen.service.checkout.*; // For the LIVE environment, also include your liveEndpointUrlPrefix. Client client = new Client("ADYEN_API_KEY", Environment.TEST); // Create the request object(s) SplitAmount splitAmount1 = new SplitAmount() .value(7500L); SplitAmount splitAmount2 = new SplitAmount() .value(500L); Amount amount = new Amount() .currency("USD") .value(8000L); Split split1 = new Split() .reference("Your reference for the sale amount") .amount(splitAmount1) .description("Your description for the sale amount") .type(Split.TypeEnum.BALANCEACCOUNT) .account("BA00000000000000000000001"); Split split2 = new Split() .reference("Your reference for your commission") .amount(splitAmount2) .description("Your description for your commission") .type(Split.TypeEnum.COMMISSION); Split split3 = new Split() .reference("Your reference for the acquiring fees") .description("Your description for the acquiring fees") .type(Split.TypeEnum.ACQUIRINGFEES) .account("BA00000000000000000000001"); Split split4 = new Split() .reference("Your reference for the Adyen fees") .description("Your description for the Adyen fees") .type(Split.TypeEnum.ADYENFEES) .account("BA00000000000000000LIABLE"); CardDetails cardDetails = new CardDetails() .number("4111111111111111") .cvc("737") .holderName("John Smith") .expiryMonth("03") .expiryYear("2030") .type(CardDetails.TypeEnum.SCHEME); PaymentRequest paymentRequest = new PaymentRequest() .reference("YOUR_ORDER_NUMBER") .amount(amount) .splits(Arrays.asList(split1, split2, split3, split4)) .merchantAccount("YOUR_MERCHANT_ACCOUNT") .paymentMethod(new CheckoutPaymentMethod(cardDetails)) .returnUrl("https://your-company.example.com/..."); // Send the request PaymentsApi service = new PaymentsApi(client); PaymentResponse response = service.payments(paymentRequest, new RequestOptions().idempotencyKey("UUID")); ``` #### PHP ```php setXApiKey("ADYEN_API_KEY"); // For the LIVE environment, also include your liveEndpointUrlPrefix. $client->setEnvironment(Environment::TEST); // Create the request object(s) $splitAmount1 = new SplitAmount(); $splitAmount1 ->setValue(7500); $splitAmount2 = new SplitAmount(); $splitAmount2 ->setValue(500); $amount = new Amount(); $amount ->setCurrency("USD") ->setValue(8000); $split1 = new Split(); $split1 ->setReference("Your reference for the sale amount") ->setAmount($splitAmount1) ->setDescription("Your description for the sale amount") ->setType("BalanceAccount") ->setAccount("BA00000000000000000000001"); $split2 = new Split(); $split2 ->setReference("Your reference for your commission") ->setAmount($splitAmount2) ->setDescription("Your description for your commission") ->setType("Commission"); $split3 = new Split(); $split3 ->setReference("Your reference for the acquiring fees") ->setDescription("Your description for the acquiring fees") ->setType("AcquiringFees") ->setAccount("BA00000000000000000000001"); $split4 = new Split(); $split4 ->setReference("Your reference for the Adyen fees") ->setDescription("Your description for the Adyen fees") ->setType("AdyenFees") ->setAccount("BA00000000000000000LIABLE"); $checkoutPaymentMethod = new CheckoutPaymentMethod(); $checkoutPaymentMethod ->setNumber("4111111111111111") ->setCvc("737") ->setHolderName("John Smith") ->setExpiryMonth("03") ->setExpiryYear("2030") ->setType("scheme"); $paymentRequest = new PaymentRequest(); $paymentRequest ->setReference("YOUR_ORDER_NUMBER") ->setAmount($amount) ->setSplits(array($split1, $split2, $split3, $split4)) ->setMerchantAccount("YOUR_MERCHANT_ACCOUNT") ->setPaymentMethod($checkoutPaymentMethod) ->setReturnUrl("https://your-company.example.com/..."); $requestOptions['idempotencyKey'] = 'UUID'; // Send the request $service = new PaymentsApi($client); $response = $service->payments($paymentRequest, $requestOptions); ``` #### C\# ```cs // Adyen .NET API Library v32.2.1 using Adyen; using Environment = Adyen.Model.Environment; using Adyen.Model; using Adyen.Model.Checkout; using Adyen.Service.Checkout; // For the LIVE environment, also include your liveEndpointUrlPrefix. var config = new Config() { XApiKey = "ADYEN_API_KEY", Environment = Environment.Test }; var client = new Client(config); // Create the request object(s) SplitAmount splitAmount1 = new SplitAmount { Value = 7500 }; SplitAmount splitAmount2 = new SplitAmount { Value = 500 }; Amount amount = new Amount { Currency = "USD", Value = 8000 }; Split split1 = new Split { Reference = "Your reference for the sale amount", Amount = splitAmount1, Description = "Your description for the sale amount", Type = Split.TypeEnum.BalanceAccount, Account = "BA00000000000000000000001" }; Split split2 = new Split { Reference = "Your reference for your commission", Amount = splitAmount2, Description = "Your description for your commission", Type = Split.TypeEnum.Commission }; Split split3 = new Split { Reference = "Your reference for the acquiring fees", Description = "Your description for the acquiring fees", Type = Split.TypeEnum.AcquiringFees, Account = "BA00000000000000000000001" }; Split split4 = new Split { Reference = "Your reference for the Adyen fees", Description = "Your description for the Adyen fees", Type = Split.TypeEnum.AdyenFees, Account = "BA00000000000000000LIABLE" }; CardDetails cardDetails = new CardDetails { Number = "4111111111111111", Cvc = "737", HolderName = "John Smith", ExpiryMonth = "03", ExpiryYear = "2030", Type = CardDetails.TypeEnum.Scheme }; PaymentRequest paymentRequest = new PaymentRequest { Reference = "YOUR_ORDER_NUMBER", Amount = amount, Splits = new List{ split1, split2, split3, split4 }, MerchantAccount = "YOUR_MERCHANT_ACCOUNT", PaymentMethod = new CheckoutPaymentMethod(cardDetails), ReturnUrl = "https://your-company.example.com/..." }; // Send the request var service = new PaymentsService(client); var response = service.Payments(paymentRequest, requestOptions: new RequestOptions { IdempotencyKey = "UUID"}); ``` #### NodeJS (JavaScript) ```js // Adyen Node API Library v30.0.0 const { Client, CheckoutAPI } = require('@adyen/api-library'); // For the LIVE environment, also include your liveEndpointUrlPrefix. const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const paymentRequest = { paymentMethod: { type: "scheme", number: "4111111111111111", cvc: "737", expiryMonth: "03", expiryYear: "2030", holderName: "John Smith" }, amount: { value: 8000, currency: "EUR" }, reference: "YOUR_ORDER_NUMBER", merchantAccount: "YOUR_MERCHANT_ACCOUNT", returnUrl: "https://your-company.example.com/...", splits: [ { amount: { value: 7500 }, type: "BalanceAccount", account: "BA00000000000000000000001", reference: "Your reference for the sale amount", description: "Your description for the sale amount" }, { amount: { value: 500 }, type: "Commission", reference: "Your reference for your commission", description: "Your description for your commission" }, { account: "BA00000000000000000000001", reference: "Your reference for the acquiring fees", description: "Your description for the acquiring fees", type: "AcquiringFees" }, { account: "BA00000000000000000LIABLE", reference: "Your reference for the Adyen fees", description: "Your description for the Adyen fees", type: "AdyenFees" } ] } // Send the request const checkoutAPI = new CheckoutAPI(client); const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" }); ``` #### Go ```go // Adyen Go API Library v21.1.0 import ( "context" "github.com/adyen/adyen-go-api-library/v21/src/common" "github.com/adyen/adyen-go-api-library/v21/src/adyen" "github.com/adyen/adyen-go-api-library/v21/src/checkout" ) // For the LIVE environment, also include your liveEndpointUrlPrefix. client := adyen.NewClient(&common.Config{ ApiKey: "ADYEN_API_KEY", Environment: common.TestEnv, }) // Create the request object(s) splitAmount1 := checkout.SplitAmount{ Value: 7500, } splitAmount2 := checkout.SplitAmount{ Value: 500, } amount := checkout.Amount{ Currency: "USD", Value: 8000, } split1 := checkout.Split{ Reference: common.PtrString("Your reference for the sale amount"), Amount: &splitAmount1, Description: common.PtrString("Your description for the sale amount"), Type: "BalanceAccount", Account: common.PtrString("BA00000000000000000000001"), } split2 := checkout.Split{ Reference: common.PtrString("Your reference for your commission"), Amount: &splitAmount2, Description: common.PtrString("Your description for your commission"), Type: "Commission", } split3 := checkout.Split{ Reference: common.PtrString("Your reference for the acquiring fees"), Description: common.PtrString("Your description for the acquiring fees"), Type: "AcquiringFees", Account: common.PtrString("BA00000000000000000000001"), } split4 := checkout.Split{ Reference: common.PtrString("Your reference for the Adyen fees"), Description: common.PtrString("Your description for the Adyen fees"), Type: "AdyenFees", Account: common.PtrString("BA00000000000000000LIABLE"), } cardDetails := checkout.CardDetails{ Number: common.PtrString("4111111111111111"), Cvc: common.PtrString("737"), HolderName: common.PtrString("John Smith"), ExpiryMonth: common.PtrString("03"), ExpiryYear: common.PtrString("2030"), Type: common.PtrString("scheme"), } paymentRequest := checkout.PaymentRequest{ Reference: "YOUR_ORDER_NUMBER", Amount: amount, Splits: []checkout.Split{ split1, split2, split3, split4, }, MerchantAccount: "YOUR_MERCHANT_ACCOUNT", PaymentMethod: checkout.CardDetailsAsCheckoutPaymentMethod(&cardDetails), ReturnUrl: "https://your-company.example.com/...", } // Send the request service := client.Checkout() req := service.PaymentsApi.PaymentsInput().IdempotencyKey("UUID").PaymentRequest(paymentRequest) res, httpRes, err := service.PaymentsApi.Payments(context.Background(), req) ``` #### Python ```py # Adyen Python API Library v14.0.0 import Adyen adyen = Adyen.Adyen() adyen.client.xapikey = "ADYEN_API_KEY" # For the LIVE environment, also include your liveEndpointUrlPrefix. adyen.client.platform = "test" # The environment to use library in. # Create the request object(s) json_request = { "paymentMethod": { "type": "scheme", "number": "4111111111111111", "cvc": "737", "expiryMonth": "03", "expiryYear": "2030", "holderName": "John Smith" }, "amount": { "value": 8000, "currency": "USD" }, "reference": "YOUR_ORDER_NUMBER", "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "returnUrl": "https://your-company.example.com/...", "splits": [ { "amount": { "value": 7500 }, "type": "BalanceAccount", "account": "BA00000000000000000000001", "reference": "Your reference for the sale amount", "description": "Your description for the sale amount" }, { "amount": { "value": 500 }, "type": "Commission", "reference": "Your reference for your commission", "description": "Your description for your commission" }, { "account": "BA00000000000000000000001", "reference": "Your reference for the acquiring fees", "description": "Your description for the acquiring fees", "type": "AcquiringFees" }, { "account": "BA00000000000000000LIABLE", "reference": "Your reference for the Adyen fees", "description": "Your description for the Adyen fees", "type": "AdyenFees" } ] } # Send the request result = adyen.checkout.payments_api.payments(request=json_request, idempotency_key="UUID") ``` #### Ruby ```rb # Adyen Ruby API Library v11.0.0 require "adyen-ruby-api-library" adyen = Adyen::Client.new adyen.api_key = 'ADYEN_API_KEY' # For the LIVE environment, also include your liveEndpointUrlPrefix. adyen.env = :test # Set to "live" for live environment # Create the request object(s) request_body = { :paymentMethod => { :type => 'scheme', :number => '4111111111111111', :cvc => '737', :expiryMonth => '03', :expiryYear => '2030', :holderName => 'John Smith' }, :amount => { :value => 8000, :currency => 'USD' }, :reference => 'YOUR_ORDER_NUMBER', :merchantAccount => 'YOUR_MERCHANT_ACCOUNT', :returnUrl => 'https://your-company.example.com/...', :splits => [ { :amount => { :value => 7500 }, :type => 'BalanceAccount', :account => 'BA00000000000000000000001', :reference => 'Your reference for the sale amount', :description => 'Your description for the sale amount' }, { :amount => { :value => 500 }, :type => 'Commission', :reference => 'Your reference for your commission', :description => 'Your description for your commission' }, { :account => 'BA00000000000000000000001', :reference => 'Your reference for the acquiring fees', :description => 'Your description for the acquiring fees', :type => 'AcquiringFees' }, { :account => 'BA00000000000000000LIABLE', :reference => 'Your reference for the Adyen fees', :description => 'Your description for the Adyen fees', :type => 'AdyenFees' } ] } # Send the request result = adyen.checkout.payments_api.payments(request_body, headers: { 'Idempotency-Key' => 'UUID' }) ``` #### NodeJS (TypeScript) ```ts // Adyen Node API Library v30.0.0 import { Client, CheckoutAPI, Types } from "@adyen/api-library"; // For the LIVE environment, also include your liveEndpointUrlPrefix. const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const splitAmount1: Types.checkout.SplitAmount = { value: 7500 }; const splitAmount2: Types.checkout.SplitAmount = { value: 500 }; const amount: Types.checkout.Amount = { currency: "USD", value: 8000 }; const split1: Types.checkout.Split = { reference: "Your reference for the sale amount", amount: splitAmount1, description: "Your description for the sale amount", type: Types.checkout.Split.TypeEnum.BalanceAccount, account: "BA00000000000000000000001" }; const split2: Types.checkout.Split = { reference: "Your reference for your commission", amount: splitAmount2, description: "Your description for your commission", type: Types.checkout.Split.TypeEnum.Commission }; const split3: Types.checkout.Split = { reference: "Your reference for the acquiring fees", description: "Your description for the acquiring fees", type: Types.checkout.Split.TypeEnum.AcquiringFees, account: "BA00000000000000000000001" }; const split4: Types.checkout.Split = { reference: "Your reference for the Adyen fees", description: "Your description for the Adyen fees", type: Types.checkout.Split.TypeEnum.AdyenFees, account: "BA00000000000000000LIABLE" }; const cardDetails: Types.checkout.CardDetails = { number: "4111111111111111", cvc: "737", holderName: "John Smith", expiryMonth: "03", expiryYear: "2030", type: Types.checkout.CardDetails.TypeEnum.Scheme }; const paymentRequest: Types.checkout.PaymentRequest = { reference: "YOUR_ORDER_NUMBER", amount: amount, splits: [split1, split2, split3, split4], merchantAccount: "YOUR_MERCHANT_ACCOUNT", paymentMethod: cardDetails, returnUrl: "https://your-company.example.com/..." }; // Send the request const checkoutAPI = new CheckoutAPI(client); const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" }); ``` 2. In the response, note that your `reference` from the request is returned as the `merchantReference`. You need this information for reconciliation. **Split payment successful** ```json { "additionalData": { "expiryDate": "3/2030", "cardHolderName": "Card Holder", "cardSummary": "1111", "adjustAuthorisationData": "BQABAQAHvP9dsM9IZ7HQFj4G4VG8V9", "PaymentAccountReference": "QFvMfHSXA1Eq7Q0opjvH6dZTw7XsU", "paymentMethod": "visa" }, "pspReference": "DQ56GRJ5S8NKGK82", "resultCode": "Authorised", "amount": { "currency": "USD", "value": 8000 }, "merchantReference": "YOUR_ORDER_NUMBER", "paymentMethod": { "brand": "visa", "type": "scheme" } } ``` ## Track fund movements To track the status of the fund transfers initiated by fees incurred by transactions processed through Adyen: 1. Listen to the following webhooks: * [Transfer webhooks](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/overview): Adyen sends a [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhook to inform your server that funds will be credited to balance accounts, and [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhooks after every status change. * [Transaction webhooks](https://docs.adyen.com/api-explorer/transaction-webhooks/latest/overview): Adyen sends a [balancePlatform.transaction.created](https://docs.adyen.com/api-explorer/transaction-webhooks/latest/post/balancePlatform.transaction.created) webhook to inform your server that funds have been credited to a balance account. 2. Acknowledge the webhooks. We send these webhooks for every split item in the payment. 3. In the payload of the [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook, note that: * The `event` array includes all previous transfer events. * The `sequenceNumber` defines the number of webhooks sent for the transfer, including the current one. ### Webhook examples The following tabs show the webhooks you would receive for transaction fees included in the example [payment request](#transaction-fees-request). ### Tab: Acquiring fees As specified in the payment request, the acquiring fees (the aggregated amount of the Interchange and Scheme fees) are deducted from your user's balance account. ** ### 1. Outgoing transfer received Once the acquiring fees are calculated, Adyen sends a [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhook with `direction` **outgoing** and `status` **received**, to announce that the **acquiring fees** will be deducted from your user's balance account. This is the aggregated amount of the interchange and scheme fees. **Received transfer request for transaction fees** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": -104 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": -104 } ], "category": "platformPayment", "categoryData": { "modificationMerchantReference": "MRef#000001", "modificationPspReference": "H3GX2NJTCMQ7C782", "paymentMerchantReference": "Your reference for the payment", "platformPaymentType": "AcquiringFees", "pspPaymentReference": "DQ56GRJ5S8NKGK82", "type": "platformPayment" }, "creationDate": "2025-10-20T11:45:11+02:00", "description": "Your description for the acquiring fees", "direction": "outgoing", "events": [ { "bookingDate": "2025-10-20T11:45:12+02:00", "id": "RFDN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -104 } ], "status": "received", "type": "accounting" } ], "id": "3JY1YI605AZ65FRB", "reason": "approved", "reference": "Your reference for the acquiring fees", "sequenceNumber": 1, "status": "received", "type": "capture" }, "environment": "test", "type": "balancePlatform.transfer.created" } ``` ** ### 2. Outgoing transfer authorized When the transfer request for the acquiring fees is authorized, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with `status` **authorised**. **Authorized transfer request** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": -104 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000001", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 0, "reserved": -104 } ], "category": "platformPayment", "categoryData": { "modificationMerchantReference": "MRef#000001", "modificationPspReference": "H3GX2NJTCMQ7C782", "paymentMerchantReference": "Payment reference", "platformPaymentType": "AcquiringFees", "pspPaymentReference": "DQ56GRJ5S8NKGK82", "type": "platformPayment" }, "creationDate": "2025-10-20T11:45:11+02:00", "description": "Your description for the acquiring fees", "direction": "outgoing", "events": [ { "bookingDate": "2025-10-20T11:45:12+02:00", "id": "RFDN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -104 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2025-10-20T11:45:12+02:00", "id": "RFDN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 104, "reserved": -104 } ], "status": "authorised", "type": "accounting" } ], "id": "3JY1YI605AZ65FRB", "reason": "approved", "reference": "Your reference for the acquiring fees", "sequenceNumber": 2, "status": "authorised", "type": "capture" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### 3. Outgoing transfer captured When the funds are deducted from your user's balance account, Adyen sends a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with `status` **captured** and the `transactionId`. **Captured transfer request** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": -104 }, "balanceAccount": { "description": "Your description for the balance account", "id": "BA00000000000000000000002", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -104, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "platformPayment", "categoryData": { "modificationMerchantReference": "MRef#000001", "modificationPspReference": "H3GX2NJTCMQ7C782", "paymentMerchantReference": "Payment reference", "platformPaymentType": "AcquiringFees", "pspPaymentReference": "DQ56GRJ5S8NKGK82", "type": "platformPayment" }, "creationDate": "2025-10-20T11:45:10+02:00", "description": "Your description for the acquiring fees", "direction": "outgoing", "events": [ { "bookingDate": "2025-10-20T11:45:12+02:00", "id": "RFDN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -104 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2025-10-20T11:45:12+02:00", "id": "RFDN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 104, "reserved": -104 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2025-10-20T11:45:17+02:00", "id": "RFDN00000000000000000000000003", "mutations": [ { "balance": -104, "currency": "EUR", "received": 0, "reserved": 104 } ], "status": "captured", "transactionId": "EVJN4227C224222C5JFQ7M38986D98EUR", "type": "accounting", "valueDate": "2023-09-05T00:00:00+01:00" } ], "id": "3JY1YI605AZ65FRB", "reason": "approved", "reference": "Your reference for the acquiring fees", "sequenceNumber": 3, "status": "captured", "transactionId": "EVJN4227C224222C5JFQ7M38986D98EUR", "type": "capture" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### 4. Transaction booked When the funds are deducted, Adyen also sends a [balancePlatform.transaction.created](https://docs.adyen.com/api-explorer/transaction-webhooks/latest/post/balancePlatform.transaction.created) webhook, which includes information about the related transaction. **Funds deducted** ```json { "data": { "id": "EVJN42272224222B5JB8BRC84N686ZEUR", "amount": { "value": -104, "currency": "EUR" }, "status": "booked", "transfer": { "id": "3JY1YI605AZ65FRB", "categoryData": { "modificationMerchantReference": "MRef#000001", "modificationPspReference": "H3GX2NJTCMQ7C782", "paymentMerchantReference": "Payment reference", "platformPaymentType": "AcquiringFees", "pspPaymentReference": "DQ56GRJ5S8NKGK82", "type": "platformPayment" }, "reference": "Your reference for the acquiring fees" }, "valueDate": "2025-10-20T00:00:00+02:00", "bookingDate": "2025-10-18T13:30:20+02:00", "creationDate": "2025-10-18T13:30:05+02:00", "accountHolder": { "id": "AH00000000000000000000001", "description": "Your description for the account holder", "reference": "Your reference for the account holder" }, "balanceAccount": { "id": "BA00000000000000000000001", "description": "Your description for the balance account", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM" }, "type": "balancePlatform.transaction.created", "environment": "test" } ``` ### Tab: Adyen's fees As specified in the payment request, the fees due to Adyen (the aggregated amount of Adyen's Commission and Markup) are deducted from your user's balance account. ** ### 1. Outgoing transfer received Once the fees due to Adyen are calculated for the payment, we send a [balancePlatform.transfer.created](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.created) webhook with `direction` **outgoing**, to announce that **Adyen's fees** will be deducted from your platform's liable balance account. This is the aggregated amount of Adyen's commission and markup. **Received transfer request for Adyen fees** ```json { "data": { "accountHolder": { "description": "Your description for your liable account holder", "id": "AH000000000000000000LIABLE", "reference": "Your reference for your liable account holder" }, "amount": { "currency": "EUR", "value": 240 }, "balanceAccount": { "description": "Your description for your liable balance account", "id": "BA00000000000000000LIABLE", "reference": "Your reference for your liable balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": -240 } ], "category": "platformPayment", "categoryData": { "modificationMerchantReference": "MRef#000001", "modificationPspReference": "H3GX2NJTCMQ7C782", "paymentMerchantReference": "Payment reference", "platformPaymentType": "AdyenFees", "pspPaymentReference": "DQ56GRJ5S8NKGK82", "type": "platformPayment" }, "creationDate": "2025-10-20T11:45:11+02:00", "description": "Your description for the Adyen fees", "direction": "outgoing", "events": [ { "bookingDate": "2025-10-20T11:45:11+02:00", "id": "RFDN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -240 } ], "status": "received", "type": "accounting" } ], "id": "3JY1YI605AZ65FPF", "reason": "approved", "reference": "Your reference for the Adyen fees", "sequenceNumber": 1, "status": "received", "type": "capture" }, "environment": "test", "type": "balancePlatform.transfer.created" } ``` ** ### 2. Outgoing transfer authorized When the transfer request for Adyen's fees is authorized, we send a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with `status` **authorised**. **Authorized transfer request** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 240 }, "balanceAccount": { "description": "Your description for your liable balance account", "id": "BA0000000000000000000LIABLE", "reference": "Your reference for your liable balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "currency": "EUR", "received": 0, "reserved": -240 } ], "category": "platformPayment", "categoryData": { "modificationMerchantReference": "MRef#000001", "modificationPspReference": "H3GX2NJTCMQ7C782", "paymentMerchantReference": "Payment reference", "platformPaymentType": "AdyenFees", "pspPaymentReference": "DQ56GRJ5S8NKGK82", "type": "platformPayment" }, "creationDate": "2025-10-20T11:45:10+02:00", "description": "Your description for the Adyen fees", "direction": "outgoing", "events": [ { "bookingDate": "2025-10-20T11:45:11+02:00", "id": "RFDN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -240 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2025-10-20T11:45:12+02:00", "id": "RFDN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 240, "reserved": -240 } ], "status": "authorised", "type": "accounting" } ], "id": "3JY1YI605AZ65FPF", "reason": "approved", "reference": "Your reference for the Adyen fees", "sequenceNumber": 2, "status": "authorised", "type": "capture" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### 3. Outgoing transfer captured When the funds are deducted from your platform's liable balance account, we send a [balancePlatform.transfer.updated](https://docs.adyen.com/api-explorer/transfer-webhooks/latest/post/balancePlatform.transfer.updated) webhook with `status` **captured** and the `transactionId`. **Captured transfer request** ```json { "data": { "accountHolder": { "description": "Your description for the account holder", "id": "AH00000000000000000000001", "reference": "Your reference for the account holder" }, "amount": { "currency": "EUR", "value": 240 }, "balanceAccount": { "description": "Your description for your liable balance account", "id": "BA00000000000000000LIABLE", "reference": "Your reference for your liable balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM", "balances": [ { "balance": -240, "currency": "EUR", "received": 0, "reserved": 0 } ], "category": "platformPayment", "categoryData": { "modificationMerchantReference": "MRef#000001", "modificationPspReference": "H3GX2NJTCMQ7C782", "paymentMerchantReference": "Payment reference", "platformPaymentType": "AdyenFees", "pspPaymentReference": "DQ56GRJ5S8NKGK82", "type": "platformPayment" }, "creationDate": "2025-10-20T11:45:10+02:00", "description": "Your description for the Adyen fees", "direction": "outgoing", "events": [ { "bookingDate": "2025-10-20T11:45:11+02:00", "id": "RFDN00000000000000000000000001", "mutations": [ { "currency": "EUR", "received": -240 } ], "status": "received", "type": "accounting" }, { "bookingDate": "2025-10-20T11:45:12+02:00", "id": "RFDN00000000000000000000000002", "mutations": [ { "currency": "EUR", "received": 240, "reserved": -240 } ], "status": "authorised", "type": "accounting" }, { "bookingDate": "2025-10-20T11:45:17+02:00", "id": "RFDN00000000000000000000000003", "mutations": [ { "balance": -240, "currency": "EUR", "received": 0, "reserved": 240 } ], "status": "captured", "transactionId": "EVJN422Q4224222C5JFQ7M3FZ82KWCEUR", "type": "accounting", "valueDate": "2023-09-05T00:00:00+01:00" } ], "id": "3JY1YI605AZ65FPF", "reason": "approved", "reference": "Your reference for the Adyen fees", "sequenceNumber": 3, "status": "captured", "transactionId": "EVJN422Q4224222C5JFQ7M3FZ82KWCEUR", "type": "capture" }, "environment": "test", "type": "balancePlatform.transfer.updated" } ``` ** ### 4. Transaction booked When the funds are deducted, Adyen also sends a [balancePlatform.transaction.created](https://docs.adyen.com/api-explorer/transaction-webhooks/latest/post/balancePlatform.transaction.created) webhook, which includes information about the related transaction. **Transaction created** ```json { "data": { "id": "EVJN42272224222B5JB8BRC84N686ZEUR", "amount": { "value": -240, "currency": "EUR" }, "status": "booked", "transfer": { "id": "3KEII65VWRBRFJIK", "categoryData": { "modificationMerchantReference": "MRef#000001", "modificationPspReference": "H3GX2NJTCMQ7C782", "paymentMerchantReference": "Payment reference", "platformPaymentType": "AdyenFees", "pspPaymentReference": "DQ56GRJ5S8NKGK82", "type": "platformPayment" }, "reference": "Commission_1" }, "valueDate": "2025-10-20T00:00:00+02:00", "bookingDate": "2025-10-18T13:30:20+02:00", "creationDate": "2025-10-18T13:30:05+02:00", "accountHolder": { "id": "AH00000000000000000000001", "description": "Your description for the account holder", "reference": "Your reference for the account holder" }, "balanceAccount": { "id": "BA00000000000000000000001", "description": "Your description for the balance account", "reference": "Your reference for the balance account" }, "balancePlatform": "YOUR_BALANCE_PLATFORM" }, "type": "balancePlatform.transaction.created", "environment": "test" } ``` ## Reports and reconciliation In the [Balance Platform Accounting Report](/platforms/reports-and-fees/balance-platform-accounting-report), all aggregated transaction fee types (**PaymentFee**, **AcquiringFees**, **AdyenFees**) have their own rows. For these fee types, we show the aggregated amount of the fees in the **Amount** column. For example, the row for all acquiring fees contains the sum of the interchange and scheme fee incurred by the transaction. However, the transaction fee types are also shown separately, on the most granular level, in the four **Platform Payment** columns (**Interchange**, **Scheme Fee**, **Markup**, **Commission**). If you do not send split instructions for any transaction fee type in your payment or capture request, Adyen automatically adds the `type` parameter with the **PaymentFee** value to the request, booking all transaction fees to your platform's liable balance account. This is also reflected in your report. You can [download a sample report](/reuse/pfs-payments/transaction-fees/reporting/Example_balanceplatform_accounting_report_2023_09_04.csv) that would be generated based on the example [payment request](#transaction-fees-request). ## See also * [Reconcile fees](/platforms/reconciliation-use-cases/reconcile-fees)