Saksham Jain
Back to work
/ 03Case study2026

FindYourVibe

Event discovery and ticketing platform for Raipur, Delhi NCR, and beyond — browse by category, city, and vibe, then book tickets with zero convenience fee.

EventsTicketingMarketplaceFull-Stack
Visit findyourvibe.in
FindYourVibe homepage hero inviting visitors to search events by vibe and city.
Role
Full-stack Developer
Focus
Checkout & ticket inventory
Year
2026
Status
Production

Overview

FindYourVibe is an event discovery and ticketing platform covering Raipur, Delhi NCR, and other cities. Visitors browse events by category, city, and vibe — parties, standup, workshops, concerts — and book tickets with zero convenience fee, from limited-capacity meetups to large ticketed shows.

My role

I worked as a full-stack developer on FindYourVibe, building the event catalog and explore/search experience, the city and category browsing pages, and the checkout flow from ticket selection through payment confirmation. The harder half of the work was underneath the UI: making sure a limited-capacity event can't sell more tickets than it has, even when multiple people check out at once.

The complexity

Problem — A limited-capacity event can be oversold if two people check out the last available ticket at the same moment — a naive read-then-write on the ticket count races, and a plain optimistic retry starts thrashing once a popular event's last few tickets get hit by a burst of checkouts.

Approach — Ticket rows are decremented inside a short transaction holding a pessimistic row lock, so the second buyer's write blocks for milliseconds behind the first instead of retrying blind — worth the small latency here because the alternative (optimistic compare-and-swap) means the losing buyer's client has to retry the whole checkout, not just a write. That decision reserves a slot in Redis with a TTL, so a buyer who abandons checkout releases the ticket back to inventory automatically instead of holding it hostage.

Problem — Explore and city pages filter a growing catalog of events by city, category, and date — a full scan gets slower as more events go live.

Approach — Compound indexes on city, category, and date back the explore and city pages, so filtering stays fast as the event catalog grows instead of degrading with it.

Problem — Payment webhooks can arrive more than once for the same order — retries, network blips — which would issue duplicate tickets if the handler just acted on every delivery, and doing ticket generation + email inline in the webhook handler makes the gateway wait on work it doesn't care about.

Approach — The webhook handler is idempotent, keyed on order ID, and its only job is to publish a "payment confirmed" event to RabbitMQ — a downstream consumer generates the ticket and sends the confirmation. A retried webhook delivery publishes once (the second is a no-op), and checkout stays correct under 300+ concurrent buyers on a single event drop without overselling a ticket.

Architecture

Checkout
Explore / search
City, category, vibe
Event detail
Redis reservation hold
TTL, releases if unpaid
Payment gateway
Webhook
Idempotent, publishes to queue
RabbitMQ
Ticket issued
Confirmation sent
Last-ticket race
2 buyers, 1 ticket left
Simultaneous checkout
Pessimistic row lock
Short transaction
Winner
Gets the reservation hold
Loser
Sees sold-out, no overselling

What shipped

  • Explore/search by category, city, and vibe across multiple cities.
  • Checkout flow with a reservation hold that prevents overselling limited-capacity events.
  • Idempotent payment webhook handling and ticket issuance.
  • Upcoming-events and recommended-events rails driven by the same catalog API.

What I owned

API & data model
Event catalog with compound city/category/date indexes, and the pessimistic-lock ticket decrement behind checkout.
Infrastructure
Redis-backed reservation holds (TTL) and a RabbitMQ queue decoupling ticket issuance from the payment webhook response.
Integrations
Payment gateway checkout and an idempotent webhook handler keyed on order ID.
Frontend
Explore/search, city and category pages, and the checkout flow from ticket selection to confirmation.

Engineering properties

  • Pessimistic row lock on the last few tickets of an event
  • Redis reservation hold with TTL, no overselling
  • RabbitMQ decouples ticket issuance from the webhook
  • Idempotent payment webhook, keyed on order ID

Stack

Next.jsNode.jsExpressMongoDBRedisRabbitMQPayment Gateway