Journal · 8 March 2026

Instrumenting Thai marketplace checkouts

Nalinee Sutham · ~14 minutes

Warehouse aisle suggesting marketplace fulfilment

A checkout in Thailand is rarely a single tap that becomes money. PromptPay waits on a callback. Cash on delivery waits on a human with a bag. Dual wallets hop. If your live board fires checkout_paid on intent, you are running a optimism engine, not Real-Time Usage Analytics. This note is the README paragraph I wish every Bangkok marketplace shipped.

Name the hops, not the mood

We use four events in the lab’s Thai path: checkout_started, payment_method_chosen, checkout_intent, checkout_settled. PromptPay may sit in intent for minutes. COD may sit there until the next afternoon. Dual-wallet users can ping method_chosen twice. The live chip for “paid” only moves on checkout_settled, and the tooltip says which hop is missing when it does not.

What the socket cannot see

Some PromptPay confirmations arrive through a partner file, not a webhook. Some COD “settled” states are written by a rider app that is offline in a soi with bad reception. The live wall must show unknown, not zero, and not a spinner that looks like progress. Unknown is an honest live claim. Zero is a fiction that pages warehouse people.

The sentence that belongs in the README

“Live conversion excludes COD until rider_confirm and excludes PromptPay until partner callback or file land; intent is charted separately.” If that sentence is missing, finance and product are looking at different religions. Arthit’s remote Lab Seat critique was exactly this rename. Ghosts left the celebration tile. The path did not get shorter; the language did.

Module six of the Live Usage Lab spends an evening on this path with a trace you can annotate. Bring your own hops if they differ — TrueMoney, Rabbit, a mall gift card. We will not invent a universal Thai checkout. We will insist that settled and intent never share a chip. Write the desk if your README still treats them as synonyms.