Skip to main content

Split Payments & Partner Fees

How to charge the customer once and split the funds between the merchant and your platform, including refunds and fee allocation.

Overview

Split payments let you charge the customer once and divide the funds between the merchant and your platform in the same transaction. Use them when your platform adds its own fee, such as a booking fee, service fee or convenience fee, on top of the merchant's sale.

Without splits, partners often charge the customer twice: once for the sale and once for the fee. That creates two lines on the customer's statement and drives refund requests and chargebacks. A split payment shows as one charge from the merchant.

How it works

Every merchant and partner on ValPay has a balance account, which holds funds before they are paid out to a bank account. When you send a payment request, you add a splits array that says how much of the total goes to each balance account.

For example, a customer books a session with a $100 venue price and a $5 booking fee:

What happens

Amount

Customer is charged (one transaction)

$105.00

Venue's balance account receives

$100.00

Partner's balance account receives

$5.00

The merchant (the venue) remains the merchant of record. Its name appears on the customer's card statement, and each balance account is paid out on its own schedule.

The split amounts must add up to the total payment amount. If they don't, the request is rejected.

Before you start

Split payments need some setup on ValPay's side before you can test them. Contact your ValPay integration contact to arrange the following:

  1. A balance account for your platform. Your company is onboarded as an account holder, which includes standard KYC verification and a bank account for payouts. ValPay then gives you your balance account ID.

  2. The merchant's balance account ID. Each merchant you process for has its own balance account. ValPay provides these IDs as merchants are onboarded.

  3. Agreement on fee and liability allocation. Before go-live, agree with ValPay on who carries processing fees and chargebacks. See Chargebacks and processing fees below.

  4. Test environment setup. ValPay creates test balance accounts so you can test splits end to end before going live.

Balance account IDs look like BA00000000000000000000001. Store them against the merchant and partner records in your system, because you'll send them with every payment and refund.

Online payments

Add the splits array to your /sessions request (Sessions flow) or your /payments request (Advanced flow). Each split needs:

  • type: use BalanceAccount for both the merchant's portion and your fee.

  • account: the balance account ID that receives the funds.

  • amount.value: the amount in minor units (cents). The currency comes from the payment.

  • reference: your own unique reference for this split, used in reporting and reconciliation.

  • description (required): must be exactly Seller split for the merchant's portion and Partner split for your fee. ValPay uses this value to reconcile each part of the payment, so don't change the wording or leave it out.

Example: a $105.00 payment with a $5.00 booking fee.

POST /v71/sessions
{
  "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
  "amount": { "currency": "USD", "value": 10500 },
  "reference": "BOOKING-12345",
  "returnUrl": "https://your-company.example.com/checkout/return",
  "splits": [
    {
      "type": "BalanceAccount",
      "account": "BA_MERCHANT_BALANCE_ACCOUNT_ID",
      "amount": { "value": 10000 },
      "reference": "BOOKING-12345-SALE",
      "description": "Seller split"
    },
    {
      "type": "BalanceAccount",
      "account": "BA_PARTNER_BALANCE_ACCOUNT_ID",
      "amount": { "value": 500 },
      "reference": "BOOKING-12345-FEE",
      "description": "Partner split"
    }
  ]
}

If you use manual capture, you can send the splits with the capture request (/payments/{paymentPspReference}/captures) instead. This is useful when the final amount, and therefore the split, isn't known until capture. See Authorization and Capture.

In-person payments

For terminal payments through the Terminal API, send the split instructions as key-value pairs in SaleToAcquirerData, inside the SaleData object of the payment request.

The same $105.00 booking, split at the terminal:

split.api=1
&split.nrOfItems=2
&split.totalAmount=10500
&split.currencyCode=USD
&split.item1.amount=10000
&split.item1.type=BalanceAccount
&split.item1.account=BA_MERCHANT_BALANCE_ACCOUNT_ID
&split.item1.reference=BOOKING-12345-SALE
&split.item1.description=Seller split
&split.item2.amount=500
&split.item2.type=BalanceAccount
&split.item2.account=BA_PARTNER_BALANCE_ACCOUNT_ID
&split.item2.reference=BOOKING-12345-FEE
&split.item2.description=Partner split

