Skip to content
Back to projects

Event Registration Platform

NEET CON 2026

End-to-end event registration with payments, WhatsApp delivery, and QR check-in for a national conference.

Event platform — 2026Solo build — payment webhook handling and check-in flow
Next.jsMongoDBHDFC SmartGatewayWhatsApp API

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

Issuing a pass only after payment webhook verification
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.