# Kiến thức nền tảng — PriceLabs Platform: PriceLabs · HTML: https://harthliving-ota.pages.dev/guide/pricelabs/pricelabs/ · Source: vault/18-ota-listings/platforms/pricelabs.md # 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`](../audits/2026-09-27-pricelabs-helpcenter/index.md). 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`](../audits/2026-09-15-price-parity-airbnb-vs-booking.md) — 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`](../audits/2026-09-25-pricelabs-minstay.json). ### Đọ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`](airbnb-hof-migration-2026-09.md)**. ⛔ 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/`](../audits/2026-09-27-pricelabs-current-setup/index.md) · đọ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ý.