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.
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.
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
Tools of choice.
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.
What it achieved.
“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.”
Like what you see?
Check out more of my work, or just reach out if you want to talk about a project.

