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