For the complete documentation index, see llms.txt. This page is also available as Markdown.

Split Settlement

Split Settlement is a feature that enables to define your settlement rule for a payment. This is a good solution for a merchant that need customized settlement rule such as, marketplace, platforms, franchise, business with various branches, and many more. Split Settlement will help you to manage your complex payment flows.

Activation

  1. This feature only works for Aggregator Merchant, meaning that your funds are settled from acquiring to DOKU, then DOKU will forward the funds to your account.

  2. You have activated the split settlement service when onboarding to DOKU. If not activated, we will settle all settlement amounts to your default bank account. You can activate split settlement service through menu Setting > Service.

a. Click the “+ Add Service” button and select Financial Service > Others > Split Settlement. If this section is disabled, please contact your sales.

b. Once Split Settlement is activated, you can see Split Settlement on your service list.

c. Your split transaction will have a split Icon on the right of Invoice Number.

  1. Create new bank account on DOKU Back Office from menu Setting > Bank Account and click the Add button, then fill the form and click Submit button.

  1. We will verify your data and after the status is Verified then you can retrieve the settlement_bank_account_id from Bank Settlement ID column to put into your Split Settlement Rule

  2. Split settlement currently only works for integration with:

    • Checkout

    • Direct API

Then you are good to go!

Request Split Settlement on Accept Payment

Request split settlement can be done during payment success.To do split settlement, please add this additional_info.settlement object into your payment request:

Parameter
Type
Mandatory
Description

additional.info.settlement

array

Mandatory

Include this object to do split settlement for the transaction

additional_info.settlement[]. bank_account_settlement_id

string

Mandatory

The bank_account_settlement_id that you retrieved from the DOKU Back Office

additional_info.settlement[].value

string

Mandatory

The value of the settlement can be in IDR or percentage based on the type defined. If you are using FIX type then the value should be the exact amount. If you are using PERCENTAGE type then the value should be the percentage

additional_info.settlement[].type

string

Mandatory

The type of the splitting funds Possible value: FIX, PERCENTAGE

Please be aware that the object names in this system are case sensitive. This means that "ObjectName" and "objectname" would be treated as two distinct objects. Be sure to use the exact case as specified to avoid any errors or issues in your implementation

Sample Usage

Let's assume you are using the Checkout integration. You can simply add these parameters into your API Initiate Payment:


Update Split Settlement via Post Payment

The Update Split Settlement on Post Payment feature allows you to modify fund distributions for transactions that have pending settlement. You can easily update the split settlement through the dashboard or API.

Update Via Host-to-Host

  1. Check Status Split Settlement (API) Check Status Split Settlement (POST v1/split-settlement/check-status): Show the value for a split settlement transaction such as settlement bank account information, split value, and split type.

Check Status of Split Settlement

post
Header parameters
Client-IdstringRequired

Client ID retrieved from DOKU Back Office

Example: MCH-0001-10791114622547
Request-IdstringRequired

Unique random string (max 128 characters), validated globally by the security filter (not at the controller level)

Example: b6a465ea-bb65-48b2-a22b-3e8fb51cf22e
Request-TimestampstringRequired

Timestamp request UTC ISO8601, validated globally (out-of-range check)

Example: 2020-08-11T08:45:42Z
SignaturestringRequired

HMAC signature, validated globally by RequestHeaderFilter

Example: HMACSHA256=vl9DBTX5KhEiXmnpOD0TSm8PYQknuHPdyHSTSc3W6Ps=
Body

Used by /check-status and /cancel. Only contains fields that are actually read by SplitSettlementService... split_transaction_bank_account is INTENTIONALLY omitted here: for /check-status this field is absolutely not used at all (dead field), and for /cancel this field is only passed raw (pass-through) to financial-core, not used by this service itself. See docs/api/compare-api.md for details.

invoice_numberstringRequired

transaction invoice number

Example: INV-001
transaction_datestring · date-timeRequired

transaction date in ISO-8601 format

amountnumber · doubleRequiredExample: 10000
Responses
200

