In Development, 2026

Spotlight Egypt — Event Management Platform

A ticketing and event-operations platform for an Egyptian concert/event promoter — an empty NestJS skeleton became a near-complete backend platform in about three weeks.

Next.jsTypeScriptNestJSPostgreSQLRedisPaymobWebSocketsTailwind CSSDockerCI/CD

Video Demonstration Showcase

Interactive Video Showcase Coming Soon

We are recording a voice-over walk-through of Spotlight Egypt's primary features, dashboard modules, and server operations. In the meantime, explore the complete system architecture details below!

Project Overview

Spotlight Egypt is an event organizer/promoter — producing concerts, festivals, stand-up comedy, and theatre shows — that needed its own ticketing platform instead of depending on a third-party marketplace, to keep full control over pricing, refund policy, buyer communication, and branding. I'm architecting and building the platform solo, end-to-end, and after weeks of deliberate product/architecture discovery, execution moved fast: in a run from mid- to late-August, the backend went from a bare NestJS skeleton to Auth (Google/Facebook OAuth and email OTP for customers, email + password + TOTP MFA for the internal team, Redis-backed sessions, server-side RBAC down to per-event ownership), a full Events/Artists/Venues/Tickets catalog supporting both capacity-tier and seat-map allocation, Orders and Paymob payments with a checkout queue and idempotent webhook handling, ticket-level refunds, coupons and presale access codes, a BullMQ/Brevo notification pipeline, QR check-in, and a live WebSocket analytics dashboard — deployed on Render via Docker. The core engineering problem the whole system is designed around: a ticket on-sale for a popular artist is the platform's real load test, and an outage or overselling incident during that spike is a direct financial and reputational hit, not just a bug. With the backend now essentially feature-complete, current work is wiring the customer-facing storefront (browse, hold, checkout) up to it.

Key Capabilities

A Full Ticketing Backend, Solo

Scope

13 domain modules — Auth, Users, Artists, Venues, Events, Tickets, Orders, Payments, Refunds, Coupons, Access Codes, Notifications, Analytics, Checkins — designed and built end to end by one engineer, deployed on Render.

Multi-Provider Auth, Role-Scoped MFA

Security

Google/Facebook OAuth and email OTP (Brevo) for customers; email + password + TOTP MFA for Admin and Organizer accounts; scoped Gate Staff logins. Redis-backed sessions and server-side RBAC enforce not just roles but per-event resource ownership.

Two Overselling-Prevention Strategies, By Design

System Design

Capacity-tier inventory (VIP/Regular/...) is protected with a Redis atomic counter; seat-map inventory (individually numbered seats) uses a Redis distributed lock per seat — two different concurrency mechanisms chosen deliberately per allocation type, not one stretched to fit both.

Paymob Payments + Checkout Queue

Payments

Paymob's Intention API and Unified Checkout handle payment collection; every processed webhook event ID is stored before an order is marked paid, so retried or duplicate callbacks can't double-fulfill an order. A narrower, checkout-scoped admission-token queue protects the payment step itself under load — deliberately not a site-wide waiting room.

Ticket-Level Refunds With Approval Routing

Operations

Refunds process at the individual ticket, so partial refunds within a multi-ticket order work. Requests outside the event's normal policy, or above a value threshold, route to Admin for approval before they ever reach Paymob.

Live WebSocket Analytics Dashboard

Realtime

Order-paid and refund-succeeded events stream straight to an Admin/Organizer dashboard in real time — tickets sold, revenue, refund rate, and check-in progress — Organizer scoped to their own events, Admin seeing everything.

BullMQ Notification Pipeline

Infrastructure

Order, refund, and event-lifecycle emails (via Brevo) run as background jobs on a Redis/BullMQ queue, so sending a confirmation email never competes with the latency-sensitive checkout request itself.

Interactive Architecture Flow

Hover or click on the system modules to inspect their dynamic interactions and roles within the product stack:

client

Next.js Client

App Router, TypeScript, Tailwind v4, next-intl for EN/AR routing. Marketing site live in production; storefront (browse/hold/checkout) is being wired up to the now-complete backend.

Blueprint Sketch

Architecture mapping diagram is currently loaded in the interactive matrix viewer on the left.

Technical Challenges & Resolutions

Problem

Protecting a flash ticket sale from overselling without punishing buyers with an artificial queue.

Resolution

Considered a site-wide virtual waiting room with queue positions and admission tokens, then explicitly rejected it after discovery — ticket holds plus atomic inventory operations were confirmed as sufficient protection, keeping checkout honest: a buyer either gets the ticket or sees it's gone, no fake waiting state. A much narrower, checkout-scoped admission queue was later adopted specifically to protect the payment step — a distinct decision, not a reversal.

Problem

Preventing overselling under two structurally different inventory models — capacity tiers and individually numbered seats — inside one Tickets domain.

Resolution

Resolved with two different concurrency mechanisms instead of forcing one to fit both: a Redis atomic counter safely decrements capacity-tier inventory under concurrent holds, while seat maps use a Redis distributed lock scoped to the individual seat.

Problem

Making Paymob webhook handling safe against retries and duplicate callbacks.

Resolution

Every processed gateway event ID is stored before an order is marked paid or a ticket is issued, so a retried or duplicated webhook can't double-fulfill an order or generate duplicate tickets.

Problem

Designing a single-organization platform after an early draft explored a multi-organizer model.

Resolution

Ran a follow-up discovery session that corrected course: Spotlight Egypt runs its own events only, so the data model dropped tenant scoping entirely — the roles settled as Admin (platform-wide) and Organizer (scoped to their own events) instead of a speculative tenant hierarchy that didn't reflect the real business.

Development timeline & Story

Phase 1: Foundation

Monorepo, Design System & Discovery

Scaffolded the Turborepo monorepo, shipped the bilingual (EN/AR, RTL-aware) marketing site, stood up a NestJS backend skeleton, and ran four rounds of business/product/architecture discovery — resolving the single-organization model, Paymob as payment gateway, and concrete status-enum-driven domain design before writing domain code.

Phase 2: Auth

Full Auth, Backend and UI, in a Day

Shipped Google/Facebook OAuth, email OTP (Brevo), Admin/Organizer password + TOTP MFA, Gate Staff accounts, Redis sessions, and server-side RBAC — plus the matching sign-in and account UI — verified end to end against real dev infrastructure.

Phase 3: Catalog

Artists, Venues, Events & Tickets

Built the full catalog domain — Artists/Venues, Event lifecycle and reschedule, and Tickets with both allocation strategies — resolving and implementing both overselling-prevention mechanisms (Redis counter for tiers, Redis lock for seats).

Phase 4: Transactions

Orders, Paymob, Refunds & Marketing

Built Orders and checkout, the Paymob adapter and idempotent webhook fulfillment, the checkout queue, ticket-level refunds with approval routing, coupons, and presale access codes — while migrating backend hosting from DigitalOcean to a Dockerized Render deployment.

Phase 5-6: Fulfillment & Insight

Notifications, Live Analytics & Check-In

Wired the BullMQ/Brevo notification pipeline, a WebSocket-powered live Admin/Organizer analytics dashboard, and QR-based Gate Staff check-in scanning.

Now

Wiring the Customer Storefront

With the backend essentially feature-complete, current work is connecting the customer-facing browse/hold/checkout experience to it, ahead of an offline-capable PWA check-in flow and platform-resilience hardening.

Interested in discussing similar system integrations?