JE Joseph Edward Lagos, Nigeria

Type to filter. Use the up and down arrows to move between results and Enter to open the highlighted one.

Spooky’s Y2K Rave

Event ticketing platform

Role
Full-stack
Year
2025
Status
live

Ticketing for a live rave, built to take real money on the night. Paystack handles checkout, and a successful payment issues a QR-coded ticket the door can scan.

  • Secure ticket purchase through Paystack
  • QR-coded tickets generated as PDFs after payment
  • Account handling and registration with allauth
  • Responsive event pages for desktop and mobile

A server-rendered Django application in two apps, where the money path is the critical one: payment confirmation is what mints a ticket, and the ticket is generated as a scannable document rather than a row in a table.

  • Django
  • Python
  • Paystack
  • PostgreSQL
  • qrcode
  • ReportLab
The Spooky’s Y2K Rave ticket tiers with prices and remaining stock

How it is built

A server-rendered Django application in two apps, where the money path is the critical one: payment confirmation is what mints a ticket, and the ticket is generated as a scannable document rather than a row in a table.

Stack

  • Django 5.1 backend
  • DRF 3.16 backend
  • django-allauth backend
  • django-crispy-forms backend
  • paystackapi integration
  • qrcode backend
  • ReportLab backend
  • django-user-agents backend

Architecture

  • Pages service Server-rendered event pages, no separate client
  • Party tickets service Tiers, stock, and QR-coded PDF issuing
    • qrcode
    • ReportLab
  • Paystack external
  • Database datastore

Flow

  • Pages Party tickets
  • Party tickets Paystack Checkout
  • Paystack Party tickets Payment confirmed
  • Party tickets Database

Data

  • The repository ships a SQLite database file and carries no PostgreSQL driver, so the deployed store is unconfirmed

Authentication

django-allauth

  • Registration and account handling delegated rather than hand-rolled

Integrations

  • Paystack Card and transfer payments in Nigerian naira

Technical capabilities

  • Ticket tiers with per-tier pricing and remaining stock
  • QR-coded tickets generated as PDFs after payment
  • Device and browser detection on requests

Infrastructure

  • PythonAnywhere

Notable decisions

  • Issue the ticket from the payment confirmation, not the checkout request

    An unpaid or abandoned checkout can never produce a valid ticket