trong.
Mobile app2026

Tú Quyên Spa

Zalo Mini App booking, synced both ways with KiotViet POS.

Year
2026
Client
Tú Quyên Spa
Role
Solo engineer
Duration
3 months

Features

Overview

The brief

Tú Quyên Spa already ran on KiotViet — customers, services, invoices, stock all lived there. They wanted booking to move into a Zalo Mini App without giving up the POS the staff use all day. So the app could not be the source of truth; it had to agree with one.

The approach

An Express + MongoDB + Redis backend sitting between the Mini App and KiotViet, syncing both ways. Bookings and orders made in the app are pushed into KiotViet; anything the front desk changes on the POS comes back through webhooks and updates the app. Twenty models cover the domain — bookings, branches, customer packages, invoices, vouchers, promotions, reviews.

Zalo OA sits alongside it: followers are tracked, and ZNS carries booking confirmations and reminders to the customer's Zalo rather than to an SMS they'll ignore.

The harder parts

Two-way sync is a conflict resolution problem wearing a data-transfer costume. Both sides can edit the same booking, webhooks arrive out of order, and KiotViet occasionally replays one. Every inbound webhook is logged and made idempotent, and the app never treats its own copy as authoritative for anything the POS owns — it renders what came back, not what it hoped had happened.

Stack

  • React
  • zmp-ui
  • Express
  • MongoDB
  • Redis
  • KiotViet API
  • Zalo OA
  • Zalo ZNS
  • Docker