Teika
Dealer ordering in a Zalo Mini App, priced by tier.
export const project = {
type: "fullstack",
stack: [
"React",
"zmp-ui",
"jotai",
"Vite",
"Tailwind CSS",
"Express",
"MongoDB",
"pnpm + Turborepo",
"Zalo Mini App SDK",
"Zalo OA",
],
shipped: true,
};- Year
- 2026
- Client
- Teika
- Role
- Solo engineer
- Duration
- 2 months
Architecture
Technical notes
The brief
Teika sells hardware and building materials to dealers who reorder the same items every week. Those orders arrived by Zalo message, were priced by hand against a tier the salesperson had to remember, and were typed into a spreadsheet twice. The brief was to let a dealer place that order themselves, at their own price, without learning anything new.
The approach
A Zalo Mini App, because that is already where the conversation was happening. Login is passwordless — the Zalo identity is the account, so a dealer opens the app and is simply in it.
Price is the interesting part. Every dealer sits in a tier — Bronze, Silver, Gold, Platinum — and the tier decides what they see. The tier lives on the backend, prices resolve server-side, and the Mini App never receives a price the dealer isn't entitled to. Behind it: one Express + MongoDB backend with 16 modules, a React admin for the internal team, and a shared pnpm monorepo.
The harder parts
Debt. A dealer's credit position decides whether an order can be placed at all, and that number moves as invoices and payments land. Making it a first-class module rather than a report meant the Mini App could refuse an order at the right moment, with a reason, instead of accepting it and letting sales sort it out later.