← All work

The Ticket

Ticketing platform for live events in Vietnam

Years
2021 - PresentActive

A ticketing platform that has run real concerts and festivals across Vietnam since 2021 - In The Moonlight, Soul of The Forest, HayFest, Dear Ocean, Isle of Art, SkyNote and more. It started as The Bros: an Express API, a React admin and a public site I wrote from scratch, including the first seat-map renderer. In 2024 it moved to a Lerna monorepo that added a mobile app, a merchandise shop and a much faster seat picker. It now runs as a pnpm monorepo holding the public site, the admin console, the API, a drag-and-drop event page builder, a canvas seat-map editor and viewer, and a dedicated queued mail service. I have been the engineer responsible for it across all three generations, and wrote the large majority of it myself.

What I built

  • Built the original platform from scratch in 2021 - auth, workspaces for multi-tenancy, events, stages, seat classes and zones, bookings, checkout, discounts, gift codes, affiliates and resellers, programmes, lineups, banners and a newsletter - the domain model that every later version still uses.
  • Built the QR ticketing and door operation: QR generation and validation, check-in list generation, and later rotating exchange keys so a code cannot be reused or forwarded.
  • Wrote three generations of seat mapping. The first rendered fixed maps and validated seat positions; the second added a seat-info model, hover detail and performance work that made large maps usable on both admin and web; the current one is a full canvas editor with multi-select, position constraints and axis boundaries, curved rows with curvature anchors, circle and shape drawing, group boundaries, seat classes and pricing, import/export, and a dry-run mode that previews how a map change would sync against seats already sold.
  • Shipped the booking flow end to end and kept extending it: seat selection, group and zone booking, bulk creation, combos, early-bird pricing, sold-out states, pending-booking countdowns, retry payment, discount codes and vouchers, ticket delivery types and shipping.
  • Built a “blind box” mystery-ticket product: weighted random seat selection by blind-box weight, per-user balance and distribution limits, order and open histories, discount support and confirmation emails.
  • Integrated Vietnamese e-invoicing (ME Invoice) with request logging, publish retries and invoice management across both events and sale campaigns.
  • Built the admin console three times over - events, bookings, orders, discounts, affiliates, check-in, workspaces, users - with order and revenue statistics per sale campaign, dashboard export via html2canvas, and Excel exports for bookings, invoices, QR codes and blind-box orders.
  • Wrote the event page builder: a section-based drag-and-drop editor with lineups, fan-message carousels and sponsor blocks, plus page cloning, so a new event site ships without touching code. HayFest and the WowShow series ran on earlier versions of exactly this.
  • Added a merchandise shop alongside ticketing - products, variants and sale campaigns - so an event sells its tickets and its merch from one basket.
  • Handled the operational edges myself: Redis caching with invalidation on stage and event changes, scheduled cron jobs with graceful shutdown, Socket.IO for live updates, a separate queued mail service, Sentry, and per-package deploy workflows.
  • Carried the domain model through two full rewrites - bookings, seats, seat types, QR codes, sale campaigns, affiliates, gift codes, lineups and workspaces have survived since 2021, which is why each rebuild shipped without losing the events already running on it.

Stack

  • Next.js
  • React
  • TypeScript
  • Konva
  • Framer Motion
  • Express
  • Sequelize
  • PostgreSQL
  • Socket.IO
  • Redis
  • NestJS
  • BullMQ
  • Firebase
  • AWS S3