Payment splitting
How to configure split rules per transaction via API.
Overview
Payment Splitting is being replaced by splitting payouts via Workflow. We recommend evaluating Workflow-based payout splitting for new integrations. Payment Splitting via the Payment Intent API will continue to work for existing integrations.
Payment Splitting lets a platform account distribute a single customer payment across multiple connected merchant (child) accounts in one transaction. Instead of collecting all funds and manually disbursing them, you define split rules per transaction and PayMongo distributes automatically.
Who this is for
Payment Splitting is designed for platform accounts — businesses that operate a marketplace or multi-party platform with connected merchant accounts:
- Marketplaces — distribute payment among the marketplace, sellers, and logistics providers
- Delivery platforms — split between the restaurant, the rider, and the platform fee
- Vacation rental platforms — allocate to the property owner, service providers, and platform commission
How it works
- A customer pays through your platform — one single Payment Intent, one charge
- Your Payment Intent request includes split rules defining how much each child account receives
- PayMongo processes the payment and distributes funds according to the rules
- Each child account receives their share directly
Prerequisites
Before development:
- Account activation — your platform account must be configured for payment splitting
- Child account setup — connected merchant accounts must be created through the Onboarding API
- Merchant relationships — split rules reference connected merchant account IDs
Contact PayMongo support to enable payment splitting on your platform account.
Split types
| Type | How it works |
|---|---|
fixed | An exact amount (in centavos) is allocated to the recipient |
percentage_net | A percentage of the net amount is allocated (expressed in basis points — 100 bps = 1%) |
transfer_to | The remaining net amount after all splits is deposited to this merchant |
Split a payment
Create a Payment Intent with split_payment
{
"data": {
"attributes": {
"amount": 10000,
"currency": "PHP",
"payment_method_allowed": ["gcash"],
"description": "Marketplace order",
"split_payment": {
"transfer_to": "org_RXm2cKMjjG88qriue913mhG3",
"recipients": [
{
"merchant_id": "org_aw5CNAR7HSOnsa1923Wwsm",
"split_type": "percentage_net",
"value": 100
},
{
"merchant_id": "org_Xs7JUHY7I7bKY1BgFhAIJ2uWsq1",
"split_type": "fixed",
"value": 500
}
]
}
}
}
}| Attribute | Description |
|---|---|
split_payment.transfer_to | Merchant ID that receives the remaining net amount after splits. If blank, the creating merchant receives the remainder. |
recipients[].merchant_id | The child merchant account ID |
recipients[].split_type | fixed or percentage_net |
recipients[].value | For fixed: amount in centavos. For percentage_net: basis points (100 = 1%) |
Payment splitting also works with the Checkout API — add the same split_payment attribute to the Checkout Session request body.
Important: split validation
If the total defined splits exceed the net payment amount, PayMongo will still process the payment — but the splitting will fail silently. The entire net amount goes to the merchant who created the resource. There is no automated recovery; you must handle and settle the split manually.
Always verify your split configuration using test API keys before going live.
Computation examples
These examples use a PHP 100.00 payment with a 2.5% GCash fee applied. Net amount available for distribution: PHP 97.50.
Transfer To only
The full net amount goes to one child merchant:
| Merchant | Split type | Amount received |
|---|---|---|
org_child1 | Transfer To | PHP 97.50 |
Fixed amounts
Two child merchants each receive PHP 20.00 fixed; the remainder goes to the parent:
| Merchant | Split type | Amount received |
|---|---|---|
org_parent | Transfer To (surplus) | PHP 57.50 |
org_child1 | Fixed (PHP 20.00) | PHP 20.00 |
org_child2 | Fixed (PHP 20.00) | PHP 20.00 |
Percentage Net
Two child merchants each receive 2% of net amount:
| Merchant | Split type | Amount received |
|---|---|---|
org_parent | Transfer To (surplus) | PHP 93.60 |
org_child1 | Percentage Net (2%) | PHP 1.95 |
org_child2 | Percentage Net (2%) | PHP 1.95 |
For 50% each:
| Merchant | Split type | Amount received |
|---|---|---|
org_parent | Transfer To (surplus) | PHP 0 |
org_child1 | Percentage Net (50%) | PHP 48.75 |
org_child2 | Percentage Net (50%) | PHP 48.75 |
Mixed: Fixed + Percentage Net
| Merchant | Split type | Amount received |
|---|---|---|
org_parent | Transfer To (surplus) | PHP 28.75 |
org_child1 | Fixed (PHP 20.00) | PHP 20.00 |
org_child2 | Percentage Net (50%) | PHP 48.75 |
Note on refunds: When a split payment is refunded, the gross refund amount is distributed among merchants proportional to what they originally received. Fees are split proportionally as well. You can override this with a custom
split_refund— see Refunds for details.
Split payment refunds
When a payment was split using Payment Splitting, refunds are distributed proportionally among the parties who received the original split by default. Fees are also split proportionally.
Example: If Recipient A and Recipient B each received 50% of the net amount (PHP 48.75 each from a PHP 100 payment), a full PHP 100 refund deducts PHP 50.00 from each.
To override this and specify exactly which party shoulders the refund, use the split_refund.refund_sources attribute:
const refund = await fetch('https://api.paymongo.com/v1/refunds', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('sk_test_YOUR_SECRET_KEY:')
},
body: JSON.stringify({
data: {
attributes: {
amount: 10000,
payment_id: 'pay_xxx',
reason: 'others',
split_refund: {
refund_sources: [
{ merchant_id: 'org_child1xxxxxxxxxxxxxxxxxx', split_type: 'fixed', value: 10000 }
]
}
}
}
})
}).then(r => r.json());You can also distribute the refund across multiple parties by adding more objects to refund_sources.
Payment Splitting Dashboard
The PayMongo dashboard includes a Payment Splitting view where you can:
- View split distributions per transaction
- Monitor child account payment statuses
- Track reconciliation
Platform account must be activated before use, child accounts must be created through the Onboarding API, and split rules cannot be modified after the Payment Intent or Checkout Session is created.
Updated 5 months ago
