Booking for 600+ screens,where money and seats agree.
The checkout and ticketing for PVR Cinemas, India's largest cinema chain. Built at Appinventiv, launching 2026.
600+screens on the platform at launch
The problem
When thousands of people book at the same moment, the worst thing that can happen is a customer paying for a seat that someone else got. It costs a refund, a support call, and usually the customer. The platform had to make that impossible, not just unlikely.
The engineering version
What was hard, and what I did about it
Paid, but no seat
The money is taken. Then the booking step times out, or the seat was taken a second earlier. Without care, the customer is charged for nothing.
What I did. Made sure the same request can be retried safely, and put an automatic refund on the failure path. One payment always ends in exactly one seat or one refund.
Implementation notes
Wallet, refunds, partial payments
Customers pay partly from a wallet, partly by card. A refund has to go back to the right place in the right amount.
What I did. Built a wallet layer that checks the balance before checkout and splits refunds across wallet and card, so ticket state and money state never drift apart.
Implementation notes
A seat map that stays fast
Hundreds of seats, live availability, a countdown, and it has to feel instant on a mid-range phone.
What I did. Organized the seat data so that when one seat changes, only that seat redraws, not the whole map.
Implementation notes
Ask me about
- How the reconcile step decides between issuing a ticket and issuing a refund
- What a Razorpay integration honestly costs in time, and where the time goes
- What the PCI DSS scope looked like on the frontend, and what it did not cover
- What I would change about the module boundaries today
Built with Next.js, React, TypeScript, Redux Toolkit, Razorpay, Tailwind CSS.