End-to-end · Trade × Payment × Logistics

One purchase,
three linked contracts.

A consumer in Surabaya buys a smartphone on Pasar Sapa from a Jakarta merchant. Payment goes through GoPay, fulfilment through JNE. Each sector — Trade, Payment, Logistics — runs its own Beckn message exchange under terms ratified by ION, and the three contracts stitch together through one shared identifier: linkedContractId.

18
Phases
36
Messages
6
Actors
3
Linked contracts
01 The actors

One consumer, six lanes.

Same Trade and Logistics actors as before, plus GoPay as a separate Payment BPP. The Payment lane is what turns the off-network settlement from the Trade-only walk-through into a first-class on-network contract.

cast A single transaction six lanes · three contracts
Andi
Consumer in Surabaya. Pincode 35-XXXX. Opens Pasar Sapa to buy a smartphone.
Pasar Sapa
BAP for all three sectors. Aggregates Trade listings, picks payment methods, dispatches shipments.
Toko Elektronik
BPP · Trade. Jakarta electronics merchant. PKP-registered; issues Faktur Pajak.
GoPay
BPP · Payment. QRIS · BI-FAST rail. Authorises, settles, and reports MDR + success rates.
JNE
BPP · Logistics. LOG-PARCEL · NEXT_DAY. Operates under a Framework Agreement with Pasar Sapa.
ION Services
Catalogue · CDS · Policy Registry. Quietly in the background — consulted, never blocked on.
02 The picture

Time flows top to bottom.

Eighteen phases. Trade in rust. Payment in moss. Logistics in teal. Status pushes in amber. The off-network QRIS authorize in muted grey. The three sectors don't block on each other — they're stitched together by one identifier.

End-to-end ION transaction sequence with payment BPP Sequence diagram across six lanes — Consumer, BAP (Pasar Sapa), BPP-Trade (Toko Elektronik), BPP-Payment (GoPay), BPP-Logistics (JNE), and ION Services — showing catalog discovery, Trade quote, Payment select-init-status, Trade confirm, Logistics select-init-confirm with linkedContractId, transit, delivery, rating, and a three-way reconcile. Consumer Andi · Surabaya BAP Pasar Sapa all 3 sectors BPP · Trade Toko Elektronik Jakarta merchant BPP · Payment GoPay QRIS · BI-FAST BPP · Logistics JNE LOG-PARCEL ION Services Catalogue · CDS Policy registry Phase 01 · Catalog (background) /catalog/publish Toko Elektronik publishes products + policy IRIs /catalog/publish GoPay publishes payment methods + MDR /catalog/publish JNE publishes rate logic + coverage /on_subscribe → catalogs Pasar Sapa keeps a fresh local index Phase 02 · Browse search "smartphone" Andi opens Pasar Sapa, finds Toko Elektronik Phase 03 · Trade · /select → /on_select /select item, qty=1, drop pincode 35-XXX /on_select quote.breakup: ITEM 5,000,000 + TAX (PPN 11%) 553,850 Phase 04 · Trade · /init → /on_init /init full address, gift wrap, payment intent = via Payment BPP /on_init paymentRequest: amount 5,588,850 IDR · payee VPA Phase 05 · Payment · /select → /on_select /select amount, payer wallet, payee VPA, intent = consumer authorize /on_select methods: QRIS · VA · EWALLET · MDR per method Phase 06 · Payment · /init → /on_init /init selected method = QRIS · idempotency key /on_init qrisString · expiresAt PT5M · paymentRef PAY/2026/0429/G7H8 Phase 07 · Payment · /confirm → /on_status [PAID] · links to Trade contract /confirm linkedContractId = TRADE/2026/0429/A1F2 /on_confirm Payment contract ACTIVE · awaiting consumer authorize scan QRIS · authorize in GoPay app off-network · settlement over BI-FAST /on_status [PAID] settlementId · NTPN · authorizedAt Phase 08 · Trade · /confirm → /on_confirm · paymentReference attached /confirm paymentReference = PAY/2026/0429/G7H8 · NTPN ref /on_confirm Trade contract ACTIVE · fakturPajakReference · fulfillingLocationId Phase 09 · Logistics · /select → /on_select /select pickup Jakarta · drop Surabaya · 1.2 kg · NEXT_DAY · declared 5,000,000 /on_select binding rate 35,000 · quoteValidityWindow PT1H Phase 10 · Logistics · /init → /on_init /init pickup + drop addresses · FWA Pasar Sapa × JNE 2026Q2 /on_init FWA validated · settlement preview Phase 11 · Logistics · /confirm → /on_confirm · links to Trade contract /confirm linkedContractId = TRADE/2026/0429/A1F2 /on_confirm Logistics contract ACTIVE · awbNumber JNE-2026-7K3M9X Phase 12 · Pickup events /on_status [DISPATCHED] awbNumber · trackingUrl · ETA /on_status [PICKED_UP] agentName · phoneProxy · vehiclePlate Phase 13 · Transit · /track + on_status /on_status [IN_TRANSIT] at Jakarta hub · P2H2P routing /track request live GPS handle /on_track WebSocket URL streams live coordinates /on_status [OUT_FOR_DELIVERY] Phase 14 · Delivered /on_status [DELIVERED] deliveryProofUrl (photo) /update [DELIVERED] Trade contract → COMPLETE push: "delivered" Phase 15 · Rating 5★ + comment /rate (PROVIDER, ITEM) /rate (FULFILLMENT, AGENT) Phase 16 · Trade · /reconcile /reconcile (try=true) preview settlement statement /on_reconcile PPN remittance + PLATFORM_FEE + bukti potong /reconcile (commit) Phase 17 · Logistics · /reconcile (batched monthly) /reconcile (isBatch=true · period=2026-04) /on_reconcile FWA volume rebate · weight-dispute adjustments · NTPN refs Phase 18 · Payment · /reconcile (PSP fees + success rate) /reconcile /on_reconcile MDR · refund-rate · authorization-success-rate Three contracts SETTLED — linked, audit-ready. Trade TRADE/2026/0429/A1F2 · Payment PAY/2026/0429/G7H8 · Logistics LOG/2026/0429/J7K9
fig. 01 Each colour names a sector. The single rust callout on the Payment and Logistics bands marks where each contract links back to Trade.
03 Catalog & browse

