Fund a live deal
In Live nobody records funding by hand. The payer pays real money on the same rails as a normal RekberPay escrow: a bank transfer that RekberPay checks, a QRIS code, or an automatic payment gateway. The milestone becomes funded only when RekberPay has the money.
A deal is funded in one of two ways. With upfront funding the payer pays the whole deal in one payment before work starts, and RekberPay holds the money and releases it milestone by milestone. With per milestone funding the payer pays each milestone on its own before it starts. A deal made in the dashboard is upfront unless Pay per milestone is chosen. A deal made through the API with a workspace key is per milestone unless the request sends funding_mode. The rest of this guide covers both: the method fee, the instructions, "I have paid" and verification are the same.
Sandbox and its test deals never reach a gateway. They use Record funding with test money. See Run a deal in Sandbox, then in Live.
What the payer pays
The payer pays three parts, and the dialog shows the total before anything is charged:
| Part | What it is |
|---|---|
| Milestone amount | The amount in the deal |
| Platform fee share | The payer's share of the fee, as agreed. Zero when the partner pays the whole fee. See Agree who pays the fee |
| Method fee | A small fee for the payment method. The paying workspace always bears it |
The first two together are the milestone's funding amount. A workspace has no RekberPay balance, so paying from a wallet is not offered.
The method fee depends on the method. These are the defaults for the manual methods:
| Method | Method fee | Confirmed by |
|---|---|---|
| Manual bank transfer | Rp 1.000 flat | RekberPay checks the transfer |
| Manual QRIS | Rp 150 when the funding amount is below Rp 100.000, otherwise 0.9% of it | RekberPay checks the payment |
| Payment gateway (QRIS, virtual account, e-wallet) | Whatever the dialog shows for that method | The gateway confirms by itself |
Always trust the figure in the dialog or in the method list over this table: the fee is set per method and can change.
Example. A milestone of Rp 30.000.000 where the payer carries the whole 2% platform fee has a funding amount of Rp 30.600.000.
| Method | Method fee | Total to pay |
|---|---|---|
| Manual bank transfer | Rp 1.000 | Rp 30.601.000 |
| Manual QRIS (0.9%) | Rp 275.400 | Rp 30.875.400 |
A transfer that arrives short does not fund the milestone. The amount that reaches RekberPay, after the method fee, must cover the funding amount.
Pay the whole deal (upfront)
On an upfront deal that is not funded yet, one payment funds every milestone that is still awaiting_funding. The total is those milestones plus the payer's fee share, plus the method fee.
In the dashboard, open the deal and choose Pay the whole deal on the card of the same name, then follow steps 1 to 5 below. The card shows Due soon in the last day before the deadline and Payment is overdue after it.
With the API
curl -X POST https://api.rekberpay.com/v1/enterprise/deals/$DEAL_ID/pay \
-H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY" \
-H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')" \
-H "Content-Type: application/json" \
-d '{ "method": "bank_transfer", "provider": "bank_transfer_manual" }'The answer has the same shape as paying a milestone; milestone_amount is the whole-deal amount. After a manual transfer call POST /v1/enterprise/deals/$DEAL_ID/claim-payment and follow the payment with GET /v1/enterprise/deals/$DEAL_ID/payment-status (funded turns true once every milestone is funded). Webhooks carry deal.funded and one milestone.funded per milestone. In Sandbox, POST /v1/enterprise/deals/$DEAL_ID/fund funds the whole deal with test money.
- The payment has to cover the whole total. A transfer that is short funds nothing, and RekberPay settles it with you.
funding_due_aton the deal is 7 days after the deal was accepted (activation, and the agreed fee split on a linked deal). RekberPay reminds the payer before it passes. Nothing is cancelled for you when it passes.- While an upfront deal is not funded, paying one milestone answers
409 FUND_WHOLE_DEAL. A milestone added after the deal was funded is paid on its own. - A deal that is paid per milestone answers
409 NOT_UPFRONTon the whole-deal calls.
Before you pay
- The deal is active and the milestone (or, for an upfront deal, the deal) is
awaiting_funding. - If the counterparty has a linked workspace, the fee split is agreed. Until then the call answers
409 FEE_NOT_AGREED. - You have the
financerole or above.
1. Choose a method and start the payment
In the dashboard
- Open the deal. On the milestone row choose Pay. This button shows only in Live.
- In How do you want to pay?, pick a method. Manual ones are marked "(manual)". Each shows its Method fee and whether it is "checked by RekberPay" or "confirmed automatically".
- Check the breakdown: Milestone and your fee share, Method fee, Total to pay. Choose Pay Rp ....
With the API
curl -X POST https://api.rekberpay.com/v1/enterprise/deals/$DEAL_ID/milestones/$MILESTONE_ID/pay \
-H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY" \
-H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')" \
-H "Content-Type: application/json" \
-d '{ "method": "bank_transfer", "provider": "bank_transfer_manual" }'method is bank_transfer, qris, or another method an enabled gateway lists. provider is optional: without it, an automatic gateway is preferred when one supports the method. To see the methods and the exact fee for an amount, call GET /v1/gateways/available-methods?amount=<funding amount>&kind=enterprise with a dashboard session or a personal API key. A workspace API key works only under /v1/enterprise, so it cannot call that list, but it can call the pay route above.
201 Created
{
"success": true,
"data": {
"payment_link_id": "6b1f7c1e-2c1d-4a8e-9b51-0f3c2a7d9e10",
"gateway_order_id": "RBP-fffffff4-1760843564000-a1b2c3d4",
"method": "bank_transfer",
"provider": "bank_transfer_manual",
"expires_at": "2026-10-20T03:12:44.000Z",
"amount": 30601000,
"milestone_amount": 30600000,
"surcharge": 1000,
"payment_fee": 1000,
"fee_bearer": "buyer",
"seller_fee": 0
}
}amount is the total to pay. milestone_amount is the funding amount (the milestone plus the payer's fee share). Calling pay again while a manual payment is still open for the same method and amount returns that same payment instead of making a second one, with resumed: true.
2. Pay
Manual bank transfer
- The dialog Complete the payment shows Pay exactly the total (with a copy button), the Bank, Account number and Account holder, and Pay before.
- Transfer exactly that amount from your company's bank account.
- Come back and choose I have paid (see the next step).
Manual QRIS
- The dialog shows the QR code, the exact amount and Pay before.
- Scan it with any banking or e-wallet app that supports QRIS and pay the exact amount.
- Choose I have paid.
Payment gateway
- The dialog shows what the gateway returns: a QR code, a virtual account number, or Open the payment page.
- Pay as shown. There is no I have paid button. The gateway tells RekberPay, and the dialog updates by itself.
3. Say that you have paid (manual only)
The claim tells RekberPay to look for your transfer. It moves no money and funds nothing by itself.
In the dashboard, choose I have paid. The dialog changes to "RekberPay is checking your transfer".
With the API
curl -X POST https://api.rekberpay.com/v1/enterprise/deals/$DEAL_ID/milestones/$MILESTONE_ID/claim-payment \
-H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY" \
-H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')"200 OK
{
"success": true,
"data": {
"payment_status": "awaiting_confirmation",
"already_claimed": false
}
}A second claim returns the same answer with already_claimed: true. A gateway payment answers 409 NO_MANUAL_PAYMENT: it confirms itself.
4. RekberPay verifies
For a manual payment, RekberPay operations match your transfer with the bank credit. This usually takes a few minutes in working hours. When it matches:
- the milestone becomes Funded (
funded), the dialog closes with "Deposit is funded. Work on it can start.", and the team is notified - any other open payment on that milestone is retired and shows as
superseded
If RekberPay cannot find the transfer, the payment is rejected. The dialog says "RekberPay could not find your last transfer. Pay again, or contact us if the money left your account."
When RekberPay confirms a large transfer by hand, its own rules can ask a second RekberPay administrator to approve the confirmation first. Until then the milestone stays awaiting_funding and no notice is sent. Nothing for you to do; the usual Funding confirmed notice and milestone.funded event follow once it is confirmed.
5. Follow the status
Reload the dialog at any time. It resumes from the latest payment.
curl https://api.rekberpay.com/v1/enterprise/deals/$DEAL_ID/milestones/$MILESTONE_ID/payment-status \
-H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY"The answer has milestone_status, funding_amount and the latest payment with its status (pending, awaiting_confirmation, paid, rejected, expired, failed, fraud or superseded), is_manual, surcharge_idr, expires_at and, where it applies, va_number, qr_url and redirect_url. payment is null before a payment starts. When milestone_status leaves awaiting_funding, the money has arrived. You can also react to the milestone.funded event or webhook.
Expiry
| Method | Pay within |
|---|---|
| Manual bank transfer | 24 hours |
| Manual QRIS | 1 hour |
| Gateway | The time the gateway sets, shown as Pay before |
An unpaid payment expires at that time. A gateway payment that is still settling gets 10 more minutes before it is treated as dead. After an expiry the dialog says "Your last payment expired before it was paid. Start a new one." Choose a method again. Do not pay an expired payment.
While a payment is open or claimed, Cancel deal answers 409 PAYMENT_IN_PROGRESS. Wait until RekberPay confirms it or it expires.
Errors
| Status | Code | Cause |
|---|---|---|
400 | MISSING_METHOD | method is missing |
400 | UNSUPPORTED_METHOD | wallet, or no enabled gateway supports the method |
409 | TEST_DEAL | The request is in Sandbox or the deal is a test deal. Use Record funding |
409 | FEE_NOT_AGREED | The linked partner has not agreed the fee split |
409 | INVALID_STATE | The milestone is not awaiting_funding |
409 | FUND_WHOLE_DEAL | The deal is upfront and not funded yet. Pay the whole deal |
409 | NOT_UPFRONT | A whole-deal call on a deal that is paid per milestone |
409 | NO_MANUAL_PAYMENT | There is no manual transfer to confirm |
429 | TOO_MANY_PAYMENT_LINKS | Five automatic payments are already open for this milestone. Use one of them or wait for it to expire |
503 | NO_GATEWAYS | No payment method is enabled right now |
403 | FORBIDDEN | Your role is below finance |
The pay route allows 10 calls a minute per user. Send an Idempotency-Key so a retry after a timeout returns the first answer.