Shipping, confirm and auto release
After the buyer pays, a milestone moves like this:
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
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
paidmilestone can be shipped (409 INVALID_STATE). courieris 1 to 60 characters.tracking_numberis 1 to 80 characters and optional, for example for a digital item or a service.- The answer is the milestone with
shipped_atandauto_release_at. You getmilestone.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.
| Shipment | Clock (default) |
|---|---|
With a tracking_number | 72 hours after shipping |
| Without one | 36 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:
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
shippedmilestone with a running clock (409 NOT_EXTENDABLE,409 NO_ACTIVE_TIMER). A second extension answers409 EXTEND_LIMIT_REACHED. - You get
milestone.extendedwith the newauto_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.
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:
- The milestone becomes
release_pending, withreceived_by: "partner"andrelease_atset to now plusconfirm_delay_hours(6 by default, between 1 and 72). The automatic clock is switched off. - 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.
- If the buyer disputes before
release_at, the pending release is cancelled and the milestone isdisputed. See Disputes on marketplace orders. - Otherwise RekberPay releases at
release_at(its release run comes by every 5 minutes, so within about 5 minutes after it) and sendsmilestone.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_atorrelease_atto both sides, so nobody is surprised.