1. สถานการณ์ลูกค้า
บริษัททัวร์ขนาดกลางในจังหวัดกระบี่ รับลูกค้า 50-80 คนต่อวัน ให้บริการทัวร์ snorkeling, sunset cruise และ island hopping (4 islands, Hong islands, Phi Phi) ทีมประกอบด้วย owner 1 คน, admin 3 คน, ไกด์และกัปตันเรือพาร์ทเนอร์อีกประมาณ 15 คน
ปัญหาที่เจอตอนเข้ามา discovery:
- LINE booking ล้น: รับ inquiry และ booking ผ่าน LINE OA 100+ ข้อความต่อวัน admin 3 คนผลัดกันตอบจนตอบไม่ทันช่วง 9.00-11.00 น.
- Excel scheduling: ตารางเรือทำใน Google Sheets แชร์ระหว่างทีม ไม่มี locking mechanism — เจอ double-book ประมาณ 2-3 ครั้งต่อสัปดาห์ในช่วง high season
- No real-time inventory: ทัวร์ snorkeling กับ island hopping ใช้เรือลำเดียวกันบางวัน แต่ Excel ไม่ผูกความสัมพันธ์ admin ต้องจำเอง
- Bank transfer + สลิป: ลูกค้าโอนเข้า SCB แล้วส่งสลิปทางไลน์ admin ต้องเปิดแอปธนาคารตรวจทีละรายการ 5-10 นาทีต่อสลิป
- Cancellation chaos: ยกเลิก/เลื่อนวันจดในสมุดโน้ต ไม่ได้ sync เข้า Excel หลายครั้งโดน complain
- Tax/รายงานยุ่ง: รวบรวมยอดส่งบัญชีปลายเดือนใช้เวลา 2 วันเต็ม
ลูกค้าเคยลอง solution สำเร็จรูป 2 ตัว:
- TourCMS: UX เป็น admin-heavy แบบฝรั่ง ทีมไทยใช้ไม่คล่อง และไม่รองรับ PromptPay
- Bokun: ราคา ~800 USD/เดือน + commission ต่อ booking เกินงบ และยังต้องทำ workaround สำหรับ multi-tour inventory
เป้าหมายชัดเจน: ลด admin time จาก 6 ชั่วโมง/วัน → 1.5 ชั่วโมง และ lockdown over-booking ให้เหลือ 0
2. ทำไม solution ทั่วไปไม่ work
- PromptPay เป็น dealbreaker: Off-the-shelf SaaS อย่าง TourCMS, Rezdy รองรับแค่บัตรเครดิตและ Stripe ลูกค้าไทย 80% โอนผ่าน PromptPay/บัญชีธนาคาร ระบบต้อง generate QR แบบ dynamic per booking และ verify สลิปอัตโนมัติ
- Multi-tour inventory ซ้อนซ้อน: ทัวร์หลายตัว share resource (เรือลำเดียว, ไกด์คนเดียวกัน, ที่นั่งบนเรือใหญ่) — generic system ที่มอง tour เป็น standalone product จำลองไม่ได้ ต้องการ schema ที่แยก “resource” กับ “tour product” ออกจากกัน
- UI ภาษาไทยที่ admin เข้าใจ: ทีม admin อายุ 35-50 ใช้ LINE เป็นหลัก ไม่เคยใช้ CRM/SaaS dashboard ภาษาอังกฤษ — ต้องการ UI ที่ “เหมือน LINE” คือ thread-based, ภาษาไทยทุกจุด ไม่มี jargon
3. แนวทางของเรา
Tech stack ที่เลือก:
- Next.js 14 (App Router) — admin dashboard + customer booking page รวมใน codebase เดียว
- tRPC + Prisma + PostgreSQL — type-safe end-to-end, schema migration ง่าย
- Cloudflare Workers — edge functions สำหรับ webhook LINE + slip verification queue
- PromptPay QR library (
promptpay-qr) — generate dynamic QR ต่อ booking - Google Cloud Vision API — OCR สลิปธนาคารไทย
- LINE Messaging API + Webhook — chatbot และ confirmation push
ROI ที่นำเสนอเจ้าของ:
| ตัวเลือก | ปีแรก | ปีที่ 2 | ปีที่ 3 |
|---|---|---|---|
| SaaS (Bokun ~$800/mo) | ~$9,600 | ~$9,600 | ~$9,600 |
| Custom (one-time ~$9,500 + hosting $200/mo) | ~$11,900 | ~$2,400 | ~$2,400 |
Break-even ที่เดือนที่ 8 — หลังจากนั้น custom ถูกกว่า ~75% ต่อปีและเป็นทรัพย์สินของบริษัท
4 Pillars ของ solution:
- Real-time inventory engine — WebSocket broadcast เมื่อมี booking ใหม่ ทุก browser session เห็น seat count อัพเดททันที + DB-level locking ป้องกัน race condition
- PromptPay automation — generate QR per booking, slip verification ด้วย OCR (Google Vision อ่านเลขที่บัญชี + amount + timestamp)
- LINE webhook chatbot — ตอบ FAQ ที่ pattern ชัดเจน (ราคา, เวลาออกเรือ, จุดนัดพบ) ปล่อย booking complex ไปหา admin
- Mobile-first admin dashboard — admin ใช้มือถือ 70% ของเวลา UI design start จาก mobile breakpoint
Discovery process: ก่อนเริ่มเขียนโค้ด ทีมเราขอเข้า shadow-day 1 วันเต็ม (8.00-18.00) นั่งข้าง admin แต่ละคน จด pain point ทุกจุด ผลคือพบว่า admin ใช้เวลา 40% ไปกับการ “หา booking เก่า” — ทำให้เพิ่ม search-first design ใน dashboard
4. สัปดาห์ต่อสัปดาห์
Week 1-2: Discovery & Architecture
- Shadow-day 1 วันกับ admin team
- Stakeholder interview กับ owner + admin lead
- Database schema design — 15 tables (bookings, tours, resources, schedule_slots, customers, payments, slip_verifications, line_messages, ฯลฯ)
- User journey mapping 4 personas: walk-in customer, repeat customer, agency, owner
Week 3-5: Backend Core
- Next.js + tRPC scaffold + Prisma migrations
- Authentication (admin + agency tier)
- Booking domain logic + inventory lock
- Payment integration: SCB Easy Net API + PromptPay QR generator
- Unit test สำคัญ: race condition booking, inventory overflow
Week 6-8: Frontend & Realtime
- Admin dashboard UI (Thai-first, mobile breakpoint แรก)
- Customer-facing booking flow (3-step: เลือกทัวร์ → ใส่ข้อมูล → จ่ายเงิน)
- Real-time inventory via WebSocket (Cloudflare Durable Objects)
- Calendar view + drag-to-reschedule
Week 9-10: LINE & OCR
- LINE webhook setup + intent classification (rule-based + GPT fallback)
- FAQ chatbot สำหรับ 12 คำถามยอดฮิต
- Booking confirmation push message พร้อม QR code
- OCR slip verification pipeline + manual review queue
Week 11: Migration & UAT
- Excel import tool (รับ legacy booking 6 เดือนล่าสุด ~2,400 รายการ)
- UAT กับ admin 3 คน — เจอ critical bug 8 ตัว (3 high, 5 medium) แก้หมดใน 4 วัน
- Penetration test เบื้องต้น (SQL injection, auth bypass)
Week 12: Launch
- Soft launch: 50% traffic ผ่าน feature flag 3 วัน
- Training admin team 4 sessions (1 ชั่วโมงต่อ session) ภาษาไทยทั้งหมด
- Full launch + monitoring dashboard 24 ชั่วโมงแรก
- Knowledge transfer doc + runbook
5. ปัญหาที่เจอ
-
OCR accuracy แค่ 87%: สลิป SCB/Krungthai format มาตรฐานอ่านได้ดี แต่สลิป mobile banking screenshot (โดยเฉพาะ Kbank app เวอร์ชั่นเก่า) confidence ต่ำ — แก้ด้วยการเพิ่ม manual review queue สำหรับสลิปที่ confidence <90% admin ตรวจเอง 1-click confirm ใช้เวลาเฉลี่ย 15 วินาที/สลิป (ลดจาก 5-10 นาทีเดิม)
-
Scope creep มาตอนกลาง project: Week 7 owner ขอเพิ่ม agency tier pricing (commission แบ่งให้ travel agency ที่ส่งลูกค้ามา) — ไม่ได้อยู่ใน scope เดิม ทีมเราประเมินใช้เวลา +1 สัปดาห์ ทำ contract amendment ชัดเจน (+25,000 บาท, timeline เลื่อน 5 วัน) owner accept ก่อนเริ่มเขียน — สำคัญที่ไม่ทำฟรีเพราะจะเปิดประตูให้ scope creep ต่อไป
-
Admin team adoption ช้า: 2 สัปดาห์แรก admin 1 คนยังโทรหา hotline 3-4 ครั้ง/วัน — แก้ด้วย video tutorial ภาษาไทย 8 คลิป (คลิปละ 2-3 นาที) + hand-holding 1 เดือนเต็ม (response SLA 4 ชั่วโมง) สัปดาห์ที่ 4 ลดเหลือ 0-1 ครั้ง/สัปดาห์
6. ผลหลัง launch + ongoing
ผลในเดือนที่ 1:
- Admin time: 6 ชั่วโมง/วัน → 2 ชั่วโมง/วัน (-67%)
- Double-booking: 2-3 ครั้ง/สัปดาห์ → 0
- LINE response time: 4 ชั่วโมง → 8 นาที (chatbot handle 60% ของ queries ปล่อย admin โฟกัส booking)
- Slip verification: 5-10 นาที/สลิป → 15 วินาที/สลิป (OCR auto-confirm 87%)
- รายงานสิ้นเดือน: 2 วัน → 30 นาที (export จาก dashboard)
Lessons learned:
- Tour operator ไทยต้องการ tool ที่ “รู้สึกเหมือน LINE” — ตอนแรกเราออกแบบ UI สะอาดแบบ Notion admin บอกว่า “ดูเรียบไป ไม่รู้ว่าอันไหนสำคัญ” เราปรับเป็น card-heavy + emoji ที่คุ้นเคย adoption ดีขึ้นทันที
- Shadow-day คุ้มค่าที่สุด — 1 วันที่ลงไปนั่งกับ admin ให้ insight มากกว่า 5 รอบ meeting requirement gathering
- Manual review queue ไม่ใช่ failure — ผู้ใช้กลับชอบเพราะรู้สึก “ควบคุมได้” — สอนว่า automation 100% ไม่ใช่เป้าหมายเสมอ
Ongoing engagement: เราดูแลต่อแบบ retainer 8 ชั่วโมง/เดือน ครอบคลุม bug fix, small features (ไตรมาสที่ผ่านมาเพิ่ม voucher system + multilingual booking page EN/CN), security patch และ monitoring เดือนที่ 6 หลัง launch เริ่ม discussion เฟส 2 — เพิ่ม supplier portal สำหรับกัปตันเรือ check-in ลูกค้าผ่านมือถือ