QuickShow is a full-stack movie ticket booking platform built with a production-focused architecture.
It allows users to explore movies, select show timings, book seats, and complete payments seamlessly — while providing admins full control over shows and bookings.
This project is designed as a real-world scalable system, not just a CRUD app.
Frontend: https://quickshow-frontend-virid.vercel.app/
- Browse now playing movies (TMDB API)
- View movie details (cast, rating, runtime)
- Select show date & time
- Interactive seat selection system
- Real-time seat availability
- Secure booking system
- Stripe payment integration
- View booking history
- Add / remove favorite movies
- Email confirmation after successful booking
- Add new shows (movie + multiple date/time slots)
- View all shows
- Track total bookings & revenue
- View all user bookings
- Dashboard with analytics
-
Role-based access (Admin / User via Clerk metadata)
-
Auto seat release if payment not completed (Inngest)
-
Event-driven workflows (booking, payment, cleanup)
-
Stripe checkout + webhook verification
-
Email notifications via Nodemailer
-
Secure backend with:
- Helmet
- HPP
- Mongo Sanitize
- Rate Limiting
-
Logging using Pino
-
Optimized API structure
-
Event-driven backend (Inngest)
- Auto cleanup of unpaid bookings
- Email triggers
-
Decoupled payment flow
- Booking created → Stripe session → webhook → update DB
-
Optimized DB queries
- Lean queries
- Population control
-
Seat locking mechanism
- Prevents double booking
- React (Vite)
- Tailwind CSS
- React Router
- Axios
- Clerk Authentication
- Node.js
- Express.js
- MongoDB + Mongoose
- TMDB API (movies data)
- Stripe (payments)
- Inngest (background jobs & workflows)
- Nodemailer (emails)
- Cloudinary (media handling)
server/
├── config/
├── controllers/
├── inngest/
├── middleware/
├── models/
├── routes/
├── .env
└── server.js
client/
├── src/
│ ├── api/
│ ├── assets/
│ ├── components/
│ ├── context/
│ ├── pages/
│ └── App.jsx
PORT=
NODE_ENV=
CLIENT_URL=
MONGODB_URI=
CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
INNGEST_EVENT_KEY=
INNGEST_SIGNIN_KEY=
TMDP_READ_ACCESS_TOKEN=
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
STRIPE_PUBLISHABLE_KEY=
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
SMTP_USER=
SMTP_PASS=
SENDER_EMAIL=
VITE_SERVER_URL=
VITE_CURRENCY=
VITE_TMDB_BASE_URL=
git clone https://github.com/baibhavsinhadev/quickshow.git
cd quickshow
cd server
npm install
npm run dev
cd client
npm install
npm run dev
Base URL:
/api
/show→ Movies & shows/booking→ Booking system/admin→ Admin dashboard APIs/user→ User data & favorites
- User selects seats
- Booking created in DB
- Stripe checkout session created
- User completes payment
- Stripe webhook verifies payment
- Booking marked as paid
- Auto release seats after 10 minutes (if unpaid)
- Delete unpaid bookings
- Send booking confirmation emails
-
Booking confirmation email sent after successful booking
-
Includes:
- Movie name
- Date & time
- Seats
- Amount
- Helmet for secure headers
- HPP for HTTP parameter pollution
- Mongo Sanitize for NoSQL injection
- Rate limiting for API protection
- Clerk authentication for user management
- Multi-theatre support
- Real-time seat locking (WebSockets)
- Advanced analytics dashboard
- Refund & cancellation system
- Mobile responsiveness improvements
- Use MongoDB Atlas or local DB
- Configure Stripe webhooks properly
- Clerk role must be set manually (
admin) - Backend must be running for full functionality
Built as a portfolio project with focus on real-world architecture, scalability, and clean system design.
This project is inspired by real-world ticket booking platforms and built independently with additional features like:
- Event-driven workflows
- Payment integration
- Auto cleanup systems
The goal was to move beyond basic CRUD apps and build something closer to production-level systems.