Successful response

application/json

Fields that are actually set by getSplitSettlementResponseDto() (SplitSettlementService.java:219-229) for the /check-status endpoint.

bank_account_settlement_idstringOptionalExample: SBS-1004-20211114082852516
bank_namestringOptionalExample: Banking Circle S.A
bank_account_numberstringOptionalExample: 99903331
bank_account_namestringOptionalExample: Edwin
valuenumber · doubleOptionalExample: 10
typestringOptionalExample: PERCENTAGE
post/v1/split-settlement/check-status
POST /production.doku.com}.com/fc-h2h-api/v1/split-settlement/check-status HTTP/1.1
Host: {sandbox/production.doku.com}.com/fc-h2h-api
Client-Id: text
Request-Id: text
Request-Timestamp: text
Signature: text
Content-Type: application/json
Accept: */*
Content-Length: 89

{
  "invoice_number": "INV-001",
  "transaction_date": "2026-01-01T00:00:00.000Z",
  "amount": 10000
}
[
  {
    "bank_account_settlement_id": "SBS-1004-20211114082852516",
    "bank_name": "Banking Circle S.A",
    "bank_account_number": "99903331",
    "bank_account_name": "Edwin",
    "value": 10,
    "type": "PERCENTAGE"
  }
]
  1. Edit Split Settlement (API) Edit Split Settlement (POST /v1/split-settlement/edit): Updates destination bank accounts and split allocation rules (percentages or fixed amounts) for an unbatched transaction in pending status.

Edit Split Settlement of Transaction

post
Header parameters
Client-IdstringRequired

Client ID retrieved from DOKU Back Office

Example: MCH-0001-10791114622547
Request-IdstringRequired

Unique random string (max 128 characters), validated globally by the security filter (not at the controller level)

Example: b6a465ea-bb65-48b2-a22b-3e8fb51cf22e
Request-TimestampstringRequired

Timestamp request UTC ISO8601, validated globally (out-of-range check)

Example: 2020-08-11T08:45:42Z
SignaturestringRequired

HMAC signature, validated globally by RequestHeaderFilter

Example: HMACSHA256=vl9DBTX5KhEiXmnpOD0TSm8PYQknuHPdyHSTSc3W6Ps=
Body
invoice_numberstringRequiredExample: INV-001
transaction_datestring · date-timeRequired
amountnumber · doubleRequiredExample: 10000
Responses
200

Successful response

application/json

Fields that are actually set by validateSplitTransaction() (SplitSettlementService.java:121-147) for endpoint /edit. bank_name, bank_account_number, bank_account_name are INTENTIONALLY omitted: the service never sets these fields, so they do not appear in the JSON response (DTO uses @JsonInclude NON_NULL).

bank_account_settlement_idstringOptionalExample: SBA-0101023-11
valuenumber · doubleOptionalExample: 10
typestringOptionalExample: PERCENTAGE
post/v1/split-settlement/edit
POST /production.doku.com}.com/fc-h2h-api/v1/split-settlement/edit HTTP/1.1
Host: {sandbox/production.doku.com}.com/fc-h2h-api
Client-Id: text
Request-Id: text
Request-Timestamp: text
Signature: text
Content-Type: application/json
Accept: */*
Content-Length: 205

{
  "invoice_number": "INV-001",
  "transaction_date": "2026-01-01T00:00:00.000Z",
  "amount": 10000,
  "split_transaction_bank_account": [
    {
      "bank_account_settlement_id": "SBA-0101023-11",
      "value": "10",
      "type": "PERCENTAGE"
    }
  ]
}
[
  {
    "bank_account_settlement_id": "SBA-0101023-11",
    "value": 10,
    "type": "PERCENTAGE"
  }
]
  1. Cancel Split Settlement (API) Cancel Split Settlement (POST /v1/split-settlement/cancel): Cancels the custom split settlement configuration for an unbatched transaction, restoring 100% fund settlement to the merchant's default bank account.

Cancel Split Settlement of Transaction

