Video in the works
Wild East Journeys
Picking a trek date on the calendar and booking it, then the admin side.

About the project
Adventure Frontiers runs treks, wildlife trips and volunteering in Jharkhand. Customers book online; the team manages dates, seats and payments in an admin panel.
Adventure Frontiers runs treks, wildlife trips, student programmes and volunteering in Jharkhand. Its site lets customers pick a trip and a date, see how many seats are left, and book and pay online.
Behind it is an admin panel where the team manages trip dates and seats, bookings and payment status, student programmes, and custom requests from groups and companies.
I led a small team on it. I built the booking system, the calendar and the pricing, and reviewed and merged the team's work. Anurag built the payments, GST and invoices, and Rohit Raj moved it to Next.js and built the admin and login.
How it works
Pick a trip
Browse the adventures, or open the calendar, where each date is coloured by how many seats are left.
Book
Choose a date and the travellers; saved travellers are remembered. Seats update in one database transaction, so two people can't take the last seat.
See one price
A single pricing module adds basic insurance and GST and rounds it the same way everywhere.
Pay
PhonePe checkout. The payment callback confirms the booking, and an invoice and email go out.
Run it
Admins see every booking, change its booking and payment status, and handle student programmes and custom requests in their own tabs.
Under the hood
- Site
- Next.js 15 App Router, with optimised images and sections that load later.
- Bookings
- Trip dates with seat counts, database transactions, and three types of booking.
- Pricing
- One shared module used by the listings, checkout, payment callback, invoices and emails.
- Admin
- Events, bookings, student programmes and custom requests, with image uploads to Cloudinary.
What I did
- Redesigned the first version of the site: about, adventure activities, blog pages, gallery, header and hero
- Trip dates with seats: each date has total and booked seats, and a booking updates them in one database transaction. Plus admin event management, image uploads, saved travellers and a profile page
- Three ways to book, each with its own admin tab: a normal trip, a student programme, or a custom request from a group or company
- An adventure calendar: a month view coloured by seats left, details on hover, cached and loaded early
- A booking details screen where admins change booking and payment status
- One pricing module: trip, basic insurance and GST, rounded the same way in the listings, checkout, payment callback, invoices and emails
- Made the home page faster: optimised images, lazy loading, lower sections loaded later, and loading skeletons
- Finished the move to Next.js's App Router and fixed the database client on Vercel, then matched the database schema to production without losing data
- Reviewed and merged 40 pull requests from Rohit Raj and Anurag
What was new
- Seat counts that stay correct when two people book at once
- One price everywhere, including the payment callback and invoices
- Leading a small team through reviews instead of writing everything myself
Problems I hit, and how I fixed them
Changing a booking status in admin gave a 500 error: the page sent "cancelled" and the database expected CANCELLED.
Fix The API converts status values before saving.
Saved travellers failed with "JWT malformed", because the page sent a placeholder token.
Fix Read the login cookie first and ignore the placeholder.
Vercel builds failed because the database client wasn't generated.
Fix Generate it in the build and install steps.
Price maths was copied into the booking route, the payment callback and the invoices, and they treated GST differently.
Fix One shared pricing module.
Booking confirmations showed "Invalid Date".
Fix Fallback date fields, and "Date to be confirmed" when there is none.
Screenshots
To be clear
The PhonePe payments, GST and invoices were built by Anurag, and the Hindi version and first site by Rohit Singh. It started from a Lovable template.
