All Projects/Lucky Draw System
// 08 / Event Platform

Lucky Draw System

A real-time raffle app built for a live property expo — registration gated on actual payment proof, a fair server-side draw hidden behind a 15-second countdown for drama, and a printable registration invoice.

React
Node.js
MongoDB
Framer Motion
Cloudinary
JWT
Lucky Draw System — product screenshot
// Overview

The problem Lucky Draw System solves.

Running a live raffle by hand is a headache. Someone has to track who signed up, check who's actually paid, and pick a genuinely random winner in front of a crowd without anyone thinking it was rigged.

This app replaces all of that: staff register participants with photo ID and a payment receipt, the system tracks who's actually verified, and one button press runs a real computer-generated draw with a countdown on screen for the crowd.

It was built for SS Builder & Prop Interior's property expo, shipped in about a week, and includes a printable registration invoice — because there was real money and real prizes on the line, not a demo wheel spin.

// My Role

End-to-end ownership.

I built the Lucky Draw System solo — the winner is picked server-side the instant the button is pressed, while a separate 15-second countdown plays purely for effect, plus a client-ready invoice pipeline that generates right in the browser.

Server-side random winner selection fired concurrently with a 15-second theatrical countdown

Payment ("BM") verification gating — only financially verified participants can be drawn

Client-side PDF/PNG invoice generation via html2canvas + jsPDF, styled for real business use

Streamed Cloudinary image uploads (headshot + payment voucher) with zero server disk dependency

Searchable, filterable, exportable participant table with live registration statistics

// Tech Stack

Tools of choice.

Frontend
React 18
Vite
Tailwind CSS
Framer Motion
Backend
Node.js
Express 5
JWT Auth
Database & Deploy
MongoDB
Mongoose
Cloudinary
Vercel
// Key Features

What makes Lucky Draw System different.

Theatrical, Provably Fair Draw

The winner is selected server-side the instant the button is clicked; a 15-second countdown is purely for suspense, not a loading delay.

Payment Verification Gate

A "BM Verification" flag is the hard gate into the draw — the query itself excludes unverified participants, not just the UI.

Printable Registration Invoice

A letter-quality, branded invoice with photo, signature lines, and terms — generated client-side as PDF or PNG.

Verified Registration Intake

Full participant details plus headshot and payment-voucher photo upload, validated and resized automatically via Cloudinary.

Live Participant Table

Searchable, sortable, filterable list with live stats and CSV/print export for reconciliation against physical records.

Defense-in-Depth Auth

Layered JWT middleware — strict login gate, lightweight identity attach, and an admin-only check — protects every participant route.

// Results & Impact

What it achieved.

0s
Theatrical countdown, real-time fair
0 week
Built start to finish
0%
Server-side winner selection
0
Local disk file dependency

The countdown has to feel suspenseful, but the pick has to actually be fair. Firing the real API call and the on-screen countdown at the same instant solves both — the drama is real screen time, but the winner's already decided server-side before anyone sees it.

Internal engineering note
Internal engineering note
Architecture review
// What's next?

Like what you see?

Check out more of my work, or just reach out if you want to talk about a project.