The situation
Tour Treck runs a resort and adventure packages out of Shivpuri, near Rishikesh. When we started working with them, bookings came in through Instagram DMs and phone calls. Prices were quoted manually, and if someone wanted add-ons like rafting or a scooty rental, it took several messages back and forth to confirm the total.
They wanted customers to see a price and book directly, but without losing the WhatsApp relationship their audience prefers. Two other operators nearby had the same problem. Instead of building three separate sites, we built one platform and let each operator run it under their own brand.

Tour Treck's homepage. YatraStart and Tour Musafir run the same platform with different branding and content.
What we built
Packages and destination search
Operators manage their own packages, destinations and pricing through the admin. Customers can browse by destination or filter by duration and budget. Group departures with fixed dates sit next to custom itineraries.
Booking flow with live pricing
Pick dates, guests and add-ons, and the total updates instantly. Scooty rental is per day and recalculates when checkout changes. Rafting and bungee are per person. Customers can pay in full or put down 20%, and the balance is tracked in the admin.
WhatsApp built in
Every booking sends a WhatsApp confirmation to the customer and a full itinerary alert to the operator. The enquiry buttons open a pre-filled WhatsApp message instead of a form, because that's how people in this market actually talk to businesses.
One codebase, three brands
Theme, content, payment account, phone numbers and policies are all configured per operator. A bug fix for one goes live for all three the same day. Adding a fourth operator is just configuration.
The hard part
Getting add-on pricing to agree with itself
Some add-ons are priced per person, some per day, some are flat fees, and some only apply to certain packages. Version one calculated this in the browser. The operator kept finding that what the customer saw didn't match what got charged.
We moved all pricing to a single server-side rule engine. The booking page, confirmation email and admin all read from the same source. We wrote tests for each add-on type against real packages (per_person, per_day, flat, package_scoped). The browser now only shows a quote; it never calculates one. The mismatch hasn't come back.
That fix took a week we hadn't planned for. But it also meant the operator stopped manually checking every booking, which was the whole point.
