Back to home · Case 02 · Cross-border trade, Thailand–Myanmar · In daily use
A console that follows goods across the border, from invoice to warehouse
An import business between Thailand and Myanmar, run by three companies in two countries. Goods travel by truck, air, sea and hand carry. Finding out where a shipment was used to mean asking around in chat groups. Now all three companies open the same screen and see which stage each packing list is at, who holds it, when it will land, and whether the invoice matches the goods.
- 1,800+tests that must pass before every release
- 3companies in two countries on one system
- 5stages from packed to closed
Mark · Built with Claude Code

See it work · sample data
The problem
Invoices and packing lists arrived as spreadsheets in different layouts, one truck's load spread across many of them, each mixing several brands. Checking at the far end that everything arrived at the right price meant going through paper line by line, then building a per-brand breakdown by hand for the sales side.
Three companies in two countries share this work: one in Thailand buys and invoices, another in Thailand hand-carries, and the buyer in Yangon takes the goods on. Each kept its own records, and they coordinated in chat groups. "Where is this shipment now?" was asked every day, and the answer depended on who was free to reply.
All screenshots use sample data
Each brand's value at each stage; status colour shows which brand is stuck or late
One 40-carton list sent on in two parts, each with its own ETA and its own receive key
Value in transit, with problems and late loads on top
A wall display so the whole team sees every load
Invoice value by brand, reconciled automatically
What I built
- 01
Upload the invoice and the system checks it to the satang
Upload a spreadsheet and the system extracts items, quantities, prices and brands, reconciles the total against every line, refuses a file whose total does not add up, and points at any line whose quantity times price is not its amount. The reconciling and per-brand breakdown that used to be done by hand is gone.
- 02
Every packing list on one board, five stages
Packed, dispatched, crossed, arrived, closed. See which stage each list is at and who holds it; late or silent lists rise to the top on their own. Switch to the brand view to see where each brand's money is sitting.
- 03
One list can travel on in parts
Once goods reach the border warehouse they can go on to the destination in several pickups, with different agents. Each part has its own ETA and its own receive key, and the system keeps count of cartons gone and cartons left.
- 04
A QR that asks for a passcode
Hand-carry packing lists print a QR sticker. A phone scan plus a passcode shows the shipping mark, even with the server off, because the mark is encrypted inside the code itself.
- 05
When goods move, the team hears at once on Telegram
Every time goods move or change hands, a message goes to the team's Telegram group with the list number, the carton count and the arrival date. Nobody types updates into a chat any more, and a separate service backs the data up daily.
Where the AI works, and how it is kept honest
- Safeguard
Ask Mark in plain language
Which run hasn't arrived, which invoice is still open, which route has a problem right now: ask Mark in Thai or Burmese. Mark answers from the data in the system, not from memory.
- Safeguard
Numbers belong to code, not to AI
Parsing and reconciling invoices is done by tested code, not guessed by AI, and every version passes more than 1,800 tests before it goes live. Money is not something to get roughly right.
The result
Before
Information was scattered across chat groups and spreadsheets. Anyone who wanted to know where the goods were had to chase someone, and the answer depended on who was free
Data could be incomplete or wrong, and invoice totals had to be checked against what actually arrived, line by line
After
All three companies read the same data, and everyone hears the moment goods move, on Telegram
The system checks every invoice to the satang and refuses a file that doesn't add up, and every handover counts the cartons and records who took them