Ikole Ballon d'Or
A football awards night, run on real votes and real money.
- Role
- Full Stack Engineer
- Period
- Jan to Mar 2026
- Status
- Shipped
The platform behind Ikole's football awards: fan voting, event tickets and award packages paid online, with claim codes, email confirmation and an admin dashboard. Tested live with real transactions.

- revenue processed through the platform
- ₦950k+revenue processed through the platform
- paid flows: voting, tickets and award packages
- 3paid flows: voting, tickets and award packages
- validated with real-money transactions end to end
- Livevalidated with real-money transactions end to end
Overview
Ikole Ballon d'Or celebrates football excellence in Ikole, Ekiti. The platform lets fans vote for nominees, buy tickets for the event and purchase award packages online. Every successful payment produces a claim code and an email confirmation that can be verified later. Behind it, an admin dashboard runs nominees, categories, sales and winners.
The problem
An awards night that sells votes and tickets is a payments business for a few intense weeks. Payments have to be confirmed exactly once, votes have to be counted exactly once, and a fan who paid must be able to prove it at the door, on infrastructure a community event can afford.
The solution
The user journey is deliberately short: browse → pay → receive a claim code → verify.
- Payments are verified server-side with Paystack before anything is issued. The browser is never the source of truth.
- Claim codes are generated per purchase and sent by email, and can be verified against the record.
- Media for nominees and categories is stored on Cloudinary.
- Admins get a dashboard with sales, votes and winner management.
Architecture
Fans
- Voting
- Tickets
- Award packages
- Claim-code verification
Frontend
- React + Vite
- Admin dashboard
API (NestJS)
- Paystack verification & webhooks
- Votes
- Tickets
- Claim codes
- Rate limiting
Services
- Email (Resend)
- Cloudinary media
- Scheduled keep-alive
Data
- MongoDB
Engineering challenges
Exactly once
Payment notifications can arrive late or more than once. Every purchase is verified with Paystack on the server, and a transaction that is already marked paid is never processed again, so a repeated notification can't issue a second claim code or a second confirmation email. Stronger replay protection is the next item on the backlog.
Free tiers that sleep
The backend ran on a free hosting tier that sleeps when idle, which is fatal during a voting deadline. A scheduled job pings the service every ten minutes, with a frontend fallback, so fans never hit a cold start at the worst moment.
Fixing it live
During the live period, dashboard statistics and winner-tag logic were corrected the same day they were reported. A follow-up list (token handling on logout, consistent payment-callback references, tighter CORS, stricter TypeScript, wider webhook tests, queued email retries, secret rotation) was written up and prioritised rather than patched in a panic.
Outcome
The platform was tested live with real-money transactions and processed over ₦950,000 across voting, tickets and award sales. Claim codes and email confirmations worked end to end.
Lessons learned
- Verify on the server, every time. The browser is the least reliable participant in a payment.
- Small events still need real infrastructure. Peaks are sharp and deadlines don't move.
- Write the post-mortem while it's fresh, and turn it into a backlog, not a regret.
Technology stack
- React
- Vite
- Tailwind CSS
- NestJS
- MongoDB
- Mongoose
- Paystack
- Cloudinary
- Resend
- Nodemailer