Send these as one string with no line breaks. You can also send them Base64-encoded as a JSON object. split.totalAmount must match the payment amount, and split.nrOfItems must match the number of items you send.

If your fee is the same fixed amount or percentage on every transaction at a store, ask ValPay whether a store-level split configuration fits your setup instead. With one in place, the split applies automatically and you don't send split data per request.

Refunds

Always include splits on refunds for split payments. The refund's splits array says which balance accounts the refunded money comes from. If you leave it out, the refund is not deducted from the merchant's or your balance account. It is drawn from ValPay's account instead, which creates reconciliation problems for the merchant and for ValPay.

Decide your refund policy for the fee before you build. Is the fee refunded on a full cancellation? On a partial refund? Then send splits that match the policy.

Full refund, fee included. Refund $105.00, taking $100.00 from the merchant and $5.00 from your balance account:

POST /v71/payments/{paymentPspReference}/refunds
{
  "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
  "amount": { "currency": "USD", "value": 10500 },
  "reference": "REFUND-BOOKING-12345",
  "splits": [
    {
      "type": "BalanceAccount",
      "account": "BA_MERCHANT_BALANCE_ACCOUNT_ID",
      "amount": { "value": 10000 },
      "reference": "REFUND-BOOKING-12345-SALE",
      "description": "Seller split"
    },
    {
      "type": "BalanceAccount",
      "account": "BA_PARTNER_BALANCE_ACCOUNT_ID",
      "amount": { "value": 500 },
      "reference": "REFUND-BOOKING-12345-FEE",
      "description": "Partner split"
    }
  ]
}

Refund without the fee. Refund only the merchant's portion ($100.00). Send one split, for the merchant's balance account, and your fee stays in your balance account:

"amount": { "currency": "USD", "value": 10000 },
"splits": [
  {
    "type": "BalanceAccount",
    "account": "BA_MERCHANT_BALANCE_ACCOUNT_ID",
    "amount": { "value": 10000 },
    "reference": "REFUND-BOOKING-12345-SALE",
    "description": "Seller split"
  }
]

As with payments, the split amounts must add up to the refund amount. For in-person refunds, send the same split keys in SaleToAcquirerData. For general refund rules, see Partial Captures & Refunds.

Chargebacks and processing fees

Chargebacks and processing fees aren't set per request. ValPay configures how they are allocated during onboarding, based on what is agreed with you. Confirm both before go-live.

Chargebacks. When a customer disputes a split payment, the full disputed amount, including your fee, is debited. You and ValPay need to agree whether it is debited entirely from the merchant's balance account or shared in proportion to the original split. Chargeback fees are allocated the same way.

Processing fees. Transaction fees (interchange, scheme fees and ValPay's fees) are deducted from one balance account. You and ValPay need to agree whether that's the merchant's balance account, which is most common, or your own.

A clear, itemized checkout helps prevent disputes in the first place. Show the fee as its own line on the checkout page and the receipt, so the customer recognizes the total on their statement.

Best practices and common mistakes

Mistake

What happens

How to avoid it

Refund sent without splits

Refund is drawn from ValPay's account, not the merchant's or yours

Store each payment's split details and reuse them on every refund

Split amounts don't add up to the total

Payment or refund is rejected

Calculate the merchant's portion as total minus fee, never separately

Reused split references

Hard to reconcile fees to bookings

Build references from your booking ID plus a suffix, e.g. -SALE and -FEE

Wrong balance account ID

Funds land in the wrong account

Map balance account IDs to merchant records, and test each new merchant

Fee not shown at checkout

More "unrecognized charge" disputes

Itemize the fee on the checkout page and the receipt

Test every scenario in the test environment before going live: a payment, a full refund, a refund without the fee and a partial refund. Then check that each balance account shows the amounts you expect.

Questions about split payments or setting up your balance account? Contact your ValPay integration contact or ValPay Support.

Did this answer your question?