1. Tình hình của khách hàng
Công ty tour cỡ trung tại tỉnh Krabi, đón 50-80 khách mỗi ngày, cung cấp dịch vụ tour snorkeling, sunset cruise và island hopping (4 islands, Hong islands, Phi Phi). Team gồm 1 owner, 3 admin, hướng dẫn viên và thuyền trưởng đối tác khoảng 15 người.
Các vấn đề phát hiện lúc discovery:
- LINE booking quá tải: Nhận inquiry và booking qua LINE OA 100+ tin/ngày, 3 admin luân phiên trả lời không kịp vào khung giờ 9:00-11:00.
- Excel scheduling: Lịch tàu làm trong Google Sheets chia sẻ giữa team, không có locking mechanism — gặp double-book khoảng 2-3 lần/tuần vào high season.
- Không có real-time inventory: Tour snorkeling và island hopping dùng cùng một tàu vào một số ngày, nhưng Excel không liên kết quan hệ, admin phải nhớ.
- Bank transfer + slip: Khách chuyển vào SCB rồi gửi slip qua LINE, admin phải mở app ngân hàng kiểm tra từng giao dịch 5-10 phút/slip.
- Cancellation chaos: Hủy/dời ngày ghi trong sổ note, không sync vào Excel, nhiều lần bị complain.
- Tax/báo cáo rối: Tổng hợp số gửi kế toán cuối tháng mất 2 ngày trọn vẹn.
Khách từng thử 2 solution có sẵn:
- TourCMS: UX kiểu admin-heavy của phương Tây, team Thái không quen dùng và không hỗ trợ PromptPay.
- Bokun: Giá ~800 USD/tháng + commission per booking vượt budget, vẫn phải workaround cho multi-tour inventory.
Mục tiêu rõ ràng: Giảm admin time từ 6 giờ/ngày → 1.5 giờ và lockdown over-booking về 0.
2. Tại sao solution thông thường không work
- PromptPay là dealbreaker: Off-the-shelf SaaS như TourCMS, Rezdy chỉ hỗ trợ thẻ credit và Stripe. Khách Thái 80% chuyển qua PromptPay/tài khoản ngân hàng. Hệ thống phải generate QR dynamic per booking và verify slip tự động.
- Multi-tour inventory chồng chéo: Nhiều tour share resource (cùng tàu, cùng guide, cùng chỗ ngồi trên tàu lớn) — generic system nhìn tour như standalone product không mô phỏng được. Cần schema tách “resource” và “tour product” ra riêng biệt.
- UI tiếng Thái mà admin hiểu: Team admin 35-50 tuổi dùng LINE là chính, chưa từng dùng CRM/SaaS dashboard tiếng Anh — cần UI “giống LINE” tức thread-based, tiếng Thái mọi chỗ, không có jargon.
3. Cách tiếp cận của chúng tôi
Tech stack được chọn:
- Next.js 14 (App Router) — admin dashboard + customer booking page chung trong cùng codebase
- tRPC + Prisma + PostgreSQL — type-safe end-to-end, schema migration dễ
- Cloudflare Workers — edge functions cho webhook LINE + slip verification queue
- PromptPay QR library (
promptpay-qr) — generate dynamic QR theo booking - Google Cloud Vision API — OCR slip ngân hàng Thái
- LINE Messaging API + Webhook — chatbot và confirmation push
ROI trình bày cho chủ:
| Lựa chọn | Năm 1 | Năm 2 | Năm 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 ở tháng thứ 8 — sau đó custom rẻ hơn ~75%/năm và là tài sản của công ty.
4 Pillars của solution:
- Real-time inventory engine — WebSocket broadcast khi có booking mới, mọi browser session thấy seat count update tức thì + DB-level locking ngăn race condition
- PromptPay automation — generate QR per booking, slip verification bằng OCR (Google Vision đọc số tài khoản + amount + timestamp)
- LINE webhook chatbot — trả lời FAQ có pattern rõ ràng (giá, giờ ra tàu, điểm hẹn), để booking phức tạp cho admin
- Mobile-first admin dashboard — admin dùng mobile 70% thời gian, UI design start từ mobile breakpoint
Discovery process: Trước khi bắt đầu code, team chúng tôi xin shadow-day 1 ngày trọn vẹn (8:00-18:00) ngồi cạnh từng admin, ghi pain point mọi điểm. Kết quả phát hiện admin mất 40% thời gian để “tìm booking cũ” — nên thêm search-first design vào dashboard.
4. Tuần qua tuần
Week 1-2: Discovery & Architecture
- Shadow-day 1 ngày với admin team
- Stakeholder interview với owner + admin lead
- Database schema design — 15 tables (bookings, tours, resources, schedule_slots, customers, payments, slip_verifications, line_messages, v.v.)
- 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 quan trọng: race condition booking, inventory overflow
Week 6-8: Frontend & Realtime
- Admin dashboard UI (Thai-first, mobile breakpoint trước)
- Customer-facing booking flow (3-step: chọn tour → nhập thông tin → thanh toán)
- 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 cho 12 câu hỏi phổ biến
- Booking confirmation push message kèm QR code
- OCR slip verification pipeline + manual review queue
Week 11: Migration & UAT
- Excel import tool (nhận legacy booking 6 tháng gần nhất ~2,400 record)
- UAT với 3 admin — tìm 8 critical bug (3 high, 5 medium) fix hết trong 4 ngày
- Penetration test cơ bản (SQL injection, auth bypass)
Week 12: Launch
- Soft launch: 50% traffic qua feature flag 3 ngày
- Training admin team 4 sessions (1 giờ/session) hoàn toàn tiếng Thái
- Full launch + monitoring dashboard 24 giờ đầu
- Knowledge transfer doc + runbook
5. Vấn đề gặp phải
-
OCR accuracy chỉ 87%: Slip SCB/Krungthai format chuẩn đọc tốt nhưng slip mobile banking screenshot (đặc biệt Kbank app phiên bản cũ) confidence thấp — khắc phục bằng manual review queue cho slip confidence <90%, admin kiểm 1-click confirm trung bình 15 giây/slip (giảm từ 5-10 phút cũ).
-
Scope creep xuất hiện giữa project: Week 7 owner xin thêm agency tier pricing (commission chia cho travel agency gửi khách đến) — không nằm trong scope ban đầu. Team chúng tôi estimate mất +1 tuần, làm contract amendment rõ ràng (+25,000 baht, timeline dời 5 ngày), owner accept trước khi bắt đầu code — quan trọng là không làm free vì sẽ mở cửa cho scope creep tiếp theo.
-
Admin team adoption chậm: 2 tuần đầu 1 admin vẫn gọi hotline 3-4 lần/ngày — khắc phục bằng video tutorial tiếng Thái 8 clip (mỗi clip 2-3 phút) + hand-holding 1 tháng trọn vẹn (response SLA 4 giờ). Tuần thứ 4 giảm còn 0-1 lần/tuần.
6. Kết quả sau launch + ongoing
Kết quả trong tháng 1:
- Admin time: 6 giờ/ngày → 2 giờ/ngày (-67%)
- Double-booking: 2-3 lần/tuần → 0
- LINE response time: 4 giờ → 8 phút (chatbot xử lý 60% queries, để admin focus booking)
- Slip verification: 5-10 phút/slip → 15 giây/slip (OCR auto-confirm 87%)
- Báo cáo cuối tháng: 2 ngày → 30 phút (export từ dashboard)
Bài học rút ra:
- Tour operator Thái cần tool “cảm giác giống LINE” — ban đầu chúng tôi thiết kế UI sạch sẽ kiểu Notion, admin nói “trông đơn giản quá, không biết cái nào quan trọng”. Chúng tôi điều chỉnh thành card-heavy + emoji quen thuộc, adoption tăng ngay lập tức.
- Shadow-day đáng giá nhất — 1 ngày xuống ngồi với admin cho insight nhiều hơn 5 buổi meeting requirement gathering.
- Manual review queue không phải failure — người dùng còn thích vì cảm thấy “kiểm soát được” — dạy ta automation 100% không phải lúc nào cũng là mục tiêu.
Ongoing engagement: Chúng tôi tiếp tục dưới dạng retainer 8 giờ/tháng bao gồm bug fix, small features (quý vừa rồi thêm voucher system + multilingual booking page EN/CN), security patch và monitoring. Tháng thứ 6 sau launch bắt đầu discussion phase 2 — thêm supplier portal cho thuyền trưởng check-in khách qua mobile.