trong.
Full-stack2026

Teika

Dealer ordering in a Zalo Mini App, priced by tier.

teika.ts
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

01

02

03

Highlight 01
16
Highlight 02
4
Highlight 03
0

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.