1. The situation
An island tour operator in Trang province had been in business 9 years with a fleet of speedboats + larger vessels, combined capacity of around 240 seats/day, running 4-islands tour routes, private charters, and Hin Daeng/Hin Muang dive trips (world-class dive sites 2 hours offshore by boat). Day-tour packages priced THB 1,200-2,800/person, dive trips THB 3,800-6,500/person. The owner — a Trang native married to a German dive master — described the pain at discovery: 72% of revenue came from OTAs (Klook 38%, GetYourGuide 22%, Viator 12%) deducting 22-28% commission per booking.
The customer mix was striking — Malaysian 28%, Singaporean 18%, Chinese 16%, Thai 22%, Australian/European 16%. MY/SG/CN customers searched in their own language (Google MY/SG, Baidu, Xiaohongshu) but the existing Wix site supported English only + 5.8s LCP on mobile → conversion rate was very low (<0.8%). Customers ended up booking through Klook’s Mandarin interface instead.
What stung more: Hin Daeng/Hin Muang — ranked “world top 10” (by PADI + Scuba Diving Magazine) — was the operator’s highest-margin product (45% margin vs day-tour 18-22%) but the legacy site had no dive booking flow at all. Customers had to email + manually upload PADI cert → 2-3 days to confirm. They cancelled and booked through competitors offering instant booking.
The goal set at kickoff: direct booking +350% within 6 months + reduce OTA dependency from 72% to no more than 45% + integrate a dive booking flow that verifies PADI cert instantly.
2. Why off-the-shelf solutions didn’t work
Wix supports multilingual through the Wix Multilingual app, which the client tried in 2024 and hit 3 problems — translated URLs not optimised for Google country-specific search (Singapore, Malaysia, China), checkout flow breaking when switching language mid-session, and a USD ~500/year license + Wix Business VIP plan combined totalling THB 18,000/year for no performance improvement.
We evaluated FareHarbor + Rezdy + Bokun. All these SaaS handle tour booking well, but none of them supported 3 of the client’s core business logic requirements.
Requirement 1 — Dive cert verification: Customers booking Hin Daeng dives need PADI Advanced Open Water + 25 logged dives minimum. Generic SaaS has no cert verification flow checking PADI Pro Chek or SSI databases.
Requirement 2 — Multi-boat shuffle: When boat A (small, 15/30 seats) had partial booking, the system needed to suggest auto-merging with boat B on the same route to optimise fuel cost. Generic SaaS forces 1 trip = 1 boat — no flexibility.
Requirement 3 — Multi-currency real-time: MY/SG/CN customers want to see prices in their own currency (MYR, SGD, CNY) + lock the rate at checkout. Most SaaS pull rates from fixer.io updated hourly, meaning the rate doesn’t match the bank rate the customer sees in their online banking → trust issue.
More critical: Hin Daeng dive operators nearby had Mandarin website + instant dive booking 3 years already, capturing Chinese market share rapidly. Wait 2 more years and our client would miss the boat.
3. Our approach
After 2 discovery calls + a 1-day onsite visit to ride the trip and talk with boat captains, we planned 4 pillars.
1) Astro migration + Performance baseline. Chose Astro over Wix for LCP <1.5s + native i18n routing (TH/EN/ZH/MS) which Wix struggles with + zero plugin attack surface (Wix had a breach in 2024). Deployed on Cloudflare Pages + R2 for 280+ underwater photos from the German dive master.
2) Custom booking engine + dive cert verification. Built a booking platform on Supabase supporting day-tours + dive trips + private charters in a single system. PADI cert verification via PADI Pro Chek API + SSI Diver Verification + manual upload for other cert agencies (NAUI, BSAC, CMAS). Customers can book dive trips instantly if cert verifies.
3) Multilingual SEO + Mandarin presence. Wrote a 22-article content hub in TH/EN/ZH/MS (extra 8 ZH + 4 MS) covering Emerald Cave guide, island beach guide, dugong watching in Trang, Hin Daeng dive site profile, southern Thai food in Trang. For Mandarin SEO we registered a Xiaohongshu (Little Red Book) account + WeChat official for PRC customers.
4) Day-tour + dive package bundle. Designed a booking flow letting customers select day-tour + Hin Daeng dive add-on (the following day) + accommodation package in one transaction → increased average order value + reduced checkout friction.
4. Week-by-week
Week 1-2: Discovery + Architecture. Interviewed the team including owner + dive master + boat captains + admin, rode the 4-island trip 1 day + Hin Daeng dive trip 1 day to understand operational reality, designed Supabase schema 24 tables covering boat, trip, dive cert, customer, payment, refund, audit log.
Week 3-5: Backend + Booking Engine. Booking API with 5-minute seat lock, real-time fleet sync via Supabase Realtime, payment processors Stripe (multi-currency MYR/SGD/CNY/USD/EUR/THB) + PromptPay QR + bank transfer, dive cert verification integration with PADI Pro Chek + SSI API, multi-boat shuffle logic suggesting merge when boats had partial seats.
Week 6-7: Customer Frontend + Multilingual. Migrated Wix → Astro 22 pages, built mobile-first booking UI (75% of traffic was mobile), implemented i18n routing 4 languages with lazy-loaded locale bundles (initial bundle 42KB), checkout flow supporting multi-currency rate lock at checkout.
Week 8-9: Content + SEO + GBP. Wrote 22 articles TH/EN/ZH/MS (native writers in all 4 languages), implemented Schema markup Trip + TouristAttraction + DiveSpot + FAQPage, optimised Google Business Profiles in 4 languages + submitted to 30 directories (TripAdvisor, Klook, Padi Travel, Scuba Diving Magazine, etc).
Week 10: QA + Launch. End-to-end testing of booking flow across all payments + languages, dive cert verification test with PADI + SSI test accounts, WCAG AA accessibility audit, soft launch over 5 days with gradual rollout.
After launch the 6-month retainer began: 3 articles/month + weekly Xiaohongshu posts + monthly performance review.
5. Obstacles + Pivots
Obstacle 1: PADI Pro Chek API rate limit. PADI’s API caps at 1,000 requests/day on free tier + USD 500/month for the tier supporting 10,000 requests. Fixed by caching verified cert results in Supabase for 90 days + re-checking only when cert expiry approaches → free tier was sufficient.
Obstacle 2: Mandarin content slow to rank on Baidu. First month post-launch Mandarin traffic was lower than expected because Baidu’s crawler IP-blocks TH hosting. Fixed by submitting sitemap directly via Baidu Webmaster + adding Xiaohongshu content + recruiting Hong Kong/Singapore KOLs (2 found through the dive community network) to write trip reviews → 5 weeks later Mandarin traffic increased 4x.
Obstacle 3: Month 2 post-launch dive bookings dropped 18%. Coincided with PADI’s new policy that some countries (Singapore) require dive insurance covering Southeast Asia before diving. Fixed by adding a dive insurance partner (DAN Asia-Pacific) to the checkout flow as an optional add-on (THB 450/day). 3 weeks later dive booking recovered and exceeded prior levels + margin grew from insurance commission.
6. Post-launch + Ongoing
Within 4 months post-launch organic traffic grew from 180 to 3,960 sessions/month (+2,100%), direct booking +380%, OTA dependency from 72% to 42%. Dive package attach rate (customers booking day-tour + Hin Daeng dive add-on in one transaction) was 28% — a new revenue channel that didn’t exist pre-launch.
Lessons learned. Dive booking requires technical depth that general tour booking can’t deliver — cert verification + insurance integration + dive site condition feed (weather + tide + visibility) is the moat that pulls dive customers. MY/SG/CN customers responded extremely well to multi-currency + native-language content — ROI on the 4-language stack was higher than expected.
The client is currently in month 6 of retainer and starting phase 2 — adding a 3-day Hin Daeng liveaboard + opening a dive certification course (Open Water in Trang) bookable through the same website. See the Krabi tour booking system case study for a similar pattern, or software development services for other custom builds.