BookTkit
A full-stack event ticketing platform, from discovery to QR entry.
- Next.js
- PostgreSQL
- Razorpay
- Redis

- Team size
- 4
- Duration
- 8 wks
- Applications
- 5
- Stack
- Next.js
Overview
BookTkit is an event ticketing platform. It brings attendees, event organizers, and platform admins together in one app. Customers can find events, search by name or location, pick their tickets, pay online, manage their bookings, and use a QR code to get into the venue.
Organizers get a dashboard to create and manage events, set up ticket types and sale windows, track revenue, manage attendees, run promo codes, and scan tickets at the door. Admins have their own view for managing events across the platform, handling refunds, and keeping an eye on payouts.
I led a team of four on this project and worked across the whole event journey — from how organizers create an event to how a customer gets scanned in at the gate — over about eight weeks.


The Challenge
The hard part was keeping everything in sync — ticket stock, payments, QR codes, refunds, organizer payouts, and check-ins — without relying on any single step going perfectly, like a browser staying open or a webhook arriving on time.
- A payment can succeed even if the browser closes or a webhook is late, so we needed backup ways to confirm the payment and still issue the ticket.
- Refunds work differently depending on who cancels — the customer or the organizer — so we had to calculate the right amount, reverse organizer payouts, and make sure nothing gets refunded twice.
- Customers, organizers, event staff, and admins all needed their own screens and permissions, while looking at the same underlying event and order data.
Approach
As team lead, I set the direction for the architecture: one Next.js app, built with the App Router, serving the public event pages, customer checkout, organizer tools, and admin dashboards. Behind that sit around 70 API routes for auth, events, bookings, tickets, check-in, payments, refunds, and organizer finance. Sign-in uses NextAuth with Google and email/password, and every route checks that the right role — customer, organizer, admin, or background worker — is allowed to call it.
PostgreSQL with Prisma stores everything: users, events, tickets, orders, attendees, check-ins, promo codes, refunds, and organizer payout records. For anything money-related — completing an order, freeing up ticket stock, finishing a refund — we used database transactions so the numbers always stay correct.
For work that shouldn't block the user, like generating a ticket or processing a refund, we used background queues on Redis. Razorpay webhooks, background workers, and scheduled jobs quietly pick up anything that was missed — a late payment, an unfinished refund, an organizer payout that's ready to release.


On the event side, I built the event creation flow — a multi-step form with a rich-text editor for descriptions, venue search, image uploads, and support for both one-off and recurring events. Paid events go through a Razorpay KYC check before organizers can publish them.
On the customer side, I built search, checkout with Razorpay, payment retries if something fails, booking history, refund requests, and PDF tickets with a QR code for entry.
For organizers and admins, I built the revenue and sales charts, attendee management with spreadsheet exports, promo codes, and the QR scanner for checking people in. I also built the finance tools: organizer bank account setup, holding payouts until after the event, refund retries, and recovering any shortfall from a future payout.
Outcome
BookTkit shipped as one platform covering the full event journey — publish, discover, pay, get the ticket, check in, and, if needed, refund and settle up with the organizer. The background jobs and retries mean the system recovers on its own from things like a missed webhook, instead of leaving a customer without a ticket. The codebase sits at roughly 35,000 lines across the project, and the core financial calculations are covered by 32 automated tests, all passing.

