
The problem
64 Theatre Limited (Eldoret) needed to sell tickets online, take mobile-money payments, and check guests in reliably at the gate — even when the venue's internet drops. They also needed to start selling before Safaricom had approved a paybill in their own name.
My approach
I designed and built a modular Laravel platform: public event pages with a three-step M-Pesa checkout, signed-QR ticket delivery, a Filament admin and an offline-capable gate scanner. Payments go through Kopo Kopo so the theatre could sell before its own Safaricom paybill was approved — the gateway is a swappable seam, so moving to Daraja is one environment variable.
How it's built
- Laravel 13 / PHP 8.4 modular monolith, Filament 5 admin, SQLite on a persistent volume.
- M-Pesa STK Push via Kopo Kopo, with a signed webhook; Pesapal and Safaricom Daraja behind the same interface.
- HMAC-signed QR tickets verifiable offline; double-entry ledger for every sale.
- Deployed on a shared VPS behind Caddy — its own compose project, no published port, alongside eleven other services.
Highlights
- Offline-first gate scanner — tickets verify without internet.
- Double-entry money ledger; every ticket redeems exactly once (DB-enforced).
- Box office can push an M-Pesa prompt to a walk-up buyer, or take cash.
- Payment provider switchable from the admin; credentials never leave the server.