Mục lục
- 16-ota-messages — Tin nhắn gửi khách qua OTA
- ⚠️ Bẫy khi gộp ba trang thành một file chia sẻ (23/09/2026)
- 1. Ba nền tảng làm tin nhắn tự động khác nhau thế nào
- 2. Luật tuân thủ
- 3. Cấu trúc — xếp theo NỀN TẢNG
- 4. Format một file tin nhắn
- 5. Quy trình
- 6. Câu hỏi mở
- 7. Tin nhắn hiện có
- Nguồn khảo sát
- Cài mẫu tin lên Agoda
16-ota-messages — Tin nhắn gửi khách qua OTA
Kho tin nhắn Harth Living gửi khách trong hộp thư của Booking.com · Airbnb · Agoda: tin chào sau khi đặt, hướng dẫn nhận phòng, nhắc trả phòng, cảm ơn sau khi đi.
Vì sao cần folder riêng, không nhét vào
03-posts/: post là nội dung marketing một-tới-nhiều, còn tin OTA là nội dung vận hành một-tới-một, có placeholder động, bị luật từng nền tảng ràng buộc và cùng một nội dung phải cắt khác nhau cho từng kênh. Trộn chung sẽ hỏng cả hai.Đọc nhanh cả kho trên trình duyệt:
/ota-messages booking(hoặcpython3 scripts/ota-messages-viewer.py) →http://localhost:8866/?platform=booking— mọi tin một trang, khối dán sẵn có nút Chép. Chỉ đọc.
⚠️ Bẫy khi gộp ba trang thành một file chia sẻ (23/09/2026)
build-ota-share-page.py ghép ba trang độc lập của viewer vào MỘT tài liệu. Mỗi trang vốn tự do đặt
id theo slug nên khi gộp lại id trùng nhau giữa ba nền tảng. Ba hậu quả đã gặp thật:
- Bấm mục thanh bên không nhảy — trình duyệt tìm thấy
idđầu tiên, nằm trong tab đang ẩn. - 🔴 Nút Chép lấy nhầm bản —
getElementById('paste-'+slug)luôn trả về bản Booking, nên đứng ở tab Agoda bấm Chép lại ra bản Booking (có số điện thoại mà Agoda che thànhXXX). Lỗi im lặng, nhìn trang không thấy gì bất thường. - Tiêu đề đầu trang đứng yên ở "Booking.com" vì thanh trên chỉ lấy từ trang Booking.
Cách sửa đang dùng: gắn tiền tố <nền-tảng>-- vào mọi id / href="#…" / data-target; bỏ ba bản
<script> trùng, thay bằng một script chạy theo từng panel; nút Chép lấy <pre> ngay trong thẻ card
thay vì tra theo id; đầu trang đổi theo tab.
Thêm một bẫy nữa: để trình duyệt tự nhảy neo thì tab thứ hai và thứ ba không cuộn — panel vừa được bỏ
hidden, neo được giải trước khi layout ổn định. Phải cuộn bằng scrollIntoView trong JS.
→ Sửa viewer hoặc builder xong PHẢI mở thật trong trình duyệt bấm thử cả ba tab, không chỉ đếm id trong HTML. Ba lỗi trên đều lọt qua vòng kiểm bằng regex.
1. Ba nền tảng làm tin nhắn tự động khác nhau thế nào
Khảo sát 31/08/2026 — đọc kỹ trước khi thiết kế bất kỳ tin nào.
| Airbnb | Booking.com | Agoda | |
|---|---|---|---|
| Tên tính năng | Scheduled messages + Quick replies | Templates + Automatic replies (Extranet → Inbox → Templates) | Customer Messaging + One-click reply (YCS) |
| Gửi tự động theo lịch | Có — nhưng chỉ 3 mốc kích hoạt: đặt phòng được xác nhận · nhận phòng · trả phòng. Mỗi mốc đặt lệch trước/sau, chạy theo múi giờ của listing | Có — template hẹn lịch, gửi khi có đặt phòng hoặc trước ngày đến | Không có engine hẹn lịch. Chỉ có mẫu trả lời nhanh, phải bấm gửi tay |
| Placeholder | Shortcode chọn từ menu thả xuống, dữ liệu kéo từ listing | "Pre-filled info block" / placeholder chọn từ menu | Không có — phải gõ hoặc dán đủ chữ |
| Gõ tay token được không | Không. Gõ %guest_first_name% thì khách nhận đúng chuỗi chữ đó |
Không | — |
| Thiếu dữ liệu trong listing | Shortcode báo unavailable → phải điền đủ Wi-Fi, chỉ đường, giờ nhận phòng trong listing trước | Kéo từ hồ sơ chỗ nghỉ | — |
| Đính kèm ảnh | Không (trong tin hẹn lịch) | Có + thêm được ngôn ngữ thứ hai | — |
| Quyền cần có | Tài khoản host | Tài khoản Extranet có quyền admin | Tài khoản YCS |
Ba hệ quả bắt buộc cho cách lưu
- Placeholder không chuyển được giữa các nền tảng. Không tồn tại một chuỗi token dán đâu cũng chạy. → Lưu một bản gốc bằng token trung tính
[TOKEN], kèm bảng ánh xạ sang tên shortcode của từng kênh (placeholders.md). - Không có "một bản dán ba nơi". Airbnb cấm thu tiền phòng ngoài nền tảng; tin Booking không được nhắc Airbnb và ngược lại; Agoda phải bung đủ chữ. → Mỗi file tin nhắn chứa khối dán riêng cho từng nền tảng, đã bung sẵn, dán là xong.
- Agoda không tự gửi được. → Trong mỗi file, khối Agoda ghi rõ mốc phải bấm gửi tay.
2. Luật tuân thủ
📕 Nguồn sự thật:
vault/10-rules/ota-messaging-rules.mdBẮT BUỘC đọc trước khi viết, sửa hoặc dán bất kỳ tin nào. File đó có bảng cấm đầy đủ ba nền tảng, cổng kiểm 6 bước, bảng "câu rủi ro → câu thay thế", ma trận loại tin × nền tảng, và mức độ tin cậy của từng luật.
Năm điều chết người, nhớ thuộc:
- Airbnb cấm thu tiền phòng ngoài nền tảng → bỏ hẳn đoạn PAYMENT khỏi mọi tin Airbnb.
- Airbnb cấm host chủ động đưa SĐT/WhatsApp — kể cả sau khi đã đặt phòng. Ngoại lệ chỉ áp khi khách hỏi trước.
- Agoda tự động che SĐT/email thành
XXX→ viết số vào là khách nhận chuỗi vô nghĩa. - Airbnb cấm xin "5 sao" → dùng "leave us a review".
- Không nhắc tên kênh khác trong tin của một kênh, và không mời khách lần sau đặt trực tiếp ở bất kỳ kênh nào.
3. Cấu trúc — xếp theo NỀN TẢNG
vault/16-ota-messages/
├── README.md # file này
├── placeholders.md # bảng ánh xạ token ⇄ shortcode từng kênh
├── open-questions.md # việc chờ user quyết, đánh số cố định
│
├── booking/ # 📋 BẢN DÁN SẴN — mở, chép, dán vào Extranet
├── airbnb/ # 📋 BẢN DÁN SẴN — không tiền, không SĐT, không "5 sao"
├── agoda/ # 📋 BẢN DÁN SẴN — không SĐT, phải bấm gửi tay
│ └── <chỗ-nghỉ>-<NN>-<giai-đoạn>[-<căn>].md
│
└── _source/ # 📁 HỒ SƠ — bản gốc token + lý do từng chỗ cắt + việc còn mở
└── <cùng tên file>.md
Vì sao xếp theo nền tảng: việc thật hằng ngày là "mở đúng nền tảng, chép, dán". Ba nền tảng cấm ba thứ khác nhau nên không có bản dùng chung — để chung một file thì lúc vội rất dễ chép nhầm khối Booking (có tiền, có SĐT) sang Airbnb, và đó đúng là hai thứ Airbnb cấm nặng nhất.
Mỗi nền tảng có README.md riêng tóm tắt luật cấm của chính kênh đó + danh sách tin.
Tên file giống hệt nhau ở cả ba thư mục — 41lehycat-03-checkin.md có mặt trong booking/, airbnb/, agoda/. Cùng một tin, ba bản khác nhau.
<chỗ-nghỉ>=all(mọi chỗ nghỉ) ·alacarte·41lehycat…<NN>-<giai-đoạn>theo hành trình khách:01-confirmation·02-pre-arrival·03-checkin·04-during-stay·05-checkout·06-post-stay<căn>chỉ có khi tin khác nhau theo căn (Wi-Fi, mã cửa):alacarte-03-checkin-305
Chỉ để chỗ điền cho thứ đổi theo từng booking (user chốt 31/08): tên khách và ngày nhận/trả phòng. Địa chỉ và giờ nhận/trả phòng ghi thẳng giá trị thật ở cả ba nền tảng — kể cả Airbnb, dù Airbnb có shortcode kéo từ listing. Đánh đổi đã biết: đổi giờ nhận phòng trong listing thì phải sửa tay các file này, không tự cập nhật theo listing nữa. Đổi lại là bản dán đọc ra chữ thật, không ai chèn nhầm.
Sửa câu chữ: sửa bản gốc trong
_source/trước, rồi đồng bộ xuống cả ba file nền tảng. Sửa lẻ một file là nguồn gốc của lệch bản.
4. Format một file tin nhắn
Mỗi file gồm đúng các phần sau, theo thứ tự:
- Frontmatter —
title,property,unit,stage,language,channels,status,updated. - Bảng mốc gửi — mỗi nền tảng gửi lúc nào, tự động hay tay.
- Bản gốc (canonical) — một khối text duy nhất dùng token trung tính
[TOKEN]. Đây là nguồn sự thật; sửa nội dung thì sửa ở đây trước. - Token dùng trong bài — token nào, lấy giá trị từ đâu.
- Khối dán cho từng nền tảng — đã bung sẵn, dán thẳng không phải sửa gì. Chỗ
«...»là chỗ duy nhất phải thao tác: trên Airbnb/Booking là chèn shortcode từ menu, trên Agoda là gõ tay. - Khác biệt so với bản gốc — bảng ghi từng chỗ mỗi kênh bị cắt/đổi và vì sao. Không được sửa im lặng.
- Cảnh báo & việc còn mở — nếu có.
5. Quy trình
Thêm tin mới: chọn folder <property> → đặt tên NN-<giai-đoạn>[-<căn>]-<lang>.md → viết bản gốc bằng token → đối chiếu fact với vault/02-villas/property_details_<slug>.md và vault/01-context/business.md → dựng khối dán từng kênh theo bảng luật mục 2 → ghi bảng khác biệt.
Sửa tin đã có: sửa bản gốc trước, rồi đồng bộ xuống cả ba khối dán. Không sửa lẻ một khối — lệch bản là lỗi hay gặp nhất của kho tin OTA.
Đổi fact của căn (Wi-Fi, giờ, số điện thoại): sửa ở property_details_* trước, rồi quét lại folder này bằng grep -rn "<giá trị cũ>" vault/16-ota-messages/.
Nếu sau này dùng channel manager (Hospitable, Hostaway, Guesty…): các công cụ đó chuẩn hoá placeholder cho cả ba kênh và mở thêm mốc gửi mà Airbnb/Booking không có. Khi đó folder này thành nguồn nạp — bản gốc token trung tính ở mục 3 map thẳng sang biến của công cụ, không phải viết lại.
6. Câu hỏi mở
Mọi việc còn chờ user quyết nằm ở open-questions.md, đánh số cố định 1–17 để trao đổi theo số. Trả lời xong thì đánh dấu ✅ tại dòng đó, không xoá.
7. Tin nhắn hiện có
11 tin, 25 bản dán sẵn. Tên file giống nhau ở cả ba thư mục — trừ tin check-out, xem chú thích dưới bảng.
| Tin | Chỗ nghỉ | booking/ | airbnb/ | agoda/ |
|---|---|---|---|---|
all-01-confirmation |
Mọi chỗ nghỉ | ✅ | ✅ | ✅ |
alacarte-03-checkin-305 |
A La Carte 305 | ✅ | ✅ | ✅ |
alacarte-03-checkin-404 |
A La Carte 404 | ✅ | ✅ | ✅ |
alacarte-03-checkin-502 |
A La Carte 502 | ✅ | ✅ | ✅ |
alacarte-05-checkout |
A La Carte cả toà | ✅ | ✅ | ✅ |
41lehycat-03-checkin |
Villa 41 Lê Hy Cát | ✅ | ⚠️ dán đè | ✅ |
41lehycat-05-checkout |
Villa 41 Lê Hy Cát | ❌ dùng villa-05-checkout |
✅ | ✅ |
villa-05-checkout |
Mọi villa | ✅ | — | — |
15nuocman5-03-checkin |
Villa 15 Nước Mặn 5 | ✅ | ⚠️ dán đè | — |
181tohienthanh-03-checkin |
Villa 181 Tô Hiến Thành | ✅ | — (bản đang chạy ngoài vault) | — |
25anthuong11-03-checkin |
Villa 25 An Thượng 11 | ✅ | — (bản đang chạy ngoài vault) | — |
Booking.com xếp check-out khác hai kênh kia (user chốt 01/09/2026)
Trên Booking, tin xác nhận đặt phòng và tin check-out giống nhau cho mọi chỗ nghỉ, chỉ check-in khác theo căn. Nhưng một bản check-out duy nhất thì không đúng được: bản đang chạy là bản A La Carte, dặn khách "leave the elevator card keys on the table" — villa không có thang máy. Nên booking/ có hai bản theo loại chỗ nghỉ:
booking/alacarte-05-checkout |
booking/villa-05-checkout |
|
|---|---|---|
| Giờ trả phòng | 12:00 noon | 11:00 AM |
| Thẻ thang máy | có | không |
| Cổng ngoài | — | "pull the gate shut" |
Airbnb và Agoda vẫn chạy bản riêng theo từng căn — chưa đồng bộ theo cách này.
Ký tên: toàn bộ booking/ ký Harth Living Team (user chốt 01/09/2026). airbnb/ và agoda/ vẫn ký Huy — chưa đồng bộ.
⚠️ airbnb/41lehycat-03-checkin là bản mới — phải vào Airbnb dán đè thủ công, bản đang chạy chưa có 4 mục bổ sung.
⏳ Toàn bộ thư mục agoda/ chưa nên bật cho tới khi xác nhận hồ sơ YCS đã khai số điện thoại chỗ nghỉ (câu 12).
Bảo mật (user chốt 31/08): mã cửa và mật khẩu Wi-Fi để nguyên trong file vì repo chưa có git remote. Nhắc lại quyết định này trước khi thêm remote lần đầu.
Còn thiếu: bản Agoda + check-out cho 15nuocman5 · 02-pre-arrival · 04-during-stay · 06-post-stay · bản tiếng Hàn · tin cho 25anthuong11, 181tohienthanh.
Nguồn khảo sát
- Setting up templates, automatic replies, and message notifications — Booking.com for Partners
- How can I send message templates automatically — Booking.com Partner Help
- Using scheduled messages to save time — Airbnb
- Using quick replies to save time — Airbnb
- What is the Airbnb policy for collecting fees in person · Airbnb bans off-platform fees (5/2025)
- Authentic and trustworthy reviews — Airbnb
- How can I start using Agoda's Customer Messaging — Agoda Partner Hub · YCS App — Messaging Guest
Cài mẫu tin lên Agoda
Mẫu tin Agoda thuộc từng Hotel ID, phải tạo lại ở mỗi listing (6 × 3 = 18 mẫu).
Cách làm, quy ước đặt tên, DOM của form và hai script tự động:
vault/18-ota-listings/platforms/agoda-ycs-automation.md.