1. สถานการณ์ลูกค้า
ลูกค้าเป็นผู้ให้บริการทัวร์เกาะในจังหวัดกระบี่ ดำเนินกิจการมา 12 ปี มีเรือสปีดโบ๊ทและเรือหางยาวในเครือข่าย แต่ละลำจุได้ 30 ที่นั่ง วิ่ง 2 trips/day ครอบคลุมเส้นทาง Phi Phi, Hong Islands, James Bond, 4 Islands และ private charter
ก่อนเริ่มโปรเจกต์ ระบบจองยังเป็น manual ผสมกับ digital แบบลูกผีลูกคน — paper booking ตอนวอล์คอินที่หน้าร้าน, WhatsApp สำหรับลูกค้าต่างชาติ, Line สำหรับคนไทย, และเว็บไซต์เก่าที่เป็น WordPress + WooCommerce ปัญหาใหญ่คือ checkout dropoff rate ของ direct booking สูงถึง 78% เพราะ payment option เดียวคือ bank transfer ที่ลูกค้าต่างชาติแทบไม่มีใครยอมใช้
โครงสร้างลูกค้า: คนจีน 45%, ยุโรปตะวันออก (รัสเซียเป็นหลัก) 25%, ไทย 15%, อื่นๆ 15% — เว็บเดิมรองรับเพียงภาษาอังกฤษ และคำแปลที่ทำเองด้วย Google Translate ทำให้ผู้ใช้ตีความผิดเรื่องสิ่งที่รวมอยู่ในแพ็คเกจบ่อยครั้ง
ตอนนี้ revenue 70% มาจาก OTA platforms (Klook, GetYourGuide, Viator) ซึ่งหักค่าคอม 18-25% ทำให้ margin บางลงเรื่อยๆ เป้าหมายของโปรเจกต์คือ เพิ่ม direct booking 400%+ ภายใน 6 เดือน และลดสัดส่วน OTA dependency ลงให้เหลือไม่เกิน 40% ของ revenue
2. ทำไม solution ทั่วไปไม่ work
เราเริ่มจากประเมิน off-the-shelf solutions ก่อน เพราะลูกค้าไม่อยากลงทุน custom development ถ้าซื้อ SaaS ได้
WooCommerce + multilingual plugins (WPML, Polylang) — ใช้งานจริงแล้ว plugin ตี route ภาษาผิดพลาดบ่อย และ checkout flow แตกเมื่อ currency switch ระหว่าง session แม้แต่ enterprise plan ก็ไม่ได้แก้ปัญหา core architecture ที่ WooCommerce ออกแบบมาสำหรับ retail ไม่ใช่ booking
FareHarbor, Rezdy, Bokun — รองรับ tour booking ดี multi-currency ก็โอเค แต่ไม่มีตัวไหนรองรับ PromptPay QR ซึ่งเป็นช่องทางหลักของลูกค้าไทย → ลูกค้าไทยต้องโอนเงินแล้วส่งสลิป ไม่ instant
Multi-boat scheduling SaaS — ไม่มีระบบใดรองรับ business logic ของ “boat shuffle” ที่ลูกค้าต้องใช้บ่อย คือเมื่อเรือ B มีปัญหา ต้องย้ายลูกค้าไปเรือ A โดยอัตโนมัติ พร้อมส่ง notification แจ้งกัปตันและลูกค้าทุกราย
จึงสรุปว่าต้อง custom build
3. แนวทางของเรา
Tech stack: Next.js 14 (App Router) + Stripe + PromptPay QR generator (custom) + next-intl (i18n) + Prisma + PostgreSQL + Vercel Edge สำหรับ caching tour catalog ระดับ regional
Multi-currency: ใช้ Stripe handle THB/USD/EUR/CNY/RUB native โดย locked exchange rate ตอน checkout เริ่ม (กัน rate fluctuation ระหว่างที่ลูกค้าเลือก add-ons)
Custom vs SaaS — เหตุผลที่ลูกค้าเลือก custom:
| รายการ | SaaS (Bokun) | Custom |
|---|---|---|
| ปีแรก | $24,000 | $14,000 one-time |
| 5-year TCO | $120,000 | ~$20,000 |
| PromptPay | ไม่มี | มี |
| Boat shuffle logic | ไม่มี | มี |
| OTA webhook customization | ไม่ได้ | ได้ |
5-year TCO ของ custom ต่ำกว่า SaaS ถึง 60%+ (custom = $14K one-time + $1.2K/year hosting × 5 = ~$20K)
4 Pillars ของ architecture:
- i18n done right — 4 ภาษา (TH/EN/CN/RU) lazy-loaded ตาม route และ user locale, copy ทุกบรรทัดผ่าน native translator (ไม่ใช่ Google Translate)
- Real-time fleet sync — Postgres triggers + websocket subscription ทำให้ availability update ใน <500ms ทุก client
- Multi-payment — Stripe (international cards + Apple/Google Pay), PromptPay QR (instant THB), bank transfer (fallback)
- Boat captain mobile PWA — offline-first สำหรับใช้บนเรือที่ไม่มีสัญญาณ, sync เมื่อกลับเข้าฝั่ง
4. สัปดาห์ต่อสัปดาห์
Week 1-2: Discovery
- สัมภาษณ์ owner, GM, boat captains 2 คน, admin 1 คน เพื่อ map workflow จริง
- Database schema design 22 tables ครอบคลุม boat schedule, captain shift, tour package, customer, payment, refund, OTA sync log
Week 3-5: Backend API
- Booking flow API พร้อม seat-lock mechanism (5 นาที hold ระหว่าง checkout)
- Fleet availability engine: ดู conflicts real-time ข้ามเรือทั้งเครือข่าย, รองรับ boat shuffle
- Payment processors: Stripe integration + custom PromptPay QR generator + bank transfer reconciliation worker
Week 6-8: Customer Frontend
- Mobile-first booking UI (70% traffic มาจากมือถือ)
- 4 langs lazy-loaded — initial bundle ภาษาเดียว = 38KB
- Checkout flow: select tour → date → pax → add-ons → payment → confirmation
- Currency converter widget แสดง real-time แต่ lock rate ตอน checkout
Week 9-10: Admin Console
- Reservations console UI ภาษาไทย (admin ไทยทั้งหมด)
- Refund flow รองรับ partial refund, weather cancellation
- OTA partner webhooks: Klook, GetYourGuide, Viator — inventory sync 2-way
Week 11-12: Captain Mobile PWA
- Offline-first ด้วย Service Worker + IndexedDB queue
- QR scan check-in (ลูกค้าโชว์ booking QR ที่ท่าเรือ)
- Weather-based cancellation flow: กัปตันแจ้ง cancel → admin approve → ระบบ refund อัตโนมัติ + แจ้งลูกค้า 4 ภาษา
Week 13: Polish
- Native CN + RU translator review copy ทุกบรรทัด
- Accessibility audit (WCAG AA)
- Security review (OWASP Top 10 + PCI scope review)
Week 14: Soft Launch
- Gradual rollout: 10% → 50% → 100% over 5 days
- Training sessions: 2 ครั้งสำหรับ admin, 1 ครั้งสำหรับกัปตัน
- Post-launch monitoring 2 สัปดาห์เต็ม
5. ปัญหาที่เจอ
Stripe ใน Thailand: ตอน plan ครั้งแรก Stripe ยังไม่ available ให้กับ TH-registered entities โดยตรง → ลูกค้าเลือกใช้ Stripe Atlas เปิดบริษัทใน Delaware เพื่อรับ international payments + ใช้ PromptPay สำหรับ THB payments → tax setup ซับซ้อนกว่าคาด ต้องประสานทั้ง Thai accountant + US CPA สำหรับ form 5472, ติดเวลา compliance review เพิ่ม 2 สัปดาห์
Russian translation glossary: ลูกค้ารัสเซียคุ้นกับศัพท์ marine specific เช่น “Skiff” (เรือเล็ก), “Catamaran” — Google Translate แปลผิดเป็นคำที่ไม่มีใครใช้ในวงการ → แก้ด้วยการสร้าง glossary 80+ คำศัพท์ ให้ native translator review ก่อนแปลทั้งหมด
Captain app ค้างบนเรือ: สัปดาห์แรกของ soft launch มี report ว่า captain app ค้างเมื่ออยู่กลางทะเลไม่มีสัญญาณ → แก้ด้วย service worker + offline-first sync queue ที่ทำงานเมื่อ network กลับมา, รวมถึง pre-cache ข้อมูล booking ของวันนั้นทั้งหมดเมื่อเรือออกจากท่า
6. ผลหลัง launch + ongoing
เดือนที่ 3:
- Direct booking +420% เทียบ baseline
- OTA dependency ลดจาก 70% เหลือ 35% ของ revenue
- Average order value +25% เพราะ multi-pax booking ง่ายขึ้น และ add-ons (lunch upgrade, photographer) ทำให้คนซื้อเพิ่ม
เดือนที่ 6:
- Return customer rate 18% (ก่อนหน้านี้ 4%) — ผลจาก email retargeting จาก booking data ที่เก็บเป็น first-party
- ขยายไปเปิด private charter booking flow (ลูกค้า request หลัง launch)
Lessons learned:
- i18n ต้องลงทุน native translator ไม่มีทางลัด — Google Translate ทำให้สูญเสีย credibility 100% โดยเฉพาะกับลูกค้าจีนและรัสเซียที่จ่ายแพง
- Boat shuffle logic เป็นสิ่งที่ SaaS ไม่มีทาง cover ได้ — operational reality ของ tour operator ไทยซับซ้อนกว่ามาตรฐาน Western tour ops
Ongoing:
- ดูแลระบบ + feature releases ทุกไตรมาส ภายใต้ quarterly retainer
- Roadmap: AI-driven dynamic pricing, group booking widget สำหรับ corporate clients, multi-property expansion (ลูกค้ามีแผนเปิด resort)