Skip to content

Shipping, confirm and auto release ​

After the buyer pays, a milestone moves like this:

text
paid --ship--> shipped --buyer confirms-------------------------> released
                  |
                  +--you confirm--> release_pending --6 h later--> released
                  |                      |
                  |                      +--buyer disputes--> disputed
                  |
                  +--nobody acts, auto_release_at passes-------> released (auto)

received also exists, but only for an instant: a buyer confirm goes from shipped to released in one step.

1. Report the shipment ​

bash
curl -X POST "https://api.rekberpay.com/v1/enterprise/platform/deals/$DEAL_ID/milestones/$MS_ID/ship" \
  -H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY" \
  -H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "Content-Type: application/json" \
  -d '{ "courier": "JNE", "tracking_number": "JNE0012345678" }'
  • Only a paid milestone can be shipped (409 INVALID_STATE).
  • courier is 1 to 60 characters. tracking_number is 1 to 80 characters and optional, for example for a digital item or a service.
  • The answer is the milestone with shipped_at and auto_release_at. You get milestone.shipped.
  • A seller with a RekberPay login (a claimed or linked account) can also ship on RekberPay themselves.

2. The automatic release clock ​

Shipping starts a clock. When auto_release_at passes and nobody has acted, RekberPay releases the money to the seller and sends milestone.auto_released.

ShipmentClock (default)
With a tracking_number72 hours after shipping
Without one36 hours after shipping

RekberPay does not track the courier for marketplace orders, so the clock waits on the buyer either way. The hours are RekberPay settings; always read the real time from auto_release_at. When RekberPay sets an hour value to 0, there is no clock and auto_release_at is null: the money then waits for a confirm.

RekberPay's release run goes by every 5 minutes. The release lands within about 5 minutes after auto_release_at, not on the second, and a milestone that is disputed, extended or confirmed in the meantime is left alone. The Overview numbers in your dashboard can trail a release by up to about 15 seconds.

In the sandbox you can release a shipped or release_pending milestone at once with simulate/advance-time. It sends the same events as the real release.

3. Give the buyer more time ​

If the buyer needs more time (a late parcel, a long test), extend the clock once on their behalf:

bash
curl -X POST "https://api.rekberpay.com/v1/enterprise/platform/deals/$DEAL_ID/milestones/$MS_ID/extend" \
  -H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY" \
  -H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "Content-Type: application/json" \
  -d '{}'
  • Adds 48 hours by default, once per milestone (the same rule as a normal rekber). Extending a clock that is already due still gives the full time from now.
  • Only a shipped milestone with a running clock (409 NOT_EXTENDABLE, 409 NO_ACTIVE_TIMER). A second extension answers 409 EXTEND_LIMIT_REACHED.
  • You get milestone.extended with the new auto_release_at. A buyer on RekberPay can use the same extension themselves.

4. The buyer confirms ​

A buyer who has a RekberPay login (a claimed or linked account) confirms receipt on RekberPay. The money is released at once and you get milestone.received and milestone.released. There is no API call for this: the confirm must come from the buyer.

5. You confirm for the buyer ​

Many buyers never sign in to RekberPay. If your own app has a "Pesanan diterima" button, you can pass that confirm on. It needs the orders:confirm scope, which is off by default; ask your account manager to allow it.

bash
curl -X POST "https://api.rekberpay.com/v1/enterprise/platform/deals/$DEAL_ID/milestones/$MS_ID/confirm" \
  -H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY" \
  -H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "Content-Type: application/json" \
  -d '{}'

What happens:

  1. The milestone becomes release_pending, with received_by: "partner" and release_at set to now plus confirm_delay_hours (6 by default, between 1 and 72). The automatic clock is switched off.
  2. RekberPay tells the buyer, by email and in the app: "[your name] menandai pesanan Anda diterima". The email has a Bukan saya, ajukan sengketa button, and the release notice page it opens has the same one.
  3. If the buyer disputes before release_at, the pending release is cancelled and the milestone is disputed. See Disputes on marketplace orders.
  4. Otherwise RekberPay releases at release_at (its release run comes by every 5 minutes, so within about 5 minutes after it) and sends milestone.released.

You get milestone.release_pending right away. Only a shipped milestone can be confirmed, and only while the buyer is still linked to you (409 USER_NOT_AVAILABLE).

RekberPay staff watch for unusual confirm patterns, for example a partner confirming many orders itself, and may freeze the partner (What RekberPay staff do). While a partner is frozen, neither pending releases nor automatic releases of its orders fire. They run on the next sweep after it is unfrozen. A buyer can still confirm, which releases at once.

In the sandbox no email goes out. The confirm answer carries release_notice_url, the page the buyer would get, so you can test the Bukan saya button yourself.

What the seller receives ​

On release the seller's partner balance grows by the milestone payout_amount: the amount minus the seller's share of the fee. RekberPay keeps the fee. From there you can pay the seller out.

Checklist ​

  • Report the shipment as soon as the seller ships. The clock starts then.
  • Send a tracking number when there is one.
  • Use partner confirm only for a real confirm from the buyer in your app.
  • Show auto_release_at or release_at to both sides, so nobody is surprised.

Next steps ​

Escrow, payment services and B2B deals for Indonesian businesses.