VIP Taxi Vallarta
We built viptransportation.mx end to end: the luxury private-transport booking site for Puerto Vallarta now running in production with live PayPal. We took a business run over WhatsApp and turned it into a bilingual 6-step flow on Next.js, PayloadCMS, and MongoDB, where the customer quotes and pays with certainty and the operator controls everything from a single admin. The heart of it is what you don't see: a pricing engine that resolves route, vehicle, round-trip, night surcharge, out-of-town tolls, promos, and CFDI-conditional IVA in USD and MXN at once, and a draft-before-charge payment pattern backed by automatic reconciliation that guarantees no PayPal charge is ever left without a booking. The proof is in the scale: 11 domain collections, 20 endpoints, 3 coexisting payment methods, and zero-downtime deploys that ship every change to production in seconds.
Category
Transportation
Stack
Next.js, TypeScript, MongoDB
The problem
Private airport transport in Vallarta was sold over WhatsApp and phone calls: improvised pricing, no formal confirmation, and payments the operator had to chase by hand. The international traveler never knew the final amount or the currency, and the operator never knew if a charge had actually landed. The real pain wasn't moving people from airport to hotel; it was the gap between the quote and the confirmed payment, where bookings and money quietly leaked.
What we built
- —Bilingual (es/en) 6-step booking flow for two products: airport transfer and hourly private driver, with a progress indicator and step-by-step validation.
- —Dynamic pricing engine combining route or zone, vehicle, round-trip (5% discount), night surcharge (+20% 11pm-5am), toll-road charge for out-of-town routes, add-ons, promo codes, and 16% IVA only when a CFDI is requested; computes USD and MXN at once.
- —Live PayPal Orders v2 integration with a draft-before-charge pattern: the booking is persisted as a draft BEFORE PayPal opens, so no charge ever exists without a record to bind it to.
- —Three coexisting payment methods: PayPal, bank transfer (SPEI) with receipt upload, and pay-on-arrival — with business rules that force 100% upfront on out-of-town routes.
- —Automatic reconciliation via cron that reviews pending PayPal payments and decides to finalize, cancel, or wait, closing the gap when a webhook fails.
- —Payload CMS with 11 collections (Fleet, Routes, Zones, Add-ons, Bookings, Destinations, Testimonials, FAQs, Pages, Media, Users) — the operator edits pricing and catalog from /admin with no redeploy.
- —Interactive map destination picker (MapTiler) that stores the chosen pin's lat/lng coordinates on the booking.
- —First-party transactional email over SMTP (customer confirmation, operator notification, transfer receipt) rendered with React Email, plus booking PDF generation.
- —Multilingual site with dedicated pages (airport transfers, private driver, fleet, contact, terms, privacy) served per locale via next-intl.
- —Zero-downtime deploy with a custom webhook: a push to main reaches production in seconds, with instant rollback.
Results
11 Payload domain collections (Fleet, Routes, Zones, Add-ons, Bookings, Destinations, Testimonials, FAQs, Pages, Media, Users)
20 API endpoints (booking, payments, reconciliation, PDF, receipt, pricing, contact)
6-step booking flow across 2 products
6 booking states (paypal_pending, pending, confirmed, paid, completed, cancelled)
2 full languages (es/en) with per-locale pages
Production deploy in seconds per push to main (zero-downtime)
Live in production at viptransportation.mx with PayPal LIVE