Skip to content

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:

PartWhat it is
Milestone amountThe amount in the deal
Platform fee shareThe payer's share of the fee, as agreed. Zero when the partner pays the whole fee. See Agree who pays the fee
Method feeA 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:

MethodMethod feeConfirmed by
Manual bank transferRp 1.000 flatRekberPay checks the transfer
Manual QRISRp 150 when the funding amount is below Rp 100.000, otherwise 0.9% of itRekberPay checks the payment
Payment gateway (QRIS, virtual account, e-wallet)Whatever the dialog shows for that methodThe 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.

MethodMethod feeTotal to pay
Manual bank transferRp 1.000Rp 30.601.000
Manual QRIS (0.9%)Rp 275.400Rp 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

bash
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_at on 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_UPFRONT on 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 finance role or above.

1. Choose a method and start the payment ​

In the dashboard

  1. Open the deal. On the milestone row choose Pay. This button shows only in Live.
  2. 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".
  3. Check the breakdown: Milestone and your fee share, Method fee, Total to pay. Choose Pay Rp ....

With the API

bash
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

json
{
    "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

  1. The dialog Complete the payment shows Pay exactly the total (with a copy button), the Bank, Account number and Account holder, and Pay before.
  2. Transfer exactly that amount from your company's bank account.
  3. Come back and choose I have paid (see the next step).

Manual QRIS

  1. The dialog shows the QR code, the exact amount and Pay before.
  2. Scan it with any banking or e-wallet app that supports QRIS and pay the exact amount.
  3. Choose I have paid.

Payment gateway

  1. The dialog shows what the gateway returns: a QR code, a virtual account number, or Open the payment page.
  2. 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

bash
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

json
{
    "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.

bash
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 ​

MethodPay within
Manual bank transfer24 hours
Manual QRIS1 hour
GatewayThe 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 ​

StatusCodeCause
400MISSING_METHODmethod is missing
400UNSUPPORTED_METHODwallet, or no enabled gateway supports the method
409TEST_DEALThe request is in Sandbox or the deal is a test deal. Use Record funding
409FEE_NOT_AGREEDThe linked partner has not agreed the fee split
409INVALID_STATEThe milestone is not awaiting_funding
409FUND_WHOLE_DEALThe deal is upfront and not funded yet. Pay the whole deal
409NOT_UPFRONTA whole-deal call on a deal that is paid per milestone
409NO_MANUAL_PAYMENTThere is no manual transfer to confirm
429TOO_MANY_PAYMENT_LINKSFive automatic payments are already open for this milestone. Use one of them or wait for it to expire
503NO_GATEWAYSNo payment method is enabled right now
403FORBIDDENYour 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.

Next steps ​

Escrow, payment services and B2B deals for Indonesian businesses.