Three BPPs, one local index.

Same shape as the Trade-only walk-through, plus a Payment publish. All three BPPs push their offerings; Pasar Sapa subscribes once and keeps a local index.

01 · Catalog
Toko Elektronik publishes products + policy IRIs. GoPay publishes payment methods + MDR. JNE publishes rate logic + provincial coverage. Pasar Sapa keeps a fresh local index.
02 · Browse
Andi opens the app. Search runs against the local index — no live network call. Listing surfaces with declared availability.status.
04 Trade contract — quote, init

Two phases, then a hand-off.

Quote and init shape the Trade contract enough to ask the Payment sector for an instrument. The Trade /confirm waits until after the payment is verifiable on-network.

03 · /select
BAP submits item, qty, drop pincode. BPP returns quote with structured breakup including PPN at the rate sourced from current PMK.
04 · /init
Full Surabaya address. Crucially, /on_init returns a paymentRequest — amount, payee VPA, idempotency key — to be discharged via the Payment sector.
05 Payment contract

The middle contract, on-network.

Three phases turn an off-network QRIS scan into an on-network Payment contract that the auditor can read. The /on_status [PAID] push carries the NTPN reference so downstream contracts have proof.

05 · /select
BAP queries Payment BPP with amount + parties. GoPay returns supported methods (QRIS, VA, EWALLET) with the MDR for each — letting the BAP show price-by-method.
06 · /init
Consumer picks QRIS. BAP /inits the chosen method; GoPay returns the QRIS string with an expiry and a paymentRef.
07 · /confirm + PAID
BAP confirms with linkedContractId to Trade. Andi scans, authorises off-network; GoPay pushes /on_status [PAID] with settlementId and NTPN.

Then the Trade contract closes. Phase 08 is the original Trade /confirm, now attaching paymentReference = PAY/2026/0429/G7H8. Toko Elektronik (PKP-registered) returns the Faktur Pajak reference and fulfilment warehouse. Trade contract ACTIVE.

06 Logistics contract

The third linked contract.

Same shape as Logistics in the Trade-only walk-through. Three phases — select, init under the FWA, confirm with linkedContractId pointing back at Trade.

09 · /select
Actual shipment profile — pickup, drop, weight, declared value. JNE returns binding rate with a quote validity window.
10 · /init + FWA
BAP attaches active logistics-fwa reference (Pasar Sapa × JNE 2026 Q2). The FWA's commercial envelope supersedes per-offer policies.
11 · /confirm + link
Carries linkedContractId = TRADE/2026/0429/A1F2. JNE returns an AWB; Logistics contract ACTIVE.
07 Transit & delivery

Pickup, transit, the door.

Three phases of status events. Direct phone numbers stay off the wire — only proxied. The delivered photo closes both contracts; Andi gets a push.

12 · Pickup events
BPP-Trade pushes DISPATCHED with the AWB. JNE collects from the warehouse and pushes PICKED_UP with proxy phone numbers.
13 · Transit
JNE routes through Jakarta hub (P2H2P). BAP opens a /track session for live GPS, in addition to coarse status pushes.
14 · Delivered
JNE pushes DELIVERED with delivery-proof photo. BAP relays via /update; Trade contract → COMPLETE.
08 Settlement

Three reconciles, three rhythms.

Trade reconciles per-contract with PPN and bukti potong. Logistics reconciles in monthly batches with FWA rebates. Payment reconciles its own economics — MDR, refund rate, auth-success rate — keeping payment health observable network-side.

15 · Rating
Andi rates once. BAP splits into Trade ratings (PROVIDER, ITEM) and Logistics ratings (FULFILLMENT, PACKAGE_CONDITION, AGENT_BEHAVIOUR).
16 · Trade reconcile
BAP previews, commits. /on_reconcile carries PPN remittance, platform fee, and bukti potong references.
17 · Logistics reconcile
Per-shipment doesn't scale — settles monthly with isBatch=true, applying FWA volume rebates and weight-dispute adjustments.
18 · Payment reconcile
Payment BPPs settle their own economics with the BAP — MDR, refund-rate adjustments, authorisation-success-rate reporting.

One identifier, three sectors. The Payment and Logistics contracts both attach linkedContractId pointing at the Trade contract. That single field is what lets the BAP — or any auditor — stitch TRADE/…/A1F2, PAY/…/G7H8, and LOG/…/J7K9 into one coherent transaction story.