post
Header parameters
Client-IdstringRequired

Client ID retrieved from DOKU Back Office

Example: MCH-0001-10791114622547
Request-IdstringRequired

Unique random string (max 128 characters), validated globally by the security filter (not at the controller level)

Example: b6a465ea-bb65-48b2-a22b-3e8fb51cf22e
Request-TimestampstringRequired

Timestamp request UTC ISO8601, validated globally (out-of-range check)

Example: 2020-08-11T08:45:42Z
SignaturestringRequired

HMAC signature, validated globally by RequestHeaderFilter

Example: HMACSHA256=vl9DBTX5KhEiXmnpOD0TSm8PYQknuHPdyHSTSc3W6Ps=
Body

Used by /check-status and /cancel. Only contains fields that are actually read by SplitSettlementService... split_transaction_bank_account is INTENTIONALLY omitted here: for /check-status this field is absolutely not used at all (dead field), and for /cancel this field is only passed raw (pass-through) to financial-core, not used by this service itself. See docs/api/compare-api.md for details.

invoice_numberstringRequired

transaction invoice number

Example: INV-001
transaction_datestring · date-timeRequired

transaction date in ISO-8601 format

amountnumber · doubleRequiredExample: 10000
Responses
200

Successful response

application/json

For the /cancel endpoint, data is taken from deserializing the financial-core response (BaseResponse.data pada cancel(), SplitSettlementService.java:255-277), then transaction_date is reformatted to yyyy-MM-dd by formatDate() (SplitSettlementService.java:280-287). invoice_number and amount are explicitly used/processed by this code; bank_* fields are NOT explicitly set by the service for this endpoint.

invoice_numberstringOptionalExample: INV-001
transaction_datestringOptional

Reformatted to yyyy-MM-dd by formatDate()

Example: 2020-08-11
amountnumber · doubleOptionalExample: 10000
post/v1/split-settlement/cancel
POST /production.doku.com}.com/fc-h2h-api/v1/split-settlement/cancel HTTP/1.1
Host: {sandbox/production.doku.com}.com/fc-h2h-api
Client-Id: text
Request-Id: text
Request-Timestamp: text
Signature: text
Content-Type: application/json
Accept: */*
Content-Length: 89

{
  "invoice_number": "INV-001",
  "transaction_date": "2026-01-01T00:00:00.000Z",
  "amount": 10000
}
{
  "invoice_number": "INV-001",
  "transaction_date": "2020-08-11",
  "amount": 10000
}

Update via Dashboard Setting

  1. Cancel Split Settlement (Dashboard)

Cancel Split Settlement: Navigate to Reports > Reconciled Transactions, click the three-dot menu (⋮) on an unbatched pending transaction, select Cancel Split Settlement, click the red Cancel Split Settlement button, and select Yes on the confirmation prompt.

  1. Edit Split Settlement (Dashboard)

    Edit Split Settlement: Navigate to Reports > Reconciled Transactions, click the three-dot menu (⋮) in the Actions column, select Settlement Configuration, adjust your bank account allocations or split values, and click Save Configuration.


Rules and Limitation

Here is the illustration:

Let's assume that the order.amount is Rp104,500 and the Total Fee that being charged by DOKU for this transaction is Rp4,500 and you want to split the amount into two bank accounts with percentage of 15% into the first bank account (SBA-0001-123123123) and 85% into the second bank account (SBA-0002-321321321).

Name
Percentage
Amount

order.amount

-

104,500

Total Fee by DOKU

-

4,500

Amount that will be splitted

100%

100,000

SBA-0001-123123123

15%

15,000

SBA-0002-321321321

85%

85,000

Therefore, the first bank account will receive Rp15,000 and second bank account will receive Rp85,000.


FAQs

What if the settlement amount defined incorrectly?

The transaction will still be processed, but the split settlement mechanism will not be executed. The funds will settled to the primary bank account that you set in the settlement configuration.

Can I use this feature with hold & release settlement or custom settlement report?

Of course, you can!

Last updated