Harthliving OTA · bản chữ cho AI · dựng từ vault (nguồn sửa lần cuối 29/09/2026 09:28) · mục lục: https://harthliving-ota.pages.dev/ai/index.txt # Harthliving OTA — toàn bộ nội dung, Phần 8/35 · tiếp: https://harthliving-ota.pages.dev/ai/full/part-09.txt Trong phần này: Nối Booking vào PriceLabs · Nối Booking vào PriceLabs · Kiến thức nền tảng — PriceLabs · Kiến thức nền tảng — PriceLabs --- # Nối Booking vào PriceLabs URL: https://harthliving-ota.pages.dev/guide/pricelabs/pricelabs-connect-booking-playbook/ [Tổng quan](https://harthliving-ota.pages.dev/) › [Guide book](https://harthliving-ota.pages.dev/guide/) › [PriceLabs](https://harthliving-ota.pages.dev/guide/pricelabs/) # Nối Booking vào PriceLabs ## Tóm tắt 30 giây **Dùng khi:** Nối một căn trên Booking.com vào PriceLabs. - Người bấm là chủ tài khoản — mọi bước đều đổi cấu hình và giá thật. - 10 bước — chốt Min/Base/Max → khai PriceLabs là Connectivity provider trên extranet → nạp listing vào PriceLabs → map cha–con với dòng Airbnb → kiểm số phòng ngủ → bật sync → xác minh. - PriceLabs không lo tình trạng phòng — phải nối lịch iCal Airbnb ↔ Booking sau cùng. ## Toàn văn Nguồn: `platforms/pricelabs-connect-booking-playbook.md` · Đọc ngày: **11/09/2026** Bản chữ cho máy đọc: [TXT](https://harthliving-ota.pages.dev/api/guidebook/pricelabs/pricelabs-connect-booking-playbook.txt) ### Nối listing Booking.com vào PriceLabs ⚠️ **Người bấm là user, KHÔNG phải agent.** Mọi bước dưới đây đều là GHI (đổi cấu hình thật, đổi giá thật trên kênh bán). Luật `vault/10-rules/ota-readonly-rule.md` cấm agent tự làm; riêng nhãn `Add/Re-import Listings` nằm trong danh sách cấm chạm ở tầng C. Agent chỉ được làm hai việc: **đo trạng thái trước khi nối** và **xác minh sau khi nối** (mục 6). Viết cho `25anthuong11` — property Booking `16927056`, room `1692705601`. Các căn khác dùng lại y hệt, chỉ đổi hai số đó. #### 1. Vì sao phải làm — tình trạng đo được 11/09/2026 Bốn bằng chứng độc lập đều chỉ cùng một kết luận: property này **chưa nối** channel manager nào. | Đo ở đâu | `25anthuong11` (chưa nối) | `41lehycat` (đã nối, dùng làm mẫu) | |---|---|---| | Payload `home.html` | `channelManagerConnected: 0` | `channelManagerConnected: 1` | | Header lịch | `Monthly view` (còn xem được theo tháng) | `XML (edits overwritten)` | | `rate_plans.html`, cột *Price* của `Standard Rate` | `Managed by your Calendar` | `Mapped from PriceLabs` | | Danh sách listing PriceLabs | không có dòng `bcom` nào mang `16927056` | có `15668481___1566848101` | Hệ quả đang gánh: giá Booking của căn này **phẳng 5.000.000₫/đêm ở toàn bộ 81 ô lịch** đọc được, không theo mùa, không theo cuối tuần, không theo nhu cầu. → `issues.md` **L-15** + **L-42**. #### 2. Điều kiện tiên quyết — kiểm trước khi bấm gì | Điều kiện PriceLabs đòi | Trạng thái căn này | |---|---| | Listing đang **live và bookable** trên Booking | ✅ `Open/Bookable` | | Có ít nhất một **rate plan loại Standard** | ✅ `Standard Rate` ID `67628679` | | Không còn PMS/channel manager cũ đang nối | ✅ chưa có cái nào (`channelManagerConnected: 0`) | | Tài khoản PriceLabs còn chỗ cho listing mới | ⚠️ xem mục 7 — phí child listing | **Quyết định phải chốt TRƯỚC khi bật sync:** ba con số `Min` · `Base` · `Max` cho dòng Booking mới. Nối xong mà chưa đặt là PriceLabs đẩy giá của nó xuống, ghi đè mức 5.000.000₫ hiện tại. Mốc tham chiếu từ căn 4 phòng ngủ cùng cỡ `41lehycat` trên Booking: `41 Lê Hy Cát · Booking: Min 4.000.000 Base 5.500.000 Max chưa đặt 25 AT 11 · Booking: giá tĩnh đang chạy 5.000.000 25 AT 11 · Airbnb: Min 3.000.000 Base 4.000.000 ` Gợi ý điểm xuất phát an toàn: `Base` = 5.000.000 (đúng giá đang bán, không tạo cú sốc giá), `Min` = 3.500.000, `Max` đặt một trần thật thay vì bỏ trống. Đây là **đề xuất, không phải số đã chốt** — user quyết. #### 3. Phần A — Bên Booking extranet: khai PriceLabs là Connectivity provider Nguồn: [Booking Partner Help — Setting up and working with a Connectivity provider](https://partner.booking.com/en-us/help/first-steps/online-bookable/setting-and-working-connectivity-provider). ##### Cách A1 — làm cho riêng một property (đơn giản nhất) 1. Đăng nhập extranet, **chọn đúng property `16927056`** (4BR Villa in An Thuong 500m to MyKhe Beach). 2. Bấm **`Account`** trên thanh trên cùng, chọn **`Connectivity provider`** trong menu xổ xuống. 3. Bấm **`Search`**, tìm **`PriceLabs`** trong danh sách nhà cung cấp. 4. Chọn PriceLabs, rồi **tick đủ các quyền**. PriceLabs nói rõ: *"If any one of these is not selected, then the sync will not work."* - `Rates and Availability` - `Reservations` - `Content` (Booking gọi là `Content and photos`) 5. Tick ô đồng ý điều khoản, bấm **`Connect`**. ##### Cách A2 — làm từ group extranet (hợp với tài khoản này hơn) Tài khoản này là **group account 9 property**, và PriceLabs đã là provider của 7 property khác — nên đường bulk là đường tự nhiên để thêm căn thứ 8. 1. Đăng nhập **group extranet**, bấm **`Bulk editing`**. 2. Mục `Connectivity provider`, bấm **`Take action`** cạnh **`Manage connectivity provider`**. 3. Tìm **`PriceLabs`**, bấm **`Connect`**, chọn các quyền cần tích hợp, bấm **`Next`**. 4. Chọn đúng property **`16927056`** (chỉ căn này, đừng động vào 7 căn đang chạy), bấm **`Check and confirm changes`**. 5. Soát lại rồi bấm **`Apply change`**. ##### Sau khi bấm Connect Booking gửi yêu cầu kết nối sang PriceLabs qua email. PriceLabs làm phần mapping và cấu hình, rồi kết nối **tự động hoàn tất khi họ xác nhận xong**. Thông báo về **hộp thư extranet**. Trạng thái kết nối xem lại ở đúng chỗ cũ: `Account` → `Connectivity provider`. ⏱️ Không phải lập tức. Đừng kết luận hỏng nếu chưa thấy đổi ngay trong vài phút. #### 4. Phần B — Bên PriceLabs: nạp listing vào dashboard Nguồn: [PriceLabs — How to Integrate PriceLabs with Booking.com](https://help.pricelabs.co/portal/en/kb/articles/how-to-integrate-pricelabs-with-booking). 1. Đăng nhập PriceLabs. 2. Bấm **`Add/Reconnect Listings`** (tài khoản mới thì nhãn là `Add your listings`). 3. Chọn nhóm **`Airbnb/Booking.com/Houfy/Vrbo`**, rồi chọn **`Booking.com`** trong dropdown. 4. Câu hỏi *"If you have added PriceLabs as your connectivity provider in Booking.com"* → chọn **`Yes`**. 5. Nhập **Property ID / Hotel ID**: `16927056 ` 1. Bấm **`Connect`**. Kết quả mong đợi: **mỗi room type thành một listing riêng** trong PriceLabs. Căn này có đúng một room nên sẽ xuất hiện đúng một dòng, khoá dự kiến: `16927056___1692705601 ` #### 5. Phần C — Cấu hình trước khi cho phép đẩy giá Làm đủ ba việc này **trước** khi bật sync. ##### 5.1 Đặt Min / Base / Max Mở listing Booking mới, khối **`Configure Prices`**, nhập ba ô rồi bấm **`Save & Refresh`**. Số đã bàn ở mục 2. ##### 5.2 Map cha–con với listing Airbnb của cùng căn Đây là việc **chống lệch giá giữa hai kênh và chống tính tiền hai lần**. Vào `Dynamic Pricing` → `Manage Listings` → nút **`Map Listings`**: - **Parent:** listing Airbnb `1729647978348243002` - **Child:** listing Booking `16927056___1692705601` - Bấm **`Map Listings`**. Bằng chứng cách này chạy đúng đã có sẵn trong chính tài khoản: cặp cha–con của 36 Dương Tử Giang có `Min` và `Base` **giống hệt nhau ở cả hai kênh**. Bảy căn trong phạm vi chưa nối cha–con nên Base đang trôi mỗi kênh một kiểu → `issues.md` **L-23**. ⚠️ Nối cha–con **không** sửa số phòng ngủ khai trong PriceLabs. Kiểm riêng ô `BR` của dòng mới, đừng để nó thành `1 BR` như ba dòng Booking đang sai (**L-18**). ##### 5.3 Chênh lệch hoa hồng giữa hai kênh Nếu muốn giá hai kênh khác nhau cho đúng phần hoa hồng, PriceLabs bảo dùng **pricing offset** và **áp ở cấp tài khoản**, không vá từng ngày. #### 6. Phần D — Bật sync, rồi xác minh 1. Trong PriceLabs, bật **`Sync Prices`** cho listing mới, hoặc bấm **`Sync Now`** để đẩy ngay một lần. 2. Đợi, rồi kiểm **bốn dấu hiệu** dưới đây. Nối đúng thì cả bốn phải đổi: | Kiểm ở đâu | Trước | Sau khi nối đúng | |---|---|---| | Lịch Booking | `Monthly view` | `XML (edits overwritten)`, **mất hẳn chế độ xem theo tháng** | | `rate_plans.html`, cột *Price* của Standard Rate | `Managed by your Calendar` | `Mapped from PriceLabs` | | Payload `home.html` | `channelManagerConnected: 0` | `1` | | Danh sách listing PriceLabs | 8 dòng `bcom` | 9 dòng, có `16927056___1692705601` | Agent chạy hộ bước xác minh này được, vì nó chỉ đọc: `node scripts/chrome-cdp-daemon.mjs & node scripts/chrome-grab.mjs --out /tmp/verify-25at11 --settle 8000 \ "https://admin.booking.com/hotel/hoteladmin/extranet_ng/manage/rate_plans.html?hotel_id=16927056&lang=xu" \ "https://admin.booking.com/hotel/hoteladmin/extranet_ng/manage/home.html?hotel_id=16927056&lang=xu" \ "https://app.pricelabs.co/pricing" ` 1. Ba rate plan của căn này ăn theo nhau nên **chỉ cần Standard Rate được đẩy là cả ba đổi**: `Standard Rate 67628679 ← PriceLabs đẩy vào đây Weekly 67628681 = rẻ hơn Standard 5% Monthly 69060005 = rẻ hơn Standard 10% ` #### 6b. Kết quả thật của lần chạy đầu — `25anthuong11`, 11/09/2026 Bốn dấu hiệu **đều đã lật** ⇒ phần kết nối coi như xong. Nhưng đo tiếp trong PriceLabs thì thấy **giá chưa hề được đẩy**: | Đo được | Giá trị | |---|---| | `Enable Price Sync` | **chưa bật** | | `Last synced` | `NA` (chưa đồng bộ lần nào) | | Min · Base · Max | 3.450.000 · 4.600.000 · **chưa đặt** | | `Property Type` · `BR` | `Short-Term` · `4 BR` ✅ | | Map cha–con với Airbnb | **chưa** — `parent_key` hai dòng khác nhau (4100624 vs 4277456) | 📌 **Bài học đắt nhất của bước này:** nối xong KHÔNG có nghĩa là giá chạy. Booking vẫn phục vụ mức tĩnh cũ cho tới khi bật `Enable Price Sync`. Ai chỉ nhìn nhãn `XML (edits overwritten)` rồi báo "xong" là báo sai. 🔎 **Cách kiểm map cha–con bằng máy:** trong `GET /api/pd_dropdown_options`, hai listing đã map **dùng chung `parent_key`**. Cặp mẫu đã map trong tài khoản: 36 Dương Tử Giang, Airbnb `1614694700651096321` và Booking `15995581___1599558101` cùng `parent_key = 3583058`. ⚠️ **Xem giá PriceLabs định đẩy TRƯỚC khi bật sync.** Lịch của căn này hiện phần lớn các đêm nằm đúng ở sàn 3.450.000, tức thuật toán còn muốn xuống thấp hơn nữa nhưng bị Min chặn. Bật sync là giá Booking rơi từ 5.000.000 xuống quanh 3.450.000. Đó có thể là điều mình muốn (lấp đầy 13%), nhưng phải là quyết định có chủ ý, không phải tác dụng phụ. #### 7. Phần E — Việc BẮT BUỘC làm sau: nối lịch bằng iCal 🔴 **PriceLabs KHÔNG đồng bộ tình trạng phòng.** Nguyên văn: *"PriceLabs does not manage availability. You need another tool to ensure that the calendar for your Airbnb and Booking.com is synced."* Nghĩa là nối xong giá chạy đúng nhưng **hai kênh vẫn có thể bán trùng một đêm**. Villa nguyên căn thì đặt trùng là hỏng thật, không phải phiền toái nhỏ. Thêm một bẫy PriceLabs cảnh báo thẳng: *"Even if your Airbnb and Booking.com are already synced prior connecting them to PriceLabs, please follow this step again as Booking.com may have removed the sync."* ⇒ **sau khi nối, phải mở lại phần iCal của Booking và kiểm, kể cả khi trước đó đã nối rồi**. iCal do Booking quản, PriceLabs không can thiệp được; hỏng thì hỏi Booking support. #### 8. Những thứ sẽ mất hoặc đổi — biết trước để khỏi hoảng | Thay đổi | Chi tiết | |---|---| | **Mất chế độ xem lịch theo tháng** | Booking tắt `Monthly view` với mọi property nối API. Chỉ còn `List view` và `Yearly view`. Đây là hành vi bình thường, không phải lỗi | | **Sửa giá tay trong extranet sẽ bị ghi đè** | Nhãn `XML (edits overwritten)` nói đúng nghĩa đen. Từ đó về sau **sửa giá ở PriceLabs**, không sửa trong extranet | | **Giá không đổi từng ngày một cách mượt** | PriceLabs dùng **Delta Push**: chỉ đẩy khi giá mới lệch từ ~5 USD trở lên so với lần đẩy trước | | **Lịch sử đặt phòng chỉ kéo về 15 ngày** | Giới hạn của API Booking, không phải lỗi PriceLabs | | **Phí** | Listing con map từ kênh khác tính khoảng **1 USD/tháng**. Không map thì bị tính như một listing đầy đủ ⇒ map cha–con vừa đúng giá vừa rẻ hơn | #### 9. Thứ tự rút gọn `1. Chốt Min / Base / Max cho dòng Booking (user quyết) 2. Booking extranet → Account → Connectivity provider → PriceLabs → tick đủ quyền → Connect (hoặc group extranet → Bulk editing → Manage connectivity provider) 3. Đợi PriceLabs xác nhận — thông báo về hộp thư extranet 4. PriceLabs → Add/Reconnect Listings → Booking.com → Yes → 16927056 → Connect 5. Nhập Min/Base/Max → Save & Refresh 6. Map Listings: parent = Airbnb 1729647978348243002, child = 16927056___1692705601 7. Kiểm ô BR của dòng mới (phải là 4 BR) 8. Bật Sync Prices 9. Xác minh 4 dấu hiệu ở mục 6 10. Nối lại iCal Airbnb ↔ Booking và kiểm — PriceLabs không lo tình trạng phòng ` #### 10. Liên quan - `issues.md` **L-15** · **L-42** — hai việc mở mà cẩm nang này đóng - `issues.md` **L-23** (chưa map cha–con) · **L-18** (dòng Booking khai sai BR) — sửa luôn trong lúc làm - `platforms/pricelabs.md` §2 — bản đồ 36 listing và cách đọc Base - `platforms/booking.md` §3 — ý nghĩa nhãn XML, sửa ở đâu - `vault/10-rules/ota-readonly-rule.md` — vì sao agent không tự bấm --- # Kiến thức nền tảng — PriceLabs URL: https://harthliving-ota.pages.dev/guide/pricelabs/pricelabs/ [Tổng quan](https://harthliving-ota.pages.dev/) › [Guide book](https://harthliving-ota.pages.dev/guide/) › [PriceLabs](https://harthliving-ota.pages.dev/guide/pricelabs/) # Kiến thức nền tảng — PriceLabs ## Tóm tắt 30 giây **Dùng khi:** Cần hiểu PriceLabs đặt giá thế nào cho 7 căn. - PriceLabs là chỗ đổi giá thật trên mọi kênh cùng lúc — sửa giá ở đây, không sửa ở extranet. - Base là mức giá nền do mình đặt, Min/Max là sàn và trần; PriceLabs có đề xuất Base riêng để so. - PriceLabs chỉ đẩy giá đêm, min stay, luật nhận/trả phòng. Chiết khấu tuần/tháng, phí, khuyến mãi phải cài ở từng kênh. - Pricing Offset (+4 % cho dòng Booking) là lớp đẩy cuối cùng, không đổi Base. ## Toàn văn Nguồn: `platforms/pricelabs.md` · Đọc ngày: **27/09/2026** Bản chữ cho máy đọc: [TXT](https://harthliving-ota.pages.dev/api/guidebook/pricelabs/pricelabs.txt) ### PriceLabs — cơ chế đã hiểu Truy cập theo `vault/10-rules/ota-readonly-rule.md`. **Chỉ đọc.** ⚠️ Đây là chỗ **đổi giá thật trên mọi kênh cùng lúc**. Nút **"Update My Prices Now"** và **"Sync Price"** thuộc diện cấm tuyệt đối nếu chưa có lệnh. 📘 **Tài liệu chính thức đã đọc trọn (27/09/2026):** báo cáo gọn [`Sổ tay PriceLabs`](https://claude.ai/artifact/PHc8UtVcofeWukNaDaY8S1) (`vault/07-outputs/pricelabs-guide.html`) · dump 225 bài + mục lục: [`audits/2026-09-27-pricelabs-helpcenter/index.md`](https://harthliving-ota.pages.dev/library/tech/2026-09-27-pricelabs-helpcenter-index/). Mục 5 bên dưới: câu "PriceLabs có phải channel manager đẩy XML xuống Booking" đã rõ — PriceLabs **là Connectivity provider** của Booking (tài liệu tích hợp Booking.com, bước 1a). #### 1. Vai trò trong hệ thống PriceLabs là **dynamic pricing** đẩy giá xuống các kênh. Đây nhiều khả năng chính là **channel manager** gây ra nhãn `XML (edits overwritten)` trên lịch Booking — nghĩa là **sửa giá phải sửa ở đây**, không sửa trong extranet. *(suy luận, chưa xác minh — xem mục 5)* #### 2. Quy mô — 36 listing = 25 Airbnb + 8 Booking + 3 VRBO + **0 Agoda** Đọc từ response `GET /api/pd_dropdown_options?page_size=25000` (03/09/2026). Giải xong nút thắt "36 là gì". | Kênh trong PriceLabs | Số listing | Ghi chú | |---|---|---| | `airbnb` | **25** | nhiều hơn 15 listing thấy trên trang Hosting — gồm cả các studio lẻ của 86 Phạm Cự Lượng và Ba Na Hills | | `bcom` | **8** | ở cấp **room**, khoá dạng `hotelid___roomid`, không phải cấp property | | `vrbo` | **3** | ⚠️ **kênh thứ tư chưa từng biết** — cả 3 đều ở San Jose, CA | | `agoda` | **0** | ⚠️ **Agoda KHÔNG nối vào PriceLabs** | ##### 2.1 ⚠️ Agoda nằm hoàn toàn ngoài dynamic pricing Không có một listing Agoda nào trong PriceLabs. Nghĩa là **6 listing Agoda đang định giá tay / giá tĩnh**, không theo thị trường, không đồng bộ với hai kênh kia. → `issues.md` **L-14**. ##### 2.2 Bảy căn trong phạm vi — căn nào được PriceLabs quản | Slug | Airbnb | Booking | Agoda | |---|---|---|---| | `25anthuong11` | ✅ `1729647978348243002` | ✅ `16927056___1692705601` (đọc 18/09/2026: Min 3.450.000 · Base 4.600.000 · Max 11.500.000 · Sync ON) | ❌ | | `181tohienthanh` | ✅ `1392557018193095807` | ✅ `14740288___1474028801` | ❌ | | `15nuocman5` | ✅ `1598529903924488190` | ✅ `15668679___1566867901` | ❌ | | `41lehycat` | ✅ `1530969549011048259` | ✅ `15668481___1566848101` | ❌ | | `alacarte305` | ✅ `1299210095000132691` | ✅ `1331150301` **+** `1331150302` (2 hạng phòng) | ❌ | | `alacarte404` | ✅ `1299215688434855781` | ✅ `15702704___1570270401` | ❌ | | `alacarte502` | ✅ `1432771761830735457` | ✅ `14756473___1475647301` | ❌ | ⚠️ **`25anthuong11` trên Booking không có trong PriceLabs** ⇒ giá Booking của căn này là **giá tĩnh**. → **L-15**. **Kiểm lại 11/09/2026: vẫn y nguyên** — 36 listing = 25 `airbnb` + 8 `bcom` + 3 `vrbo`, cùng 8 dòng `bcom` như 03/09. ##### 2.3 Lệch danh sách khác - Booking `15995581` "NEW Pool Villa - 6BR,6BA" (36 Dương Tử Giang) **có** trong PriceLabs nhưng **không** có trong Group homepage. Chưa rõ vì sao. - Booking `15702691` (305 cũ, Closed) và `15702720` (86 PCL, Closed) không có trong PriceLabs — hợp lý vì đang đóng. #### 2b. Bảng giá — ĐỦ 36/36 dòng Lấy bằng **cuộn container ảo** (`css-xidosa`), không bấm phân trang: bảng chỉ giữ ~10 hàng trong DOM cùng lúc, cuộn thì render tiếp. Nút `next-page` thực ra đang disabled vì page size đã là 100. ##### Airbnb — 7 căn trong phạm vi | Căn | Min | Base | Max | BR | Occ 30P | Doanh thu 30P | ADR 30P | ADR/Base | |---|---|---|---|---|---|---|---|---| | 404 | 1.350.000 | 2.179.440 | **Chưa đặt** | 2 BR | **100 %** | 49.505.042 | 1.650.168 | 76 % | | 15 MN | 3.450.000 | 4.500.000 | **Chưa đặt** | 4 BR | 63 % | 68.044.495 | 3.581.289 | 80 % | | 502 | **Chưa đặt** | 1.688.560 | **Chưa đặt** | 1 BR | 60 % | 20.539.809 | 1.141.101 | 68 % | | 181 THT | 2.500.000 | 3.862.830 | **Chưa đặt** | 3 BR | 50 % | 54.025.843 | 3.601.723 | 93 % | | 305 | 1.350.000 | 2.182.970 | **Chưa đặt** | 2 BR | 20 % | 9.396.844 | 1.566.141 | 72 % | | 41 LHC | 3.450.000 | 4.622.500 | **Chưa đặt** | 4 BR | 20 % | 26.100.496 | 4.350.083 | 94 % | | **25 AT 11** | 3.000.000 | 4.000.000 | **Chưa đặt** | 4 BR | **13 %** | 8.000.000 | 2.000.000 | **50 %** | ##### Booking — 6 dòng trong phạm vi | Căn | Min | Base | Max | BR ghi trong PL | Occ 30P | Doanh thu 30P | ADR 30P | |---|---|---|---|---|---|---|---| | 305 hạng 1 | 1.500.000 | 2.400.000 | **Chưa đặt** | 2 BR | 83 % | 77.273.906 | 2.146.497 | | 502 | **Chưa đặt** | 1.700.000 | **Chưa đặt** | 1 BR | 30 % | 14.138.322 | 1.285.302 | | 41 LHC | 4.000.000 *(gợi ý 3.800.000)* | 5.500.000 | **Chưa đặt** | **1 BR** ⚠️ | 20 % | 22.478.442 | 3.746.407 | | 181 THT | 3.000.000 *(gợi ý 2.850.000)* | 4.200.000 | **Chưa đặt** | **1 BR** ⚠️ | **0 %** | 0 | 0 | | 15 MN | 3.900.000 *(gợi ý 3.705.000)* | 6.000.000 | **Chưa đặt** | **1 BR** ⚠️ | **0 %** | 0 | 0 | | **404** | **Chưa đặt** | **CHƯA ĐẶT** ⚠️ | **Chưa đặt** | **1 BR** ⚠️ | 0 % | 0 | 0 | | **305 hạng 2** | **Chưa đặt** | **CHƯA ĐẶT** ⚠️ | **Chưa đặt** | 2 BR | — | — | — | `25anthuong11` không có dòng Booking trong PriceLabs — xem **L-15**. ##### Năm điều đọc ra 1. **`Max Price` chưa đặt ở TOÀN BỘ 36 listing.** Không có trần giá ở bất kỳ đâu. 2. **Hai dòng Booking không có cả `Base`: `404` và `305 hạng 2`.** PriceLabs không tính được giá cho chúng — nghĩa là giá đang đẩy xuống Booking cho hai dòng này là **giá cũ nằm im**, không phải giá động. → **L-21** 3. **BA dòng Booking khai sai số phòng ngủ, không phải hai:** `181THT` (thật 3BR), `15MN` (thật 4BR), `41LHC` (thật 4BR) — tất cả đều ghi **1 BR**. → **L-18** 4. **`25 AT 11` là listing yếu nhất danh mục:** lấp đầy 13 % và giá thực chỉ bằng **50 % giá gốc** — kém nhất trên cả hai trục. Cộng thêm nó không có trên Agoda và không có dòng Booking trong PriceLabs. → **L-22** 5. **Rất nhiều listing ngoài phạm vi chưa đặt Min/Base gì cả:** toàn bộ Ba Na Hills, 86 Phạm Cự Lượng, sáu studio `1681…`, và một listing `1482…4672` **không có tên**. #### 2c. Lấp đầy hợp nhất — cách đọc đúng con số 0 % Airbnb và Booking dùng chung một lịch, nên lấp đầy hai kênh **cộng lại** mới ra mức bán thật của căn. Đây là chỗ dễ kết luận sai nhất. | Căn | Airbnb | Booking | Hợp nhất | Đọc ra sao | |---|---|---|---|---| | `alacarte305` | 20 % | 83 % | **≈103 %** | Kín. Booking gánh gần hết, ở giá cao hơn | | `alacarte404` | **100 %** | 0 % | **100 %** | Kín. **0 % của Booking là HỆ QUẢ, không phải lỗi** | | `alacarte502` | 60 % | 30 % | 90 % | Tốt | | `15nuocman5` | 63 % | **0 %** | 63 % | ⚠️ Còn 37 % trống mà Booking không bán được đêm nào | | `181tohienthanh` | 50 % | **0 %** | 50 % | ⚠️ Còn 50 % trống mà Booking không bán được đêm nào | | `41lehycat` | 20 % | 20 % | 40 % | Yếu, nhưng cả hai kênh đều đang chạy | | `25anthuong11` | 13 % | không có trong PL | ≥13 % | Yếu nhất | **Sửa lại nhận định trước đó:** `404` từng bị xếp chung nhóm "Booking chết". Sai — căn đó **đã kín 100 % qua Airbnb**, nên Booking không còn gì để bán. Chỉ `15nuocman5` và `181tohienthanh` mới là ca thật. #### 2d. Base Price được tính thế nào — và vì sao hai kênh lệch nhau ##### Base là gì — đã kiểm TRỰC TIẾP trên trang listing (03/09/2026) Mở `app.pricelabs.co/pricing?listings=&pms_name=airbnb&open_calendar=true`, khối **Configure Prices**: - **Ba ô nhập thật**, `type=text`, **không readonly, không disabled**: Minimum = `1350000` · **Base = `2182970`** · Maximum = rỗng. - Nút **`Save & Refresh`** ngay dưới → giá trị được lưu chứ không phải hiển thị tính toán. - Nút **`Help Me Choose a Base Price`** → PriceLabs có công cụ **đề xuất** Base. - Khối **`Base Price History`** → mọi lần đổi Base đều được ghi lại. - Chỉ số **`Recommended Base Price to Base Price Ratio` = 1,01** → PriceLabs **tự tính một Base khuyến nghị riêng** và so với Base đang đặt. **Kết luận đúng:** Base là **giá trị lưu trên từng listing, người quản lý sở hữu và bấm lưu** — nhưng **con số thường do PriceLabs sinh ra** qua `Help Me Choose a Base Price` / Recommended Base Price, rồi được chấp nhận. ##### Base KHÔNG tự nhảy — đã xác minh bằng tài liệu Help doc PriceLabs: Base *"is **not automatically updated** by PriceLabs"*; đặt xong thì lưu, và *"should revisit it seasonally"*. Khi thuật toán thấy nên đổi, nó gửi **nudge** — và *"Nudges never auto-apply — you always choose to accept or reject."* Ngược lại, **giá theo ngày thì hoàn toàn tự động**: cập nhật *"up to 24 times per day"* theo dữ liệu nhu cầu. `Base Price → người đặt, đứng yên tới khi có người sửa Giá từng ngày → PriceLabs tự tính lại tới 24 lần/ngày quanh Base đó ` Quan sát khớp: Base của 305 giữ nguyên `2.182.970` suốt các lần đọc cách nhau nhiều giờ trong ngày 03/09, trong khi giá theo ngày và `Last synced` đều đổi. Mọi lần đổi Base được ghi ở `Base Price History` *(mở không được — nút cạnh nhãn đó mang aria-label sai là `Add Notes`, không bấm vì nhãn mơ hồ)*. ⚠️ **Sửa nhận định cũ.** Bản trước ghi *"Base do người dùng tự nhập"* và lý giải số lẻ bằng "máy suy ra rồi được chấp nhận" — đúng phần sau, sai phần đầu. Số lẻ như `2.182.970` · `2.179.440` (hai căn 2BR A La Carte, lệch nhau đúng 3.530đ) là **dấu vết của Recommended Base Price**, không phải người gõ. ##### `Rec/Base Price Ratio` khác nhau giữa hai dòng của CÙNG một căn — vì sao (đọc 15/09/2026 22:30) Đọc 14 dòng lúc 21:40: Airbnb 0,83–0,93 · Booking 0,91–1,25 (404 và 25 AT 11 Booking = *Unavailable*). Ba lý do, đã kiểm: 1. **Chỉ số tính riêng cho từng dòng.** PriceLabs coi dòng Airbnb và dòng Booking của một căn là hai listing độc lập; Base khuyến nghị của mỗi dòng đi từ **lịch sử bán của chính kênh đó** trong 60 ngày (ADR · lấp đầy · pickup 30 ngày) so với thị trường — Help: *"After 7 days (or 14–21 days for new listings) of consistent price syncing with the same base price, PriceLabs generates a personalized recommendation… Recommendations update weekly and apply for 7 days."* 305: Booking lấp 53 % ở ADR cao hơn → 1,03; Airbnb lấp 23 % → 0,93. 2. **Tử số cũ, mẫu số mới.** Rec chỉ tính lại hàng tuần (`next_update_date`: 305 Airbnb 20/09 · 305 Booking 23/09 · 41 Airbnb 24/09), còn Base thì mình vừa đổi: Airbnb ×1,15 ngày 14/09 (ratio tụt ~13 % chỉ vì mẫu số), Booking đổi sang Base của cha ngày 15/09 (15 MN 6,0 tr → 5,175 tr ⇒ rec cũ ≈ 6,47 tr ÷ Base mới = **1,25**; 502 1,7 tr → 1,94 tr ⇒ 0,91). Ba dòng Booking 181/41/15 MN còn được tính với comp set **1 BR** tới tận hôm nay (`L-18`). 3. **Mô hình thị trường chỉ có cho dòng Airbnb.** Endpoint `api/bph/fetch_base_price_estimator_data` (nút *Help Me Choose a Base Price*, chỉ mở để đọc): dòng **Airbnb 305** có `market.value = 2.631.611` (bách phân vị 68 trong 145 căn 2 BR Sơn Trà) kèm bảng đóng góp từng yếu tố — Service Fee **+343.254** (*"Hidden Service Fee"*, host-only) · Guest Favorite +66.252 · Superhost +44.168 · Review count +72.648 · Amenities −110.420 · Cleaning fee −57.143 · ADR −33.429 · Occupancy +18.782 · Pickup +79.097; dòng **Booking 305** cùng căn trả `market.value = null`, không có bảng yếu tố (Guest Favorite/Superhost/review là thuộc tính Airbnb). ⇒ dòng Booking chỉ có nửa mô hình (hiệu suất riêng kênh), không có nửa thị trường. Dump: `audits/2026-09-15-post-mapping-verify/base-price-estimator-*.json`. **Cách dùng từ nay:** Base đã chép từ cha sang con nên **chỉ đọc ratio ở dòng Airbnb (cha)**; chờ lượt tính lại tuần sau (20–24/09, với Base mới + BR đúng) rồi mới xét nudge. Ratio dòng Booking hiện tại là số cũ trên mẫu số mới — không hành động theo nó. Lưu ý riêng 41 LHC: estimator đặt Base 5.315.880 ở bách phân vị **41/157 căn 4 BR** và mô hình yếu tố ra 8.875.292 (percentile 83) — ngược chiều với ratio tuần 0,87; hai công cụ đo hai thứ khác nhau (thị trường theo thuộc tính vs hiệu suất 60 ngày), chưa kết luận. ##### Base KHÔNG phải giá trung bình Base = giá của một đêm **bình thường** (mùa thường, ngày thường, nhu cầu thường). Là **đầu vào**. Giá trung bình đã bán là cột `ADR` — **kết quả**. ##### ⚠️ `Rec/Base Price Ratio` KHÔNG phải tỷ lệ giá theo ngày Nhãn đầy đủ trên trang listing là **`Recommended Base Price to Base Price Ratio`**: `Rec/Base = Base mà PriceLabs KHUYẾN NGHỊ ÷ Base bạn ĐANG ĐẶT ` - `1,01` (305) → PriceLabs nghĩ Base nên cao hơn 1 %. - `0,97` (404) → nghĩ Base nên **thấp hơn 3 %**. - `1,07` (502) → nghĩ Base nên cao hơn 7 %. Đúng bằng số thứ hai trong ô Base của dòng đó: `1.688.560 × 1,07 = 1.807.055` ⇒ **số thứ hai là Recommended Base Price**, không phải giá hôm nay. *(Bản trước diễn giải nhầm đây là "giá khuyến nghị theo ngày". Sai.)* ##### ⚠️ ADR thấp hơn Base phần lớn là do MÙA, không phải bán rẻ Đọc lịch giá tháng 9/2026 của `305 · Airbnb` (Base 2.182.970): | | Giá | % của Base | |---|---|---| | Chạm sàn Min | 1.350.000 | **61,8 %** | | Trung bình tháng 9 | 1.660.000 | 76,0 % | | Cao nhất tháng 9 | 2.070.000 | 94,8 % | | ADR 30 ngày qua | 1.566.141 | 71,7 % | **Cả tháng 9 đều dưới Base**, và có ngày chạm đúng sàn Min. Đây là hành vi đúng của thuật toán trong mùa thấp — Base là giá đêm *bình thường*, tháng 9 Đà Nẵng không bình thường. ⇒ **Tỷ lệ `ADR/Base` thấp KHÔNG tự nó chứng minh bán rẻ.** Chỉ dùng nó để so các căn với nhau trong cùng kỳ, đừng đọc như một mức tuyệt đối. Ca đáng ngờ thật là `25 AT 11` ở **50 %** — thấp hơn hẳn phần còn lại. ##### PriceLabs tính cái gì `Min` · `Base` · `Max` là **ba ô người dùng tự nhập**, lưu riêng cho từng listing. PriceLabs chỉ gợi ý một con số lúc onboard rồi thôi; từ đó về sau nó **không tự đổi Base**. Thứ PriceLabs tính là **giá khuyến nghị theo từng ngày**: `giá ngày X = Base × (mùa · thứ trong tuần · lấp đầy của chính mình · nhu cầu thị trường từ comp set · khoảng cách tới ngày ở) rồi kẹp vào [Min, Max] ` Cột `Rec/Base Price Ratio` chính là hệ số tổng hợp đó. Base là **cái neo**, không phải kết quả. ##### Vì sao Airbnb và Booking lệch nhau dù cùng PriceLabs **Mỗi kết nối kênh là một listing RIÊNG trong PriceLabs, có bộ Min/Base/Max riêng.** `Airbnb 305` và `Booking 13311503___1331150301` là hai hàng khác nhau. Không ai đồng bộ Base giữa chúng, nên hai con số là **tàn dư của hai lần nhập tay khác nhau, ở hai thời điểm khác nhau** — không phải kết quả của thuật toán nào. **Bằng chứng 1 — dấu vết làm tròn.** Base của Booking **tròn 100.000 ở cả 5/5 dòng**; Base của Airbnb **lẻ ở 5/7 dòng** (2.182.970 · 2.179.440 · 3.862.830 · 1.688.560 · 4.622.500). Số lẻ là dấu vết máy suy ra rồi được chấp nhận; số tròn là người gõ tay. **Bằng chứng 2 — cặp PARENT/CHILD chứng minh cách sửa.** Villa 36 Dương Tử Giang đã được nối cha–con trong PriceLabs: | Vai | Kênh | Min | Base | |---|---|---|---| | PARENT | Airbnb `1614…6321` | 4.500.000 | 7.290.170 | | CHILD | Booking `15995581___1599558101` | 4.500.000 | 7.290.170 | **Giống hệt nhau.** Nối cha–con là Base tự đồng bộ. Bảy căn trong phạm vi **chưa nối**, nên trôi mỗi nơi một kiểu. → **L-23** *(Lưu ý: nối cha–con đồng bộ Base nhưng KHÔNG sửa số phòng ngủ — dòng CHILD của 36 Dương Tử Giang vẫn ghi 3 BR trong khi PARENT ghi 6 BR.)* ##### Bẫy lớn hơn: hai cột Base không so sánh được với nhau `Base Booking` là **giá khách trả**. `Base Airbnb` hiện tại là **giá TRƯỚC phụ thu khách ~14,2%** (mô hình split fee). So thẳng hai cột là so hai thứ khác nhau. | Căn | Khách trả trên Airbnb | Khách trả trên Booking | Thực tế | |---|---|---|---| | `alacarte305` | 2.492.952 | 2.400.000 | **Booking rẻ hơn 3,7 %** | | `alacarte502` | 1.928.336 | 1.700.000 | **Booking rẻ hơn 11,8 %** | | `181tohienthanh` | 4.411.352 | 4.200.000 | **Booking rẻ hơn 4,8 %** | | `41lehycat` | 5.278.895 | 5.500.000 | Booking đắt hơn 4,2 % | | `15nuocman5` | 5.139.000 | 6.000.000 | Booking đắt hơn 16,8 % | **Đảo ngược ba trên năm dòng.** Cột "Booking đắt hơn" tính trên Base là **góc nhìn của host**, không phải cái khách thấy. Khách thấy Booking rẻ hơn ở 305, 502 và 181 THT. **Từ 15/09 hai cột mới so được với nhau**, vì Airbnb chuyển sang host-only thì Base Airbnb cũng thành giá khách trả. *Phụ thu khách Airbnb lấy ~14,2%, là mức phổ biến — chưa đọc từ tài khoản. Hoa hồng Booking của tài khoản này cũng chưa xác minh nên chưa tính được tiền thực nhận hai kênh.* #### 2e. ADR và Revenue nghĩa là gì — ĐÃ CHỨNG MINH 03/09/2026 Nguồn: tab **Booking Insights** của listing, bảng *Recent Bookings* — cột `Booked Date · Check In · Check Out · Length of Stay · Rental Revenue · Total Revenue · ADR · Guest Count`. ##### Ba định nghĩa, kiểm trên 4 booking thật của căn 305 `ADR = Rental Revenue ÷ số đêm Rental Revenue = tiền phòng thuần — KHÔNG gồm phí dọn Total Revenue = (Rental Revenue + phí dọn) × (1 − 3%) = tiền host THỰC NHẬN ` | Booking | Đêm | Rental | (Rental + 350.000) × 0,97 | Total ghi trên PriceLabs | |---|---|---|---|---| | 01–03/09 | 2 | 2.850.596 | **3.104.578** | 3.104.578 ✓ | | 06–13/10 | 7 | 9.185.532 | **9.249.466** | 9.249.466 ✓ | | 27–29/08 | 2 | 2.775.155 | **3.031.400** | 3.031.400 ✓ | | 12–15/09 | 3 | 4.429.030 | **4.635.659** | 4.635.659 ✓ | **4/4 khớp đến từng đồng.** Suy ngược ra phí host = **3,000 %** ở cả bốn. ##### Trả lời ba câu còn treo 1. **ADR KHÔNG gồm phí dọn.** Nó là tiền phòng thuần chia số đêm. ⇒ Tỷ lệ `ADR/Base` so đúng chuẩn: cả tử lẫn mẫu đều là giá phòng một đêm. Lo ngại trước đó không thành vấn đề. 2. **ADR là số GỘP**, chưa trừ hoa hồng kênh. Số đã trừ nằm ở cột khác — `Total Revenue`. 3. **Đối chiếu với Airbnb: khớp.** Hai giá trị `Total Revenue` của PriceLabs xuất hiện **nguyên vẹn** trong danh sách chi trả của chính Airbnb (`/earnings/paid`): **3.104.578** ở đợt *Sep 2* và **3.031.400** ở đợt *Aug 28*. PriceLabs nhập dữ liệu Airbnb trung thực, không lệch. ##### Hệ quả: phí host Airbnb hiện tại = ĐÚNG 3 % Trước đây đây là **giả định** khi tính lại giá cho mốc 15/09. Nay đã chứng minh trên 4 booking thật ⇒ phép tính `giá mới = giá cũ × 0,97 ÷ 0,845 = ×1,1479` là **đúng**, không phải ước lượng. ⚠️ **Chưa kiểm:** `Rental Revenue` và `ADR` của các dòng **Booking.com** có cùng quy ước không. Nếu Booking gộp phí khác đi thì việc so `Thực/Gốc` giữa hai kênh vẫn lệch chuẩn. #### 2f. Chiết khấu dài ngày — PriceLabs CÓ tính năng, nhưng KHÔNG đẩy được xuống Airbnb/Booking Xác minh 03/09/2026 bằng help doc + kiểm trong app. ##### Hai tính năng PriceLabs có | Tính năng | Làm gì | Kênh hỗ trợ | |---|---|---| | **Weekly and Monthly discount** | Giảm giá cho lưu trú theo tuần/tháng. *"Discounts apply on top of daily rates"* — cảnh báo *"Average daily rates can be lower than your set minimum price"* | VRBO · Bookerville · BookingSync · Guesty · Hostify · MyVR · Tokeet… — **KHÔNG có Airbnb, KHÔNG có Booking.com** | | **Length of Stay (LOS) Pricing** | *"adjusts the nightly rate based on how long a guest is planning to stay"*, áp **sau** mọi customization khác | 20+ PMS (Avantio · Lodgify · Rentals United · Ownerrez…) — **KHÔNG có Airbnb, KHÔNG có Booking.com** | ⇒ **Với danh mục này (Airbnb direct + Booking direct), cả hai tính năng đều vô hiệu.** ##### Vậy chiết khấu dài ngày đang nằm ở đâu | Kênh | Cơ chế thật | Ai sở hữu | |---|---|---| | **Airbnb** | `weeklyPriceFactor` 0,95 · `monthlyPriceFactor` 0,9 trong listing editor | **Airbnb** — PriceLabs không chạm tới | | **Booking.com** | **Rate plan riêng**: `Standard Rate` · `Weekly Rate` · `Monthly rate` — không phải phần trăm | Booking. Riêng `Monthly rate` của 502 gắn nhãn **`Not XML`** ⇒ **PriceLabs không đẩy vào đó, giá tĩnh** | | **VRBO** | PriceLabs đẩy được | PriceLabs — nhưng 3 listing VRBO đều ở San Jose, ngoài phạm vi | **Sửa lại lo ngại nêu trước đó:** không có nguy cơ PriceLabs và Airbnb cùng ghi weekly/monthly discount — PriceLabs **không thể** ghi. Airbnb sở hữu hoàn toàn hai giá trị đó. ##### Customization của tài khoản này: RỖNG *(hết đúng từ 20/09/2026 — xem mục 2i)* Mục `Applied Customizations` của listing 305 **không có mục nào**. Thuật toán đang chạy hoàn toàn theo mặc định — không seasonal profile, không orphan-gap, không last-minute, không LOS. *(Mới kiểm 305; 6 căn còn lại chưa kiểm.)* → **L-34** #### 2g. `Total Revenue` của Booking KHÁC hẳn của Airbnb — đo 03/09/2026 Cùng tên cột, hai nghĩa ngược chiều. Kiểm bằng Booking Insights của dòng `13311503___1331150301`: `Airbnb Total Revenue = (Rental + cleaning) × 0,97 ← TRỪ phí host 3% = tiền host NHẬN Booking Total Revenue = (Rental + cleaning) × 1,08 ← CỘNG 8% = tiền khách TRẢ ` | Booking 305 | Đêm | Rental | (Rental + 300.000) × 1,08 | Total ghi | |---|---|---|---|---| | 14–24/10 | 10 | 14.568.344 | **16.057.812** | 16.057.812 ✓ | | 19–22/09 | 3 | 4.144.444 | **4.800.000** | 4.800.000 ✓ | | 23/11–03/12 | 10 | 17.055.843 | **18.744.310** | 18.744.310 ✓ | Hệ số suy ngược = **1,08000** ở cả ba. `ADR = Rental ÷ số đêm` vẫn đúng như Airbnb. ⚠️ **Chưa xác minh 8% đó là gì.** Giả thuyết mạnh nhất là **VAT 8%** (mức áp cho dịch vụ lưu trú tại Việt Nam theo chính sách giảm thuế). Không tìm thấy khai báo thuế trên trang `property_policies` — cần mở đúng trang thuế của extranet để chốt. → **L-36** ##### ⛔ Bản 03/09 của mục này SAI — sửa 15/09/2026 Bản cũ suy ra *"khách Booking bị cộng thêm 8 %"* và dựng bảng "khách thực trả = Base Booking × 1,08". **Sai.** Đối chiếu trang công khai 15/09 (4/4 căn): khách Booking trả **đúng Σ giá đêm PriceLabs đẩy** + phí dọn, không cộng gì. 8 % là **VAT khai *included*** trên `vat_tax_charges.html` — nằm bên trong giá; Booking báo về PriceLabs giá phòng **đã bóc VAT**, nên `Total = (Rental + dọn) × 1,08` chỉ là cộng ngược lại. Hệ quả thật duy nhất: `ADR dòng Booking trong PriceLabs = giá khách trả ÷ 1,08 (đã bóc VAT) ← thấp hơn giá thật ~7–8 % ADR dòng Airbnb trong PriceLabs = giá khách trả ← số gộp ` ⇒ So `ADR`/`Rental` hai kênh trong PriceLabs phải nhân dòng Booking với 1,08 trước. Hoa hồng Booking đã đọc: **15,00 %** trên tổng khách trả gồm VAT + dọn (`L-37`). Bảng "khách thực trả" đúng, đo trên trang khách 90 đêm × 6 căn, nằm ở [`audits/2026-09-15-price-parity-airbnb-vs-booking.md`](https://harthliving-ota.pages.dev/library/reports/2026-09-15-price-parity-airbnb-vs-booking/) — kết quả: **khách Booking đang trả ÍT hơn Airbnb** trung vị +2,6 % (25 AT 11) tới +17,1 % (41 LHC), ngược với bảng cũ ở 4/5 dòng. ##### 2g-bis. Đọc giá khách thấy từ PriceLabs — dùng endpoint nào (15/09/2026) | Endpoint | Dùng để | Không dùng để | |---|---|---| | `api/process → graph_data.pricing_array[].price` | **Giá khách thấy từng ngày** — đã đối chiếu 9/9 trang công khai Airbnb + Booking khớp đến từng đồng | mở/đóng: `num_bookings` chỉ đếm đơn, **không** phản ánh ngày khoá tay | | `api/fetch_last_request_text → Availability[]` | **Mở/đóng thật** từng ngày (0 = đóng) | giá: mảng `Rates` là **gói đẩy cũ** — sau khi nâng Base 15 % ngày 14/09, gói Airbnb vẫn ghi giá cũ (25 AT 11: 3.000.000 trong khi Airbnb đang bán 3.450.000); `user_price` trong graph_data cũng là số cũ này | #### 2g-bis. Minimum stay — đọc toàn bộ 25/09/2026 🔄 **Cập nhật 27/09/2026:** `25anthuong11` Booking **không còn chạy PriceLabs Recommended** — nay gắn profile `Huy SJ` (cố định 2 đêm, đẩy đủ 541 đêm) và có override min stay 2 đêm 26/09–01/10. 13/14 dòng sync còn lại vẫn tắt min stay. `36 Dương Tử Giang` đã tắt sync cả hai dòng. Nguồn: mục 2j. **Lệnh đọc lại (CHỈ ĐỌC):** `node scripts/ota-pricelabs-minstay.mjs [--nights] [--json ]`. Snapshot: [`audits/2026-09-25-pricelabs-minstay.json`](https://harthliving-ota.pages.dev/library/reports/2026-09-25-pricelabs-minstay/). ##### Đọc ở đâu cho đúng — ba bẫy 1. **Đọc `response.structured_json.min_stay.data`, KHÔNG đọc `response.json.update_minstay`.** Listing chưa từng lưu customization nào (`15nuocman5`, `alacarte502`, `25anthuong11` Airbnb…) trả `response.json` **rút gọn, không có một trường min stay nào** ⇒ `update_minstay` ra `undefined`, đọc ẩu thành "tắt" thì đúng kết quả nhưng sai lý do, và sẽ sai khi có căn bật. 2. **`html_hierarchies_applied.min_stay === "None"`** = không có min stay ở **bất kỳ tầng nào** (listing · sub-group · group · account). Dùng làm cổng kiểm chéo. 3. **`usage_instance_count` của profile KHÔNG đáng tin** — cả 3 profile đều trả `0` trong khi `36 Dương Tử Giang` đang chạy profile `Huy SJ`. Muốn biết ai dùng profile nào thì đọc `structured_json.min_stay.data.profile_id` của từng listing. ⚠️ **Modal trong giao diện hiển thị lệch bản lưu.** Bấm *Set Your Minimum Stay* trên `alacarte305` Airbnb thì modal mở ra với công tắc *Apply Minimum Stay Restrictions* **BẬT** và nhãn xanh *"Custom minimum stay settings applied"*, trong khi bản đã lưu là `update_minstay: 0`, `minstay_customizations: null`. Modal đang **mồi sẵn trạng thái setup**, chưa phải trạng thái thật. Đọc API, đừng đọc modal. ##### Bảng trạng thái — 7 căn trong phạm vi | Căn | Airbnb | Booking | |---|---|---| | `alacarte305` | tắt | tắt (cả 2 hạng phòng) | | `alacarte404` | tắt | tắt | | `alacarte502` | tắt | tắt | | `181tohienthanh` | tắt — **còn giá trị đã lưu 2 đêm** (`default_minstay_type: dfd`) | tắt — **còn giá trị đã lưu 2 đêm** | | `41lehycat` | tắt | tắt | | `15nuocman5` | tắt | tắt | | `25anthuong11` | **tắt** | ✅ **BẬT** — *PriceLabs Recommended (Short-Term Rental)*, sàn `min_weekday 1 / min_weekend 1`, không gắn profile | ⇒ **14/15 dòng tắt. Duy nhất `25anthuong11` Booking bật** → **L-122**, **L-123**. Ngoài phạm vi: `36 Dương Tử Giang` (Airbnb + Booking) chạy profile `Huy SJ` = cố định 2 đêm. 34/37 listing toàn tài khoản đang tắt. ##### Ba profile có sẵn ở cấp tài khoản — không căn nào trong 7 căn dùng | id | Tên | Nội dung | Ai đang dùng | |---|---|---|---| | 121894 | `3 nights minimum` | Mặc định 3 đêm (weekday + weekend) · Last-minute 2 đêm trong 7 ngày | **0 listing** | | 18287 | `Huy SJ` | Mặc định cố định 2 đêm | **2 listing đang chạy** — `36 Dương Tử Giang` Airbnb `1614694700651096321` + Booking `15995581___1599558101`. Gắn thêm ở `931494923533247426` (guesthouse San Jose) nhưng **công tắc TẮT** nên PriceLabs không tính | | 121795 | `May 2026` | Mặc định 3 đêm · Last-minute 2 đêm trong 14 ngày | **0 listing** | **`25anthuong11` Booking KHÔNG dùng profile nào** — `profile_id: null`, nó chạy preset *PriceLabs Recommended (Short-Term Rental)* đặt thẳng trên listing. Preset không xuất hiện trong danh sách Min Stay Profiles. Trang `Dynamic Pricing → Customizations → Min Stay Profiles` hiện nhãn *"Used across N instances"* — **N chỉ đếm listing có công tắc BẬT**, nên khớp với `structured_json.min_stay.data.enabled === true`, không khớp với `has_profile`. ##### `25anthuong11` Booking đang đẩy min stay bao nhiêu — đọc từng đêm `pricing_array[].min_stay` của `16927056___1692705601`, 541 đêm 25/09/2026 → 18/03/2028: | Min stay | Khoảng | Số đêm | |---|---|---| | **1 đêm** | **25/09 → 31/10/2026** | **37** | | 2 đêm | 01/11 → 22/12/2026 | 52 | | 3 đêm | 23/12 → 26/12/2026 | 4 | | 2 đêm | 27/12 → 31/12/2026 | 5 | | 3 đêm | 01/01 → 04/02/2027 | 35 | | **5 đêm** | 05/02 → 11/02/2027 (Tết) | 7 | | 3 đêm | 12/02 → 30/04/2027 | 78 | Tổng: 37 đêm ở mức 1 · 226 đêm ở mức 2 · 266 đêm ở mức 3 · 5 đêm mức 4 · 7 đêm mức 5. Sàn `min_weekday 1 / min_weekend 1` là **lý do 37 đêm gần nhất tụt về 1 đêm** — thuật toán được phép hạ tới sàn để lấp chỗ trống. ##### `max_stay` chưa đặt ở đâu cả `pricing_array[].max_stay = -1` trên mọi đêm, mọi listing. Trần lưu trú hiện do chính kênh giữ (Airbnb 365 đêm cho villa, 180 đêm cho A La Carte). ##### Cả hai kênh đều hỗ trợ — không phải giới hạn kỹ thuật `graph_data.feature_access.show_min_stay = true` cho **cả** `airbnb` lẫn `bcom`. Khác hẳn weekly/monthly discount và LOS pricing (mục 2f) — hai cái đó PriceLabs **không** đẩy được xuống hai kênh này. Min stay thì đẩy được, chỉ là chưa bật. #### 2h. Tool "Airbnb Fee Change: Update Prices" (banner `Update My Prices Now`) — đọc 14/09/2026 Drawer phân trang, ghi chỉ ở nút `Save Prices` (POST `/api/airbnb_fee_migration/apply`). Preview đọc được không cần mở: `GET /api/airbnb_fee_migration?page_number=1` → 7 listing, chỉ Base + Min, hai hệ số `without_vat 15` / `with_vat 16.6`. Trang *Before you begin* của chính PriceLabs dặn **chạy tool Airbnb trước** (nâng cleaning fee + chuyển fee), rồi mới Save + Sync ở đây. Cơ chế đầy đủ, bảng số từng căn và checklist bấm: **[`airbnb-hof-migration-2026-09.md`](https://harthliving-ota.pages.dev/guide/airbnb/airbnb-hof-migration-2026-09/)**. ⛔ Lựa chọn *"I'm Already on Host-Only Fee and Adjusted My Prices"* xoá tool vĩnh viễn. #### 2i. Pricing Offset — lớp cuối cùng, KHÔNG đụng Base Price (đo 20/09/2026) 🔄 **Cập nhật 27/09/2026 — ba ý "đã đo" bên dưới đã cũ:** offset +4 % **đã vào gói đẩy** 26/09 (tỉ lệ `Rates` bcom/airbnb trung vị **1,0400** ở cả 7 cặp) và **lịch PriceLabs giờ hiện offset**: giá từng đêm của dòng Booking = dòng Airbnb × 1,04, `fetch_reasons_json` ghi "Pricing Offset 4%" ở mục *final_adjustments* mọi đêm. Cột Base vẫn không đổi theo offset (ý 1 còn đúng). Nguồn: mục 2j. **Nơi đặt:** `Dynamic Pricing → Customizations` (`app.pricelabs.co/customization`) → tab **Customization** → **Accounts** (hoặc Groups / Listings) → nút **Edit** của kênh → mục **Price Offset**. **Trạng thái tài khoản này (đọc 20/09/2026 18:40):** | Tài khoản | Số listing | Customization | |---|---|---| | Airbnb | 25 | *No customizations set up* | | **Booking.com** | **9** | **Price Offset · Percent · 4** · công tắc *Apply Price Offset* **BẬT** | | Vrbo | 3 | *No customizations set up* | Trường nội bộ (tên cũ từ thời tích hợp Beds24, đọc trong bundle + `fetch_customizations`): `pricing_offset = { beds24_increment_on : công tắc (0/1) beds24_increment_type : "percent" | "fixed" beds24_increment : giá trị } ` ##### Cơ chế — theo tài liệu chính thức [`help.pricelabs.co/…/pricing-offsets-for-mapped-listings`](https://help.pricelabs.co/portal/en/kb/articles/pricing-offsets-for-mapped-listings): - Offset áp lên **Recommended Price** — giá đề xuất **từng đêm**, *"after all other customizations have been applied"*, kể cả Fixed Price Overrides và Orphan Discounts. - Áp **SAU** cả Min lẫn Max: *"if your offset is a premium, it may make your price go higher your maximum price"* ⇒ **offset xuyên thủng trần Max**. - *"The final adjusted price will be pushed to the PMS"* — tức offset nằm ở **bước đẩy**, không nằm ở dữ liệu gốc. - Listing đã map cha–con: **phải đặt ở cấp account hoặc group.** *"If set at the listing level, it gets removed whenever a change is made to the parent listing."* - Trần: giảm tối đa 40, tăng tối đa 500 (cả fixed lẫn percent). `Base ──(mùa · DOW · lấp đầy · comp set · DFD)──▶ giá ngày ──kẹp [Min,Max]──▶ Recommended Price │ ×(1+offset) ▼ giá ĐẨY xuống kênh ` ##### ⚠️ Ba điều dễ hiểu sai — đã đo, không phải suy luận 1. **Cột `Base Price` trên Pricing Dashboard KHÔNG BAO GIỜ đổi theo offset.** Base là *đầu vào* người dùng lưu; offset tác động ở *đầu ra*. Đã map cha–con nên 7/7 cặp có Min/Base/Max **giống hệt nhau** giữa dòng Airbnb và dòng Booking — và sẽ mãi như vậy dù offset bao nhiêu. Đây là biểu hiện ĐÚNG, không phải lỗi. 2. **Lịch giá trong PriceLabs cũng không hiện offset.** `graph_data.pricing_array[].price` của 7 dòng `bcom` **trùng khít** dòng `airbnb` cha suốt 60 ngày (tỉ lệ 1,[đã che] ở 7/7 căn). 3. **Offset chỉ thành hiện thực khi có lần đẩy mới.** Đo 20/09/2026: gói đẩy cuối của `bcom 305` (`CurrentListingTime 2026-09-20 16:00:19`) so từng phần tử với gói `airbnb 305` (16:21:46) — 198 đêm giá dương, **trung vị tỉ lệ 1,00000**, biên 0,99997–1,00004, **0 đêm vượt +3 %**. Offset đã lưu và đã bật, nhưng **chưa vào gói đẩy nào**. ##### Cách kiểm sau khi Sync (chỉ đọc) Đọc `api/fetch_last_request_text?listingId=&pmsName=` (bắt qua CDP khi mở trang listing — gọi thẳng bằng `listing_id/pms` trả `ERR-FLRT-INVALID-PARAMS`), lấy `data.listing.Rates` của **cả hai dòng cùng một căn** rồi chia từng phần tử. Số âm = ngày đóng (giá trị là −Min). Offset ăn khi **trung vị ≈ 1,04**. Đối chứng cuối cùng vẫn là giá trên trang khách Booking. ##### Hệ quả cho chiến lược gộp phí dọn Offset **cấp account = MỘT mức cho cả 9 listing `bcom`** (gồm cả căn ngoài phạm vi: 36 Dương Tử Giang, 305 hạng 2). Muốn mỗi căn một số tiền khác nhau — như bản chốt 20/09 (phí dọn ÷ 4) — phải dựng **Group riêng cho từng căn** rồi đặt offset ở cấp group; đặt ở cấp listing sẽ bị xoá mỗi lần dòng cha đổi. Xem `vault/08-agents/DECISIONS.md` mục 20/09. #### 2j. Ảnh chụp cấu hình đang áp — 27/09/2026 (chỉ đọc) Báo cáo đầy đủ: **https://claude.ai/artifact/LGDaxgGujTga1hLjSqYize** (`vault/07-outputs/pricelabs-current-setup.html`) · dữ liệu gốc + ảnh: [`audits/2026-09-27-pricelabs-current-setup/`] · đọc lại bằng `scripts/pricelabs-setup-snapshot/`. - **14/37 listing bật sync** = 7 căn × (Airbnb cha + Booking con). 23 dòng tắt sync (San Jose, 86 PCL, 36 DTG, hạng 2 của 305…). - **Min/Base/Max** cha = con ở 6/7 căn; **25 AT 11 lệch: Min Airbnb 2.000.000, Booking 2.200.000**. Max ≈ 2,5 × Base ở cả 14 dòng. Base Airbnb đổi 14/09, Base Booking đổi 15/09. - **Tuỳ chỉnh riêng cấp listing:** 181 THT last-minute −5 % phẳng 7 ngày · 41 LHC −10 % giảm dần 4 ngày · 305/404 orphan −20 % cho khe **2–3 đêm** (khe 1 đêm không được giảm) · 305/404 chọn last-minute theo thị trường ở cấp listing · 25 AT 11 override 26/09–01/10 (Airbnb −33 %, Booking −24 % + min stay 2) · 25 AT 11 Booking profile min stay `Huy SJ`. Còn lại là mặc định (market-driven last-minute/far-out/OBA, booking recency, Safety Min 110 % ADR năm trước cho đêm > 180 ngày). - **Cấp account:** Airbnb không có gì · Booking.com Pricing Offset +4 % · không group, không override cấp account. - **Sync:** Default Overnight Sync (GMT), không giờ riêng, không additional sync, **Real-time Sync tắt** (trang ghi $1/đơn vị/tháng). Lần đẩy cuối 26/09 tự động (`UserSync N`). Gói đẩy: Airbnb 731 đêm, Booking 760 đêm. - **Control Panel bật:** Group Wizard, Data Widget, Portfolio OBA, Demand Factor, Seasonality, Smoothing, Day of Week, Pricing Offset. Tắt: Sub-groups, POBA weekday/weekend, Custom Seasonal Profile, Weekend Adjustments, Pricing Profiles, Rounding, No Price Updates for Unavailable Nights, Hotel compsets, Adjacent, Custom Safety Min, Min last-minute, Min orphan. - **Action Center 5 mục:** last-minute "quá nhẹ" ở 181 THT và 41 LHC (cả hai kênh) · 502 Airbnb gợi ý hạ Min 1.360.000 → 1.292.000 (hết hạn 28/09). - **Safety Min làm sàn thật** ở 0–250 đêm tuỳ dòng (404 Airbnb 250, 181 THT Airbnb 197); dòng Booking chưa có lịch sử năm trước thì không áp. #### 3. Bố cục giao diện Menu chính: `Dynamic Pricing` · `Portfolio Analytics` · `Market Research` · `Listing Optimizer` · `Action Center`. Bảng `Pricing Dashboard` — cột đo được 03/09/2026: `Listings` · `Calendar` · `Tags` · `Action Center` · `Sync Price` · `Property Type` · `Group` · **`Min Price`** · **`Base Price`** · **`Max Price`** · `BR` · `City` · `Total Occ (30P)` · `Rec/Base Price Ratio` · `Total Rev (30P)` · `ADR (30P)` · `MPI (30N)` - **Min / Base / Max Price** là ba chốt chặn của thuật toán — Base là giá gốc, thuật toán chạy trong khoảng Min–Max. - `(30P)` = 30 ngày đã qua (past), `(30N)` = 30 ngày tới (next). - `MPI` = Market Penetration Index — so mình với thị trường. - Bảng nạp bất đồng bộ; đọc ngay sau khi mở sẽ ra một loạt `Loading...`. **Phải đợi nạp xong mới đọc số.** #### 4. Cảnh báo đang chạy `Action Center` có **99+** mục và một banner riêng **7**. Banner đỏ: **ACTION REQUIRED: Airbnb fee change on Sep 15th 2026** — xem `airbnb.md` mục 1 và `issues.md` **L-01**. #### 5. Chưa biết — cần học thêm - PriceLabs có phải channel manager đang đẩy XML xuống Booking không, hay còn bên thứ ba khác. - 36 listing gồm những gì (cần mở `Add/Re-import Listings`, **chỉ đọc**). - Đang chạy chiến lược giá nào, có customization theo mùa / theo ngày trong tuần không. - 99+ mục trong Action Center là loại gì, mục nào thực sự cần xử lý. --- Phần 8/35 · tiếp: https://harthliving-ota.pages.dev/ai/full/part-09.txt