The problem
- Double-bookings: Two customers booked the same court at the same time, neither knew until they showed up
- No-shows: No reminders meant customers sometimes forgot, leaving courts empty and revenue lost
- Manual payment tracking: Bank transfers had to be verified one by one, and it was easy to lose track
- No visibility: No way to see occupancy trends, peak hours, or daily revenue without manual counting
What was built
- Browse courts and check live availability on a calendar
- Book a slot, pay online, and receive an automatic booking confirmation
- Get an automatic reminder before the session
- Full booking calendar with real-time updates
- Override, reschedule, or cancel any booking with notes
- Revenue dashboard showing daily, weekly, and monthly totals
- Customer history and booking records
Features that solved the real pain
- Real-time availability — the calendar updates instantly so there is no way for two customers to book the same slot
- Online payments — customers pay at booking; no more manual transfer verification or chasing payments
- Automated reminders — sent before each session without any action needed from the owner; no-shows dropped significantly after launch
- Admin dashboard — everything visible in one place: upcoming bookings, revenue, and customer history, accessible from any device
Technologies
- Next.js — frontend and API routes
- PostgreSQL — booking data, customer records, payment history
- Stripe — payment processing
- Resend — automated email notifications and reminders
- Ubuntu + Nginx — self-hosted on VPS for full control and no vendor lock-in
Outcome
Interested in a similar system for your badminton court? Book a call or try it free for a month.
