HO

Hans Oheneba

Midnight Madness: The Meltdown

I built Midnight Madness as an end-to-end ticketing experience for a Halloween party, covering event discovery, ticket selection, payment, and post-payment communication. I also built an admin side that tracked payments, attendee status, and entry verification, so the team could run the night with less guesswork.

Live link not available as event has already ended.

Tech Stack

Tailwind • TypeScript • Flask • MySQL • Clerk • Paystack • Hubtel (SMS)

TypeScript

TypeScript

Tailwind CSS

Tailwind CSS

Python (Flask)

Python (Flask)

MySQL

MySQL

Clerk

Clerk

Paystack

Paystack

Hubtel (SMS)

Hubtel (SMS)

Context

Project Overview

The product was built to handle high-intent traffic close to the event date, reduce failed purchases, and give organizers a reliable view of payments and attendance.

The landing experience was structured around quick answers: what the event was, when it was happening, where it was located, and how to get a ticket in under a minute. The ticket flow was intentionally short, with clear tier states like sold out and coming soon.

After payment, the platform sent SMS notifications via Hubtel, so buyers received a fast, mobile-first confirmation even if they never checked email. Authentication and admin access were protected with Clerk to keep operational tooling separate from the public flow.

The admin side was built as a true operations panel, not a basic table: it tracked who paid, when they paid, the ticket tier, and attendance status, so the team could validate entry and reconcile payments without spreadsheets.

Built to optimize for

  • Purchase claritySimple ticket tiers
  • Trust & verificationPayment confirmation
  • Operational controlAdmin attendance view
  • Perceived performanceLoading states

Primary users

Party-goers

Fast ticket purchase flow

Internal users

Event staff

Payments + attendance tracking

UI

Screenshots

These were the key screens I designed to move users from interest to paid tickets, and to give organizers a clean operational view.

Midnight Madness event page showing date, location map, and poster

Event landing page (date, location, and poster preview) with a clear ticket CTA.

Replace image paths with your actual screenshots in /public.

Ticket selection page showing tiers and summary

Ticket selection flow with tier states (sold out, active, coming soon) and a real-time summary.

Replace image paths with your actual screenshots in /public.

Checkout and payment step

Checkout step integrating payments with a friction-minimized confirmation experience.

Replace image paths with your actual screenshots in /public.

Admin dashboard showing payments and attendance data

Admin dashboard for payment verification, attendance tracking, and operational visibility.

Replace image paths with your actual screenshots in /public.

Decisions

Key Product Decisions

I built the flow like an event funnel: fast context, clear ticket choice, reliable payment, immediate confirmation, and a back-office that stayed accurate during the rush.

Scroll-driven reveal with Framer Motion

I designed ticket tiers with clear states

Decision 1

I treated tiers as a predictable system: early bird could be sold out, regular could be active, and late could be coming soon. This reduced confusion and prevented users from attempting unavailable options.

I integrated Paystack for payments

Decision 2

I implemented a payment flow that focused on conversion reliability and clean post-payment verification, so organizers could trust what the dashboard was showing.

I used Hubtel SMS for confirmations

Decision 3

I sent SMS confirmations after successful payment so buyers got immediate feedback on mobile. It also reduced support messages like “Did my payment go through?”

I protected admin access with Clerk

Decision 4

I implemented role-protected access for the admin side so internal data stayed private and only authorized staff could view payments and update attendance status.

I built the admin side as an operations panel

Decision 5

I stored payment records with timestamps and linked them to attendance. Staff could verify entry quickly and keep a reliable record of who had attended.

I implemented loading states for perceived performance

Decision 6

I used structured loading states to keep layouts stable, reduce visual jumping, and make the flow feel fast during peak traffic windows.

Build

Architecture & Data Flow

The platform separated the public purchase journey from internal operations, while keeping one consistent source of truth in the database.

The frontend was built with TypeScript and Tailwind for fast UI iteration and consistent styling. The backend API was built in Flask and connected to MySQL for durable storage of ticket purchases, attendee records, and admin actions.

Clerk handled authentication and gated access to admin routes. Paystack handled payment initiation and confirmation, and Hubtel delivered SMS confirmations after successful transactions. The admin dashboard pulled from the same payment records, so staff always saw the latest verified state.

Data path

  1. 1User landed on the event page and selected a ticket tier
  2. 2Frontend initiated payment via Paystack
  3. 3Flask validated and stored the transaction in MySQL
  4. 4Hubtel sent SMS confirmation to the buyer
  5. 5Admin dashboard displayed payment and attendance state (Clerk-protected)
  6. 6Staff updated attendance when attendees arrived

Admin capabilities

  • • View all paid tickets with timestamps and tier
  • • Search/filter attendees by name, phone, or ticket type
  • • Mark attendance status at entry
  • • Track totals for paid vs attended

Outcome & Impact

The final result was a production-ready event ticketing platform that handled the full buyer journey and gave organizers a clean admin view for reconciling payments and managing attendance. The combination of Paystack verification, Hubtel SMS confirmations, and a Clerk-protected admin panel reduced operational friction and kept event-day decisions data-driven.

Clear ticketing flowVerified paymentsAttendance trackingLoading states

Want the full breakdown (DB schema, endpoints, and admin workflows)? I can add a short “Implementation Notes” section beneath this case study.

Tip: Add your screenshots to /public/projects/midnight-madness/ and keep the names aligned with the screenshots array above.