ShopDunk ERP & iPhone 15 Pre-order
About
A retail ERP for ShopDunk — an Apple authorized reseller chain — plus the iPhone 15 pre-order portal for the biggest launch day of the year.
Outcome
The pre-order system handled over 5,000 pre-orders on the first launch day without interruption. Our team stayed on watch from 8 AM on opening day until 6 PM the next day to make sure every order was captured and routed to the right store.
Problem
iPhone launch day is a flood of traffic: thousands of customers ordering at once in the first hours, and every order must match per-store, per-variant inventory. Double-booking one device for two customers costs both revenue and reputation.
At the same time, the ERP had to serve the chain's day-to-day operations — it couldn't be a system that only survives on sale day.
Context
- ShopDunk belongs to HESMAN Group, one of Vietnam's largest Apple authorized reseller chains.
- Preparation time for the pre-order campaign was measured in weeks, not months — the architecture had to rely on solid, proven choices.
- The same year, the team shipped Tan Phu ERP in 2 weeks and contributed to Hoang Ha Mobile's ERP — reusing the same architectural foundation.
Product System
The architecture centers on queues and realtime messaging to absorb peak load:
- BullMQ — every pre-order flows through a queue, guaranteeing sequential capture and no double-booked inventory.
- MQTT — pushes order and inventory state to each store's operations screen in realtime.
- NestJS + React + SQL Server — the ERP core; Redis for caching and distributed locks; Docker + Nginx for deployment.
- VOIP integration and a Facebook Chat webhook so the care team could confirm and support customers inside the system.
Role
- Web Team Lead — responsible for the system's web architecture
- Designed the queued pre-order flow and double-booking prevention
- Built core ERP modules and realtime operations screens
- On call through launch day, firefighting alongside the operations team
Learnings
Queues are safety valves
Peak load can't be predicted precisely, but it can be absorbed. Routing every critical write through a queue turns "overloaded" into "a few seconds slower" instead of "orders lost".
Sale day is decided before sale day
Everything that saved us that day — fallback playbooks, monitoring dashboards, incident conventions — was prepared in advance. Improvisation only works as plan B, never as the only plan.
A lead's job is unblocking
Leading through peak week wasn't about writing the most code — it was keeping everyone unstuck: deciding fast, dividing work clearly, and standing where the risk was highest.