Northern Lake George Boat Tours
A booking platform built from scratch for a family-run scenic boat tour in Hague, NY. Six weeks from kickoff to taking real bookings, on a stack chosen so the site costs about as much to run as the domain it lives on.

- Built in
- 6 weeks
- Stack
- Next.js · Supabase · Stripe
- Running cost
- Under $100 / yr
The brief
My mom runs scenic boat tours on the northern end of Lake George, NY. For the launch of the business she needed a real website that could take bookings online, handle payment, send confirmations, and let her manage all of it from a phone between tours.
Every other charter operator on the lake was using the same few template sites, or a bare booking widget bolted onto a page nobody had touched in years. We wanted hers to look like the business itself: her boat, her lake, her schedule.
The standard booking option for tour operators is FareHarbor. It is free to the operator, but it adds a visible 6% fee at checkout on top of the tour price. Building the checkout ourselves means customers stop seeing that fee. We still pay Stripe's standard processing rate either way, so the real win isn't a clean percentage saved: it's a flat, predictable running cost instead of a fee that scales with revenue forever.
What I built
- Public booking flow
Five steps, from tour to date to time to guest details to review, running on a typed reducer so the state stays predictable. Availability is checked live against the boat schedule with a 30-minute buffer between tours.
- Stripe Checkout
Hosted Stripe Checkout with a 30-minute session expiry. The webhook handler updates payment status idempotently and releases expired slots on its own.
- Admin dashboard
Server-rendered pages for bookings, availability blocks, tour settings, and captain assignments. Built for a phone first, because that is where she actually uses it.
- Self-service customer portal
Every booking gets a UUID management token, so customers can reschedule or cancel up to 48 hours before their tour without calling anyone. Cancellations refund through Stripe automatically.
- Transactional email
Confirmations, admin notifications, cancellations, reschedules, and tour reminders through Resend, on plain HTML templates rather than a framework that would need maintaining.
- SEO and open graph
Generated sitemap, robots.txt, an open graph image, and structured metadata aimed at the searches people make when booking a tour.
The outcome
The site is live and taking bookings. It runs on the free tiers of Vercel, Supabase, and Resend, so the annual cost is roughly the domain registration: under $100. Even if the business outgrows those tiers, the paid plans total about $45 a month, and that number stays flat. FareHarbor would have added about $15 to every booking at checkout, so at roughly 35 bookings a season the platform fee alone passes a full year of paid infrastructure.
She owns the code, the customer data, and the brand outright. If she adds a second boat or hires captains, the schema was designed for it already, and no platform gets to change the terms on her later.
Do you take bookings?
Reservations, appointments, tours, classes, anything on a schedule. I can build you the same thing, tuned to how your business runs.