Skip to content
Work

Product EngineeringFeatured

Serupa Ticket Hub: Event Ticketing Platform

An event ticketing platform with an attendee site, an organizer dashboard and an Express API, from event discovery to QR e-tickets.

Role
Full Stack Engineer in a two-person team (backend foundation, accounts, events, caching and uploads, the attendee site and the organizer dashboard)
Period
Jun 2025 to Aug 2025
Client
Serupa

Results

  • 3 apps

    Delivered as an Express API, an attendee site and an organizer dashboard

    From the three project repositories.

  • 95%

    Share of commits I authored on the attendee site and the organizer dashboard (62 of 65)

    Non-merge commits in git history from Jun to Aug 2025, excluding commits generated by v0.

  • 34%

    Share of backend commits I authored (45 of 133); my teammate wrote the order and payment code

    Non-merge commits in git history from Jun to Aug 2025.

Problem

Serupa needed its own ticketing platform: organizers publish events with ticket tiers, attendees find events and get free or paid tickets online, and every order ends in a ticket that can be shown at the door. Two freelance engineers built it as three apps between June and August 2025.

What I did

  1. I set up the API on Express 5 and Bun with routes, controllers, services and repositories over PostgreSQL and Drizzle, plus Helmet, rate limiting, structured logs, seed data and GitHub Actions deploys.
  2. I built accounts and events in the API: JWT access and refresh tokens, email verification and password reset, user and admin roles, event search with filters, a Redis event cache with invalidation, rate-limited view counts and S3 uploads for event covers and profile photos.
  3. I built the attendee site in Next.js with TanStack Query: event discovery and search, event pages with ticket tiers, a free-ticket flow, checkout with a payment method choice, payment result pages and My Tickets with QR codes, plus SEO metadata and a sitemap.
  4. I turned a v0-generated scaffold into the organizer dashboard and connected sign-in and event creation, editing and listing, with sub-categories and a location map, to the API.
  5. My teammate built ticket orders and payments in the API (quota and per-user limits, payment links and callbacks for QRIS, cards, e-wallets and virtual accounts, PDF invoices, status emails and Socket.IO payment events); my checkout and My Tickets pages call those endpoints.

Architecture

  1. ClientAttendee siteNext.js 15, TanStack Query
  2. ClientOrganizer dashboardNext.js 15, Radix UI
  3. ServiceExpress APIBun, JWT, Socket.IO
  4. DataPostgreSQL (Drizzle)Events, tickets and orders
  5. DataRedisEvent cache, view counts, payment links
  6. ExternalAWS S3Covers, photos, invoices
  7. ExternalPayment gatewayQRIS, cards, e-wallets, VAs

Data flow

  • Attendee site to Express API (REST + JWT)
  • Organizer dashboard to Express API (manage events)
  • Express API to PostgreSQL (Drizzle) (queries)
  • Express API to Redis (cache)
  • Express API to AWS S3 (uploads)
  • Express API to Payment gateway (payment links)
  • Payment gateway sends asynchronously to Express API (callbacks)

Tech stack

  • Express
  • TypeScript
  • Bun
  • PostgreSQL
  • Drizzle ORM
  • Redis
  • Socket.IO
  • JWT
  • Google OAuth
  • AWS S3
  • Next.js 15
  • TanStack Query
  • Tailwind CSS
  • shadcn/ui
  • GitHub Actions

L2 · Related career entryFull Stack Engineer (freelance) · Serupa