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:
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.
The merchant's balance account ID. Each merchant you process for has its own balance account. ValPay provides these IDs as merchants are onboarded.
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.
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: useBalanceAccountfor 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 exactlySeller splitfor the merchant's portion andPartner splitfor 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. |
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.
