The challenge
An aging Vue 2 + Laravel 7 booking engine. Stripe payments worked but the booking flow leaked sessions on mobile, the staff dashboard required a VPN to access, and the resort was paying 15% OTA fees on customers who had typed `arenasdelmar.com` directly into their browser. Six months to peak season.Our solution
Rebuild the public booking flow on Livewire 4 for the speed (no SPA boot time), keep the Laravel core, replace the legacy admin with Filament, and route every public route through Cloudflare Workers so we could A/B test the new flow against the old without touching origin code. Cutover was a 12-line worker config change at 4am on a Tuesday.The results
Direct bookings up 52% year-over-year, six months post-migration. Cart abandonment dropped from 38% to 24% on mobile. The resort kept the OTA channels open but their share of bookings dropped from 71% to 49%. Zero downtime during cutover.The cutover
The hard part of a booking-engine migration isn’t the new engine — it’s the cutover. We staged the rebuild for 12 weeks, with the new engine answering 5% of traffic via a Cloudflare Worker route rule for the last 3 weeks before launch. By the time we flipped the rule to 100% at 4am on a Tuesday, we had:
- 3 weeks of real production traffic on the new engine
- 14,000+ successful test bookings (some real, some QA shadow)
- A rollback plan that was a 12-line worker config change
The “launch” was a non-event. The team watched dashboards for 2 hours, saw no anomalies, and went back to sleep.
What we’d warn the next client about
Don’t underestimate the email integration. Booking confirmation emails are the silent killer of these migrations — the resort had 22 different email templates across confirmation, modification, cancellation, and dietary-requests, all rendered from a legacy template engine no one understood. Porting those took longer than the booking flow itself. Budget 30% of the engagement for it.