Event Registration Platform
NEET CON 2026
End-to-end event registration with payments, WhatsApp delivery, and QR check-in for a national conference.
Overview
Problem
A national conference needed to register a large number of attendees, collect payment reliably, deliver confirmations and passes without manual follow-up, and let event staff verify attendees quickly at the door.
Solution
A self-serve registration platform: attendees register and pay online, receive a WhatsApp confirmation with a QR-coded digital pass automatically, and staff scan passes at check-in from an admin dashboard showing live registration and attendance numbers.
Architecture
Client
Public registration flow + staff-facing admin dashboard, both in Next.js.
Payments
HDFC SmartGateway integration handling payment collection and verification.
Messaging
Meta WhatsApp Business API sending automated confirmations and passes.
Passes
Server-generated QR codes bound to each registration record.
Data
Registration, payment, and check-in records with admin-facing aggregates.
- Payment confirmation triggers the WhatsApp send — the pass is only issued once payment is verified via the gateway's webhook, avoiding passes issued for unpaid registrations.
- Each QR code encodes a signed reference to the registration record, so check-in scanning validates against the database rather than trusting the code's contents blindly.
- The admin dashboard reads from the same registration table the public flow writes to, giving organizers a live count with no separate reporting step.
Feature Breakdown
- Self-serve registration with HDFC SmartGateway payment collection
- Automated WhatsApp confirmation and digital QR pass delivery on successful payment
- QR-based check-in scanning for event staff
- Admin dashboard with live registration, payment, and attendance numbers
Implementation Detail
export async function handlePaymentWebhook(payload: WebhookPayload) {
const registration = await verifyAndFetchRegistration(payload);
if (registration.passIssued) return; // idempotent — already handled
const qr = await generateSignedQr(registration.id);
await sendWhatsAppPass(registration.phone, qr);
await markPassIssued(registration.id);
}Challenges & Solutions
Payment and pass delivery needed to be reliable — a failed webhook shouldn't mean a paying attendee never receives their pass.
Built idempotent payment-webhook handling with retry-safe pass generation, so a delayed or retried webhook can't issue duplicate passes or silently drop a confirmed payment.
Check-in needed to be fast at the door, without staff needing to look up attendees manually.
QR codes resolve directly to a registration record server-side, so scanning is a single lookup — no manual search required.
Results
- No staff involvement between an attendee paying and receiving their pass — the old process would have needed someone manually confirming payments and sending passes one by one.
- Check-in became a single scan per attendee instead of a name lookup against a printed or spreadsheet list — the actual bottleneck at high-attendance events.
- Organizers could see registration and payment numbers live during the sign-up window, instead of waiting on an end-of-day manual count.
Lessons Learned
- Payment gateway webhooks arrive late, out of order, or more than once often enough that idempotency isn't an edge case to handle later — it has to be the default assumption from the first line of the handler.
- Binding the QR code to a server-side lookup instead of encoding trust into the code itself was a small extra step that closed an obvious pass-forgery risk.
Gallery
Screenshots to be added.