Spooky’s Y2K Rave
Event ticketing platform
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
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