Product EngineeringFeaturedL3:event-ticketing-platform
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
- 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.
- 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.
- 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.
- 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.
- 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
- ClientAttendee siteNext.js 15, TanStack Query
- ClientOrganizer dashboardNext.js 15, Radix UI
- ServiceExpress APIBun, JWT, Socket.IO
- DataPostgreSQL (Drizzle)Events, tickets and orders
- DataRedisEvent cache, view counts, payment links
- ExternalAWS S3Covers, photos, invoices
- 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)
Gallery
Tech stack
Express
TypeScript
Bun
PostgreSQL
- Drizzle ORM
RedisSocket.IO
JWT
Google OAuth
AWS S3Next.js 15
TanStack Query
Tailwind CSS
shadcn/ui
GitHub Actions
More Product Engineering projects
L2 · Related career entryFull Stack Engineer (freelance) · Serupa