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 33/35 · tiếp: https://harthliving-ota.pages.dev/ai/full/part-34.txt Trong phần này: Dump trung tâm hướng dẫn PriceLabs — 27/09/2026 · Dump trung tâm hướng dẫn PriceLabs — 27/09/2026 · Agoda Partner Portal (YCS) — cẩm nang điều khiển · Agoda Partner Portal (YCS) — cẩm nang điều khiển · Chrome nào được dùng để làm việc · Chrome nào được dùng để làm việc --- # Dump trung tâm hướng dẫn PriceLabs — 27/09/2026 URL: https://harthliving-ota.pages.dev/library/tech/2026-09-27-pricelabs-helpcenter-index/ [Tổng quan](https://harthliving-ota.pages.dev/) › [Dữ liệu & báo cáo](https://harthliving-ota.pages.dev/library/) › [Tài liệu kỹ thuật](https://harthliving-ota.pages.dev/library/tech/) # Dump trung tâm hướng dẫn PriceLabs — 27/09/2026 ## Dump trung tâm hướng dẫn PriceLabs — 27/09/2026 Nguồn: `audits/2026-09-27-pricelabs-helpcenter/index.md` ### Dump help.pricelabs.co — 27/09/2026 Nguồn của báo cáo **Sổ tay PriceLabs** (`vault/07-outputs/pricelabs-guide.html`, link cố định https://claude.ai/artifact/PHc8UtVcofeWukNaDaY8S1). - `articles-md.tar.gz`: 225 bài, mỗi bài một file `txt/.md` (HTML đã chuyển sang Markdown thô, dòng 2 ghi danh mục · ngày sửa · URL). Giải nén: `tar -xzf articles-md.tar.gz`. - `feature-matrix-airbnb-bcom.json`: dòng Airbnb + Booking.com của bảng Feature Availability chính thức (đã bỏ các cột liên hệ/credential nội bộ của PriceLabs). - Bỏ 205 bài *Integrations A–Z* (hướng dẫn nối từng PMS khác), giữ 8 bài tích hợp liên quan (Airbnb, Booking.com, VRBO, General). #### Cách tải lại (không cần trình duyệt) Trung tâm hướng dẫn chạy Zoho Desk, trang render bằng JS nên curl HTML không ra nội dung. Gọi thẳng API công khai: - Cây danh mục: `GET https://help.pricelabs.co/portal/api/kbCategories?portalId=

&locale=en` (kèm `articlesCount`) - Danh sách bài: `GET .../portal/api/kbArticles?categoryId=&portalId=

&locale=en&from=1&limit=50` - Nội dung bài: `GET .../portal/api/kbArticles/?portalId=

` — **không kèm `locale`** (có là lỗi `UNPROCESSABLE_ENTITY`); HTML nằm ở trường `answer`. - `portalId` lấy trong HTML trang `/portal/en/kb` (chuỗi `edbsn…`). - Bảng Feature Availability: Google Sheet `1axr1eg93uwQAZBmiC8yKsS20-GrayE6_3e1MWJDoR9M`; tab hiển thị là dropdown một dòng, dữ liệu đủ nằm ở `export?format=csv&gid=0`. ⚠️ Tab đó chứa cả cột credential nội bộ của PriceLabs — đừng lưu nguyên file. #### Mục lục 225 bài ##### Getting Started with PriceLabs - [How to integrate PriceLabs with Chevalier](https://help.pricelabs.co/portal/en/kb/articles/how-to-integrate-pricelabs-with-chevalier) · 2026-09-17 - [New to PriceLabs? Get Set Up in 10 Minutes!](https://help.pricelabs.co/portal/en/kb/articles/new-to-pricelabs-get-set-up-in-10-minutes) · 2026-06-16 - [Getting Started with PriceLabs - A Comprehensive Guide](https://help.pricelabs.co/portal/en/kb/articles/getting-started-with-pricelabs-a-comprehensive-guide) · 2025-12-11 - [What is Dynamic Pricing and how to use it?](https://help.pricelabs.co/portal/en/kb/articles/what-is-dynamic-pricing-and-how-to-use-it-14-12-2023) · 2026-01-13 - [What is Market Dashboard and how to use it?](https://help.pricelabs.co/portal/en/kb/articles/what-is-market-dashboard-and-why-to-use-it) · 2025-03-13 - [What is Portfolio Analytics and how to use it?](https://help.pricelabs.co/portal/en/kb/articles/what-is-portfolio-analytics-and-how-to-use-it-2-1-2024) · 2025-12-15 - [Does PriceLabs cover my area?](https://help.pricelabs.co/portal/en/kb/articles/does-pricelabs-cover-my-area) · 2025-03-14 - [Creating an Account and Importing Listings](https://help.pricelabs.co/portal/en/kb/articles/getting-started) · 2026-08-06 - [Available Integrations](https://help.pricelabs.co/portal/en/kb/articles/available-integrations) · 2026-09-04 - [Training Sessions on How to Use PriceLabs and Get the Best Out of it!](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-training-on-how-to-use) · 2025-06-17 ##### Dynamic Pricing > Basic Setup - [Creating a Demo Listing](https://help.pricelabs.co/portal/en/kb/articles/creating-a-dummy-listing) · 2026-08-18 - [Action Center](https://help.pricelabs.co/portal/en/kb/articles/action-center) · 2026-08-13 - [What is the Control Panel?](https://help.pricelabs.co/portal/en/kb/articles/what-is-the-control-panel) · 2026-06-05 - [How to Check if a PMS is Connected to Your Airbnb Account?](https://help.pricelabs.co/portal/en/kb/articles/how-to-check-if-a-pms-is-connected-to-your-airbnb-account) · 2025-12-01 - [Guide for Using Both Airbnb, Booking.com, and Vrbo with PriceLabs](https://help.pricelabs.co/portal/en/kb/articles/guide-for-using-both-airbnb-booking-com-and-vrbo-with-pricelabs) · 2026-02-04 - [Setting your base price](https://help.pricelabs.co/portal/en/kb/articles/setting-base-price) · 2026-07-15 - [What are minimum, base, and maximum prices- How to set them up?](https://help.pricelabs.co/portal/en/kb/articles/what-are-minimum-base-and-maximum-prices-how-to-set-them-up) · 2026-08-07 - [Default Discounts and Premiums](https://help.pricelabs.co/portal/en/kb/articles/default-discounts-and-premiums) · 2026-08-27 - [How to check if my listings are synced successfully?](https://help.pricelabs.co/portal/en/kb/articles/how-to-check-if-my-listings-are-synced-successfully) · 2026-04-21 - [How Often Are Rates Synced & How to Sync Listings?](https://help.pricelabs.co/portal/en/kb/articles/how-often-are-my-rates-sycned-to-my-pms-and-how-does-sync-now-work) · 2026-06-24 - [Don’t Skip This! The Ultimate Checklist to Ensure Your PriceLabs Setup is On Point!](https://help.pricelabs.co/portal/en/kb/articles/don-t-skip-this-the-ultimate-checklist-to-ensure-your-pricelabs-setup-is-on-point) · 2026-06-30 - [Guide for using both Airbnb and Vrbo with PriceLabs](https://help.pricelabs.co/portal/en/kb/articles/guide-for-using-both-airbnb-and-vrbo-with-pricelabs) · 2025-10-16 - [PriceLabs - Airbnb integration, common questions, and errors](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-airbnb-integration) · 2026-05-08 ##### Dynamic Pricing > Pricing Dashboard - [Understanding Your Pricing Dashboard](https://help.pricelabs.co/portal/en/kb/articles/understanding-your-dashboard) · 2026-07-10 - [Understanding the Pricing Calendar](https://help.pricelabs.co/portal/en/kb/articles/pricing-calendar) · 2026-07-10 - [Booking Insights Tab](https://help.pricelabs.co/portal/en/kb/articles/booking-insights-tab) · 2025-08-01 - [What Do the Colors Mean? A Guide to PriceLabs Calendar Color-Coding](https://help.pricelabs.co/portal/en/kb/articles/what-do-the-colors-mean-a-guide-to-pricelabs-calendar-color-coding) · 2026-02-13 - [Different Prices on Your Calendar - Tooltip Explained](https://help.pricelabs.co/portal/en/kb/articles/different-prices-on-your-calendar-explained) · 2026-07-10 - [Performance Metrics on PriceLabs Dashboard and Multi Calendar](https://help.pricelabs.co/portal/en/kb/articles/performance-metrics) · 2026-09-20 - [How to filter listings in your dashboard?](https://help.pricelabs.co/portal/en/kb/articles/how-to-filter-listings-in-your-dashboard) · 2025-11-10 ##### Dynamic Pricing > Customizations > Overview - [Managing Property Types](https://help.pricelabs.co/portal/en/kb/articles/customizations-smart-presets) · 2026-08-17 - [Pricing Customizations](https://help.pricelabs.co/portal/en/kb/articles/pricing-customizations) · 2026-08-10 - [Understanding Customization and Date-Specific Override Hierarchy](https://help.pricelabs.co/portal/en/kb/articles/customization-hierarchy) · 2025-07-21 - [Customizations which allow Below Minimum Prices](https://help.pricelabs.co/portal/en/kb/articles/customizations-which-allow-below-minimum-prices) · 2026-05-26 - [Table View for Customizations](https://help.pricelabs.co/portal/en/kb/articles/table-view-for-customizations) · 2026-06-02 - [Preview Prices Graph](https://help.pricelabs.co/portal/en/kb/articles/preview-prices-graph) · 2026-05-27 - [List of all PriceLabs Customizations](https://help.pricelabs.co/portal/en/kb/articles/list-of-all-pricelabs-customizations) · 2025-07-31 ##### Dynamic Pricing > Customizations > Stay Restrictions - [Setting Dynamic Minimum Stay Restrictions in PriceLabs](https://help.pricelabs.co/portal/en/kb/articles/understanding-min-nights) · 2026-08-13 - [How the Min Stay Recommendation Engine Works](https://help.pricelabs.co/portal/en/kb/articles/introducing-data-driven-dynamic-minimum-night-recommendations) · 2026-04-10 - [Creating and Using Minimum Stay Profiles](https://help.pricelabs.co/portal/en/kb/articles/creating-and-using-min-stay-profiles) · 2026-08-13 - [Understanding the Difference Between Minimum Stay on Arrival and Minimum Stay Through](https://help.pricelabs.co/portal/en/kb/articles/minimum-stay-on-arrival-vs-minimum-stay-through) · 2025-04-01 - [Check-in & Check-out feature](https://help.pricelabs.co/portal/en/kb/articles/checkin-checkout-feature) · 2026-08-18 - [Creating and Using Check-in Check-out Profiles](https://help.pricelabs.co/portal/en/kb/articles/creating-and-using-check-in-check-out-profiles) · 2025-09-17 - [What happens when Min-Stay or check-in/check-out restriction is removed from PriceLabs?](https://help.pricelabs.co/portal/en/kb/articles/how-to-rectify-min-stay-setting-errors) · 2025-06-03 - [Hierarchy of Minimum Stay Restrictions](https://help.pricelabs.co/portal/en/kb/articles/hierarchy-of-minimum-stay-restrictions) · 2025-04-01 ##### Dynamic Pricing > Customizations > General - [Last Minute Prices](https://help.pricelabs.co/portal/en/kb/articles/last-minute-prices) · 2026-06-29 - [Date-Specific Overrides](https://help.pricelabs.co/portal/en/kb/articles/date-specific-overrides) · 2026-07-05 - [Weekly and Monthly Discounts](https://help.pricelabs.co/portal/en/kb/articles/weekly-monthly-discount) · 2026-08-14 - [Occupancy Based Adjustments](https://help.pricelabs.co/portal/en/kb/articles/occupancy-based-adjustments) · 2026-07-30 - [No Price Updates For Unavailable Nights](https://help.pricelabs.co/portal/en/kb/articles/no-price-updates-for-unavailable-nights) · 2026-06-03 ##### Dynamic Pricing > Customizations > Seasonal and Minimum Prices - [Seasonality Factor Sensitivity](https://help.pricelabs.co/portal/en/kb/articles/seasonality) · 2026-08-24 - [Seasonal Pricing Settings](https://help.pricelabs.co/portal/en/kb/articles/seasonal-minimum-base-and-max-price-settings) · 2026-06-29 - [Seasonal Pricing Customizations (aka Pricing Profiles)](https://help.pricelabs.co/portal/en/kb/articles/pricing-customizations-profiles) · 2026-04-07 - [Advanced Minimum Price Settings](https://help.pricelabs.co/portal/en/kb/articles/advanced-minimum-price-settings) · 2026-08-27 ##### Dynamic Pricing > Customizations > Advanced Customizations - [Quote Clicks Data and Search Demand Based Pricing](https://help.pricelabs.co/portal/en/kb/articles/direct-booking-tools-integration-using-quote-data-to-inform-pricing) · 2026-09-17 - [Booking Recency Factor](https://help.pricelabs.co/portal/en/kb/articles/booking-recency-factor) · 2025-06-16 - [Demand Factor Sensitivity](https://help.pricelabs.co/portal/en/kb/articles/demand-factor-sensitivity) · 2026-08-24 - [Far Out Prices](https://help.pricelabs.co/portal/en/kb/articles/far-out-prices) · 2025-08-19 - [Safety Minimum Price](https://help.pricelabs.co/portal/en/kb/articles/safety-minimum-price-15-10-2024) · 2026-06-16 - [Pricing Offsets](https://help.pricelabs.co/portal/en/kb/articles/pricing-offsets-for-mapped-listings) · 2026-07-23 - [Adjacent Factor](https://help.pricelabs.co/portal/en/kb/articles/adj) · 2026-06-29 - [Extra Person Fee](https://help.pricelabs.co/portal/en/kb/articles/extra-person-fee) · 2026-05-09 - [Length of Stay Pricing Adjustments](https://help.pricelabs.co/portal/en/kb/articles/length-of-stay-pricing) · 2026-09-01 - [Rounding and Smoothing](https://help.pricelabs.co/portal/en/kb/articles/rounding-and-smoothing) · 2026-06-29 ##### Dynamic Pricing > Customizations > Bulk Customizations - [Editing Pricing Customizations for Multiple Accounts, Groups, or Listings](https://help.pricelabs.co/portal/en/kb/articles/editing-pricing-customizations-for-multiple-accounts-groups-or-listings) · 2026-07-29 - [Creating and Managing Groups with the Group Creation Wizard](https://help.pricelabs.co/portal/en/kb/articles/creating-and-managing-groups-with-the-group-creation-wizard) · 2026-04-22 - [Managing Multiple Listings with Account and Group-Level Customization](https://help.pricelabs.co/portal/en/kb/articles/account-group-customization) · 2026-06-30 - [Portfolio Occupancy Based Adjustments](https://help.pricelabs.co/portal/en/kb/articles/portfolio-occupancy-based-adjustments) · 2026-07-30 ##### Dynamic Pricing > Algorithm - [About Hyper Local Pulse and FAQ](https://help.pricelabs.co/portal/en/kb/articles/about-hyper-local-pulse-new-algorithm-and-faq) · 2026-05-19 - [Migrating to Hyper Local Pulse (less than 10 listings)](https://help.pricelabs.co/portal/en/kb/articles/moving-to-hyper-local-pulse) · 2025-04-04 - [Migrating to Hyper Local Pulse (more than 10 listings)](https://help.pricelabs.co/portal/en/kb/articles/migrating-to-hyper-local-more-than-10-listings) · 2025-04-12 - [How Does the PriceLabs Algorithm Respond to Natural Calamities?](https://help.pricelabs.co/portal/en/kb/articles/how-does-the-pricelabs-algorithm-respond-to-natural-calamities) · 2025-04-04 ##### Dynamic Pricing > Integrations > General - [How to Sync your Airbnb and Booking.com calendars](https://help.pricelabs.co/portal/en/kb/articles/how-to-sync-your-airbnb-and-booking-com-calendars) · 2026-03-12 - [Guide for using both Airbnb and Booking.com with PriceLabs](https://help.pricelabs.co/portal/en/kb/articles/guide-for-using-both-airbnb-and-booking-with-pricelabs) · 2026-03-12 - [Using a PMS/Channel Manager to list prices to multiple OTAs](https://help.pricelabs.co/portal/en/kb/articles/pms) · 2025-04-09 - [Transitioning between PMS](https://help.pricelabs.co/portal/en/kb/articles/transitioning-between-management-systems) · 2026-05-22 - [Customer API](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-api) · 2026-06-30 ##### Dynamic Pricing > Integrations > A-F - [How to Integrate PriceLabs with Airbnb](https://help.pricelabs.co/portal/en/kb/articles/how-to-integrate-pricelabs-with-airbnb-official-airbnb-integration) · 2026-07-31 - [How to Integrate PriceLabs with Booking.com](https://help.pricelabs.co/portal/en/kb/articles/how-to-integrate-pricelabs-with-booking) · 2026-05-26 ##### Dynamic Pricing > Integrations > T-Z - [How to Integrate PriceLabs with Vrbo](https://help.pricelabs.co/portal/en/kb/articles/vrbo) · 2026-09-13 ##### Dynamic Pricing > Price Calculations - [Mid-Term Rentals (MTR) - Default Pricing](https://help.pricelabs.co/portal/en/kb/articles/mid-term-rentals-mtr-default-customization) · 2026-08-25 - [How Are the Price Recommendations Calculated?](https://help.pricelabs.co/portal/en/kb/articles/how-is-pricing-calculated) · 2026-06-02 - [What is Historical Data and How Do We Use It?](https://help.pricelabs.co/portal/en/kb/articles/what-is-historical-data) · 2025-09-03 - [How should you price compared to your competition?](https://help.pricelabs.co/portal/en/kb/articles/competition-pricing) · 2025-04-08 - [Listing Neighborhood Data](https://help.pricelabs.co/portal/en/kb/articles/listing-market-data) · 2026-09-24 - [Percentile Distribution](https://help.pricelabs.co/portal/en/kb/articles/percentile-distribution) · 2025-04-08 - ['AI Insights' in Neighborhood Data: Understanding Price and Occupancy charts](https://help.pricelabs.co/portal/en/kb/articles/ai-insights-neighborhood-data) · 2025-04-08 - [How PriceLabs Handles Event Pricing?](https://help.pricelabs.co/portal/en/kb/articles/how-pricelabs-handles-event-pricing) · 2025-04-08 - [Pricing Recommendation Nudges](https://help.pricelabs.co/portal/en/kb/articles/recommendation-nudges) · 2026-03-25 - [Pacing Factor](https://help.pricelabs.co/portal/en/kb/articles/pacing-factor) · 2026-08-05 - [Events, Holidays, and High-Demand Dates](https://help.pricelabs.co/portal/en/kb/articles/events-holidays-and-high-demand-dates) · 2026-03-05 - [Using Vrbo data for your dynamic pricing!](https://help.pricelabs.co/portal/en/kb/articles/using-vrbo-data-for-your-dynamic-pricing) · 2026-09-14 - [How Pricelabs Dynamic Pricing can affect your Airbnb ranking](https://help.pricelabs.co/portal/en/kb/articles/how-pricelabs-dynamic-pricing-strategy-can-affect-your-airbnb-ranking) · 2025-04-08 ##### Dynamic Pricing > Pricing Strategies - [Airbnb Fee Structure Migration Tool](https://help.pricelabs.co/portal/en/kb/articles/airbnb-fee-structure-migration-tool) · 2026-09-04 - [Understanding Price Gouging Laws and Your Pricing Strategy](https://help.pricelabs.co/portal/en/kb/articles/understanding-price-gouging-laws) · 2026-05-26 - [PriceLabs for Remote Listings](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-for-remote-listings) · 2025-02-28 - [How to Get Seasonal Prices Right in PriceLabs?](https://help.pricelabs.co/portal/en/kb/articles/how-to-get-seasonal-prices-right-in-pricelabs) · 2025-09-18 - [What to Do After Finishing Your Free Trial: A Step-by-Step Guide to Optimize Your Listings](https://help.pricelabs.co/portal/en/kb/articles/what-to-do-after-finishing-your-free-trial-a-step-by-step-guide-to-optimize-your-listings) · 2025-01-21 - [Pricing Recipe for New Airbnb Hosts Using PriceLabs](https://help.pricelabs.co/portal/en/kb/articles/pricing-recipe-for-new-airbnb-hosts-using-pricelabs-11-9-2024) · 2025-01-21 - [Pricing Recipe Using Booking Curves: A Step-by-Step Guide](https://help.pricelabs.co/portal/en/kb/articles/pricing-recipe-using-booking-curves-a-step-by-step-guide) · 2024-09-17 - [Using PriceLabs for Midterm Rentals](https://help.pricelabs.co/portal/en/kb/articles/using-pricelabs-for-mid-term-rentals) · 2026-06-03 - [Preventing gap creation using minstay settings](https://help.pricelabs.co/portal/en/kb/articles/preventing-gaps) · 2025-09-16 - [Pricing for Combined Listings using PriceLabs](https://help.pricelabs.co/portal/en/kb/articles/combined-listings-18-7-2024) · 2025-11-20 - [How to think about and come up with monthly discounts?](https://help.pricelabs.co/portal/en/kb/articles/how-to-think-about-and-come-up-with-monthly-discounts) · 2024-08-10 - [Using Rate Plans to Customize Pricing and Packages](https://help.pricelabs.co/portal/en/kb/articles/rate-plan) · 2026-09-10 ##### Dynamic Pricing > PriceLabs for Hotels - [PriceLabs for Hotels](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-for-hotels) · 2025-06-27 - [Hotels - Initial Setup](https://help.pricelabs.co/portal/en/kb/articles/setting-up-hotel-listings-in-pricelabs) · 2026-08-06 - [Hotels - Pricing Customizations](https://help.pricelabs.co/portal/en/kb/articles/customizations-for-hotel) · 2026-08-06 - [Hotels - Default Customization](https://help.pricelabs.co/portal/en/kb/articles/hotels-default-customization) · 2026-02-11 - [Hotels – Setting the Base Price for a Room Type](https://help.pricelabs.co/portal/en/kb/articles/setting-you) · 2026-01-27 - [Hotel Rate Shopper (Listing Hotel Data)](https://help.pricelabs.co/portal/en/kb/articles/listing-hotel-data) · 2026-07-26 - [Hotel Rate Shopper - Copying Comp Sets Across Room Types/Listings](https://help.pricelabs.co/portal/en/kb/articles/copying-comp-sets-across-room-types-listings) · 2026-07-23 - [Using Portfolio Analytics for Hotels](https://help.pricelabs.co/portal/en/kb/articles/portfolio-analytics-for-hotels) · 2026-03-03 - [Creating Reports Tailored to Your Hotel (Report Builder)](https://help.pricelabs.co/portal/en/kb/articles/creating-reports-tailored-to-your-hotel-report-builder) · 2025-05-28 - [Intra-day Portfolio Occupancy-Based Adjustments](https://help.pricelabs.co/portal/en/kb/articles/intra-day-portfolio-occupancy-based-adjustments) · 2026-05-08 - [Real-Time Sync](https://help.pricelabs.co/portal/en/kb/articles/real-time-sync) · 2026-08-05 - [Recommended Hotel Pricing Settings to Maximize Revenue Performance](https://help.pricelabs.co/portal/en/kb/articles/recommended-hotel-pricing-settings-to-maximize-revenue-performance) · 2026-08-06 ##### Dynamic Pricing > Multicalendar - [Understanding the PriceLabs Multi Calendar](https://help.pricelabs.co/portal/en/kb/articles/multicalendar) · 2026-07-10 ##### Dynamic Pricing > Manage Listings - [Understanding the Manage Listings Page](https://help.pricelabs.co/portal/en/kb/articles/understanding-manage-listings-page) · 2026-09-20 - [Mapping Listings From Different Channels](https://help.pricelabs.co/portal/en/kb/articles/mapping-listings) · 2026-06-16 - [Multi-unit Mapping](https://help.pricelabs.co/portal/en/kb/articles/mapping-listings-within-the-channels-same-pms-mapping) · 2026-03-20 - [Combined Listings](https://help.pricelabs.co/portal/en/kb/articles/combined-listings) · 2026-09-01 ##### Dynamic Pricing > DP FAQs - [Airbnb fee structure change: what PriceLabs users need to know](https://help.pricelabs.co/portal/en/kb/articles/airbnb-fee-structure-change-what-pricelabs-users-need-to-know) · 2026-09-17 - [How to hide listings from the dashboard?](https://help.pricelabs.co/portal/en/kb/articles/how-to-hide-listings) · 2025-11-26 - [Notes](https://help.pricelabs.co/portal/en/kb/articles/notes) · 2025-12-09 - [Impacts of NOT Updating Prices for Unavailable Dates](https://help.pricelabs.co/portal/en/kb/articles/impacts-of-not-updating-prices-for-unavailable-dates) · 2026-07-22 - [How to Edit the Listing Bedroom Count?](https://help.pricelabs.co/portal/en/kb/articles/how-to-edit-the-listing-bedroom-count) · 2026-08-14 - [Upload/Download Features in PriceLabs](https://help.pricelabs.co/portal/en/kb/articles/upload-download-features) · 2026-09-20 - [Can I Block or Unblock My Calendar or Manage Booking Lead Time in PriceLabs?](https://help.pricelabs.co/portal/en/kb/articles/availability-management) · 2025-09-18 - [How to export rates as CSV](https://help.pricelabs.co/portal/en/kb/articles/how-to-export-rates-as-csv) · 2025-04-10 - [How to Edit Listing Location in PriceLabs?](https://help.pricelabs.co/portal/en/kb/articles/listing-location-settings-in-pricelabs) · 2026-07-16 - [Using Tags in PriceLabs](https://help.pricelabs.co/portal/en/kb/articles/using-tags-in-pricelabs) · 2026-03-20 - [How to Change the Currency of a Listing](https://help.pricelabs.co/portal/en/kb/articles/how-to-change-the-currency-of-a-listing) · 2025-05-05 - [Pricing Beyond 1.5 Years](https://help.pricelabs.co/portal/en/kb/articles/pricing-beyond-one-year) · 2025-04-11 - [How to delete listings from PriceLabs?](https://help.pricelabs.co/portal/en/kb/articles/remove-listing) · 2025-11-26 - [How to reconnect listings?](https://help.pricelabs.co/portal/en/kb/articles/updating-existing-listings) · 2025-04-11 - [Inconsistent Rates](https://help.pricelabs.co/portal/en/kb/articles/inconsistent-rates) · 2025-04-11 - [Setting Cleaning Fees, Service Fees and Booking Fees](https://help.pricelabs.co/portal/en/kb/articles/how-does-pricelabs-manage-fees-from-multiple-channels) · 2025-04-11 ##### Dynamic Pricing > Dynamic Pricing on the Mobile App - [Navigating Your Pricing Calendar on the Mobile App](https://help.pricelabs.co/portal/en/kb/articles/navigating-your-pricing-calendar-on-the-mobile-app) · 2026-07-10 - [Navigating Your Pricing Dashboard on the Mobile App](https://help.pricelabs.co/portal/en/kb/articles/navigating-your-pricing-dashboard-on-the-mobile-app) · 2026-07-10 ##### Portfolio Analytics > Basics - [Portfolio Analytics: Spot Actionable Trends In Your Bookings](https://help.pricelabs.co/portal/en/kb/articles/portfolio-analytics) · 2025-04-03 - [How Metrics In Portfolio Analytics are Calculated Depending Selection Scenario](https://help.pricelabs.co/portal/en/kb/articles/how-metrics-in-portfolio-analytics-are-calculated-depending-selection-scenario) · 2026-07-23 - [Portfolio Analytics Availability](https://help.pricelabs.co/portal/en/kb/articles/portfolio-analytics-integrations) · 2026-08-25 - [Revenue Calculations by PMS](https://help.pricelabs.co/portal/en/kb/articles/revenue-calculations-by-pms) · 2026-09-04 - [Portfolio Analytics : Terminology](https://help.pricelabs.co/portal/en/kb/articles/portfolio-analytics-terminology) · 2025-04-03 - [Refresh Reservations Data in Portfolio Analytics](https://help.pricelabs.co/portal/en/kb/articles/refresh-reservations-data-in-portfolio-analytics) · 2025-08-28 - [Upload Reservations Using CSV in Portfolio Analytics](https://help.pricelabs.co/portal/en/kb/articles/upload-reservations-using-csv-in-portfolio-analytics) · 2026-07-23 - [Making the most of the data visualizations in PriceLabs!](https://help.pricelabs.co/portal/en/kb/articles/making-the-most-of-the-data-visualizations-in-pricelabs) · 2025-05-08 ##### Portfolio Analytics > KPIs & Historic Reports - [Portfolio Analytics: KPIs & Historic Reports](https://help.pricelabs.co/portal/en/kb/articles/portfolio-analytics-kpi) · 2026-09-17 - [Decoding Portfolio Analytics: How KPI & Historic Report Drive Smarter Decisions (A Compilation of Case Uses)](https://help.pricelabs.co/portal/en/kb/articles/how-can-i-utilize-portfolio-analytics-kpis-historic-reports-a-compilation-of-case-uses) · 2025-04-11 ##### Portfolio Analytics > Pacing Reports - [Portfolio Analytics: Pacing Reports](https://help.pricelabs.co/portal/en/kb/articles/portfolio-analytics-14-12-2023) · 2026-09-17 - [Mastering Portfolio Analytics: Using Pacing Reports to Track and Adapt (A Compilation of Case Uses)](https://help.pricelabs.co/portal/en/kb/articles/mastering-portfolio-analytics-using-pacing-reports-to-track-and-adapt) · 2025-04-11 ##### Portfolio Analytics > Owner Analytics [BETA] - [Creating Owner Analytics Dashboards](https://help.pricelabs.co/portal/en/kb/articles/creating-owner-analytics-dashboards) · 2026-03-05 - [Understanding Owner Analytics Dashboard](https://help.pricelabs.co/portal/en/kb/articles/understanding-owner-analytics-dashboard) · 2026-07-05 - [Setting Up and Managing Goals](https://help.pricelabs.co/portal/en/kb/articles/setting-up-and-managing-goals-beta) · 2026-08-02 ##### Portfolio Analytics > Report Builder - [Getting Started with Report Builder](https://help.pricelabs.co/portal/en/kb/articles/getting-started-with-report-builder) · 2026-08-27 - [How are Market Values Populated in Report Builder](https://help.pricelabs.co/portal/en/kb/articles/how-are-market-values-populated-in-report-builder) · 2026-09-17 - [Scheduling Report Emails in Report Builder](https://help.pricelabs.co/portal/en/kb/articles/scheduling-report-emails-in-report-builder) · 2026-08-27 - [A Guide to Report Builder Metrics](https://help.pricelabs.co/portal/en/kb/articles/a-complete-guide-to-report-builder-metrics) · 2026-09-16 - [Report Builder: Excel Formulas for Custom Metrics](https://help.pricelabs.co/portal/en/kb/articles/report-builder-excel-formulas-for-custom-metrics) · 2026-02-03 - [Forecasting with Report Builder](https://help.pricelabs.co/portal/en/kb/articles/forecasting-with-report-builder) · 2026-07-05 - [AI Insights in Report Builder](https://help.pricelabs.co/portal/en/kb/articles/ai-insights-in-report-builder) · 2026-04-27 ##### Portfolio Analytics > Bookings Report - [Bookings Report in Portfolio Analytics](https://help.pricelabs.co/portal/en/kb/articles/bookings-table-in-portfolio-analytics) · 2026-09-17 ##### Market Research > Market Dashboard - [Introduction to Market Dashboards](https://help.pricelabs.co/portal/en/kb/articles/introduction-to-market-dashboards) · 2026-06-09 - [Understanding the Market Dashboards](https://help.pricelabs.co/portal/en/kb/articles/market-intel-dashboard) · 2026-02-26 - [Creating a Market Dashboard](https://help.pricelabs.co/portal/en/kb/articles/creating-a-market-dashboard) · 2026-08-21 - [Understanding Comp Sets in PriceLabs: A Comprehensive Guide](https://help.pricelabs.co/portal/en/kb/articles/understanding-comp-sets-in-pricelabs-a-comprehensive-guide) · 2025-08-14 - [Market Dashboard: Use Case Guided Templates](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-use-case-guided-templates) · 2026-08-17 - [How to Create and View Custom Compsets](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-how-to-create-and-apply-custom-compsets) · 2025-10-21 - [How to Use Comp Sets for Benchmarking](https://help.pricelabs.co/portal/en/kb/articles/how-to-use-comp-sets-for-benchmarking) · 2025-10-02 - [Market Dashboards - Key Performance Indicators](https://help.pricelabs.co/portal/en/kb/articles/key-performance-indicators) · 2025-06-10 - [Market Dashboards - Listing Map and Comp Sets](https://help.pricelabs.co/portal/en/kb/articles/listing-map-compsets) · 2025-10-01 - [Market Dashboards - Market Summary](https://help.pricelabs.co/portal/en/kb/articles/market-dashboards-market-summary) · 2025-05-16 - [Market Dashboards - Price and Occupancy Trends](https://help.pricelabs.co/portal/en/kb/articles/price-occupancy-trends) · 2025-05-18 - [Market Dashboards - Length of Stay versus Booking Window](https://help.pricelabs.co/portal/en/kb/articles/los-booking-window) · 2026-02-21 - [Market Dashboards - Booking Curves](https://help.pricelabs.co/portal/en/kb/articles/market-dashboards-booking-curves) · 2025-06-25 - [Market Dashboards - Amenities](https://help.pricelabs.co/portal/en/kb/articles/amenities) · 2025-05-18 - [Market Dashboards - Policies and Fees](https://help.pricelabs.co/portal/en/kb/articles/policies-fees) · 2025-05-18 - [AI Features in Market Dashboards](https://help.pricelabs.co/portal/en/kb/articles/new-ai-features-in-market-dashboards) · 2025-05-16 - [Market Dashboard in Action: Real-Life Applications and Case Studies](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-in-action-real-life-applications-and-case-studies) · 2025-05-18 - [Market Dashboard Use Cases](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-use-cases) · 2026-06-24 - [Market Dashboard Methodology: Data Sources and Processing](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-methodology-data-sources-and-processing) · 2026-09-17 - [Market Dashboards: Glossary of Terms](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-methodology-terminology) · 2025-01-16 ##### Market Research > Revenue Estimator Pro - [Getting Started with PriceLabs’ Revenue Estimator Pro](https://help.pricelabs.co/portal/en/kb/articles/understanding-getting-started-pricelabs-revenue-estimator-pro) · 2026-08-25 - [Creating a Revenue Estimate](https://help.pricelabs.co/portal/en/kb/articles/creating-a-revenue-estimate) · 2026-04-23 - [Revenue Estimator Pro Methodology](https://help.pricelabs.co/portal/en/kb/articles/revenue-estimator-pro-methodology) · 2026-09-17 - [Add Revenue Estimator Widget to Your Website](https://help.pricelabs.co/portal/en/kb/articles/add-revenue-estimator-widget-to-your-website) · 2026-07-30 ##### Market Research > MR FAQs - [Market Dashboard vs Revenue Estimator Pro](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-vs-revenue-estimator-pro) · 2025-05-06 - [Revenue Estimator Pro FAQs](https://help.pricelabs.co/portal/en/kb/articles/rev-estimator-pro-faqs) · 2025-05-06 - [Market Dashboard FAQs](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-faqs) · 2026-08-30 ##### Listing Optimizer - [Introduction to Listing Optimizer](https://help.pricelabs.co/portal/en/kb/articles/introduction-to-listing-optimizer) · 2026-08-27 - [Understanding How We Grade Your Listing Quality](https://help.pricelabs.co/portal/en/kb/articles/understanding-how-we-grade-your-listing-quality) · 2025-12-02 - [How to Add a Listing on the Listing Optimizer](https://help.pricelabs.co/portal/en/kb/articles/how-to-add-a-listing-on-the-listing-optimizer) · 2026-08-27 - [How to Re-run a Listing](https://help.pricelabs.co/portal/en/kb/articles/how-to-re-run-a-listing) · 2026-05-21 - [How To Use Listing Optimizer Dashboard](https://help.pricelabs.co/portal/en/kb/articles/listing-optimizer-dashboard) · 2026-02-04 - [Listing Overview Page](https://help.pricelabs.co/portal/en/kb/articles/listing-overview-page) · 2026-01-07 - [Ranking Overview Page](https://help.pricelabs.co/portal/en/kb/articles/ranking-overview-page) · 2026-08-20 - [Top Performer Insights Tab](https://help.pricelabs.co/portal/en/kb/articles/competitor-overview-page) · 2026-02-09 ##### Pricing and Billing - [How to opt for a Subscription Bundle](https://help.pricelabs.co/portal/en/kb/articles/how-to-opt-for-a-subscription-bundle) · 2026-08-20 - [How much does PriceLabs cost after the trial ends?](https://help.pricelabs.co/portal/en/kb/articles/how-much-does-pricelabs-costs) · 2026-08-20 - [PriceLabs Dynamic Pricing: Billing, Subscription, and Invoices](https://help.pricelabs.co/portal/en/kb/articles/billing) · 2026-08-25 - [PriceLabs Dynamic Pricing: Percentage Billing](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-dynamic-pricing-percentage-billing) · 2026-09-20 - [PriceLabs Market Dashboard: Billing, Subscription, Cancellation, and Invoices](https://help.pricelabs.co/portal/en/kb/articles/market-dashboard-billing-and-subscription) · 2026-08-26 - [PriceLabs Revenue Estimator Pro: Billing, Subscription, Cancellation and Invoices](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-revenue-estimator-pro-billing-subscription-cancellation-and-invoices) · 2026-08-25 - [PriceLabs Revenue Estimator API and Revenue Estimator Widget: Billing, Subscription, Cancellation and Invoices](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-revenue-estimator-api-and-revenue-estimator-widget-billing-subscription-cancellation-and-invoices) · 2026-08-18 - [PriceLabs Listing Optimizer: Billing, Subscription, Cancellation and Invoices](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-listing-optimizer-billing-subscription-cancellation-and-invoices) · 2026-08-24 - [How to add a payment method and resolve payment declines](https://help.pricelabs.co/portal/en/kb/articles/adding-or-revising-credit-card-information) · 2026-07-10 - [How to add company name, billing address or tax id to the invoice?](https://help.pricelabs.co/portal/en/kb/articles/updating-billing-information) · 2026-08-26 - [Billing Sales Tax / VAT / GST (Common Questions)](https://help.pricelabs.co/portal/en/kb/articles/sales-tax) · 2026-08-31 - [Refer PriceLabs to friends and earn!](https://help.pricelabs.co/portal/en/kb/articles/your-pricelabs-referral-code) · 2025-06-30 - [How to Pause, Cancel, or Delete your PriceLabs account?](https://help.pricelabs.co/portal/en/kb/articles/pausing-your-subscription) · 2026-06-29 ##### Account > Settings - [PriceLabs MCP (AI connector)](https://help.pricelabs.co/portal/en/kb/articles/pricelabs-mcp-ai-connector) · 2026-08-18 - [Multi-Factor Authentication (MFA)](https://help.pricelabs.co/portal/en/kb/articles/multi-factor-authentication-mfa) · 2026-06-16 - [Pricing Logs: Track Price Changes in Your Listings](https://help.pricelabs.co/portal/en/kb/articles/price-evolution-logs-track-price-changes) · 2025-09-15 - [Understanding the Account Settings Page](https://help.pricelabs.co/portal/en/kb/articles/understanding-the-settings-page) · 2025-05-07 - [Changing or Updating Your Email Address, Password, and Profile settings](https://help.pricelabs.co/portal/en/kb/articles/profile-settings) · 2025-05-07 - [Scheduling When Your Listing Syncs (Timed Sync)](https://help.pricelabs.co/portal/en/kb/articles/timed-sync) · 2026-09-04 - [Giving your team access to your PriceLabs account](https://help.pricelabs.co/portal/en/kb/articles/giving-your-team-access-to-your-pricelabs-account) · 2026-08-10 - [Revenue Formula Setting](https://help.pricelabs.co/portal/en/kb/articles/revenue-formula-builder) · 2026-08-04 - [Advanced Settings](https://help.pricelabs.co/portal/en/kb/articles/dashboard-and-usability-settings) · 2026-08-06 ##### Account > FAQ & Troubleshooting - [Do I need to have a listing to create an account?](https://help.pricelabs.co/portal/en/kb/articles/do-i-need-to-have-a-listing-to-create-an-account) · 2025-05-08 - [How to download the PriceLabs desktop app?](https://help.pricelabs.co/portal/en/kb/articles/how-to-download-the-pricelabs-desktop-app) · 2025-11-10 - [Does PriceLabs have a phone application?](https://help.pricelabs.co/portal/en/kb/articles/does-pricelabs-have-a-phone-application) · 2026-07-07 ##### Account > Logs - [Account Logs: Track settings changes made in your account](https://help.pricelabs.co/portal/en/kb/articles/account-logs-track-settings-changes-made-in-your-account) · 2025-05-08 ##### Account > Other Tools - [BookingAnalyzer: Understand Booking Trends in Your Listings](https://help.pricelabs.co/portal/en/kb/articles/bookinganalyzer) · 2025-05-08 --- # Agoda Partner Portal (YCS) — cẩm nang điều khiển URL: https://harthliving-ota.pages.dev/library/tech/agoda-ycs-automation/ [Tổng quan](https://harthliving-ota.pages.dev/) › [Dữ liệu & báo cáo](https://harthliving-ota.pages.dev/library/) › [Tài liệu kỹ thuật](https://harthliving-ota.pages.dev/library/tech/) # Agoda Partner Portal (YCS) — cẩm nang điều khiển ## Agoda Partner Portal (YCS) — cẩm nang điều khiển Nguồn: `platforms/agoda-ycs-automation.md` ### Agoda Partner Portal (YCS) — cẩm nang điều khiển Đúc từ phiên **05/09/2026**: tạo 18 mẫu tin + bật Message scheduler cho 6 listing. Đây là tài liệu **thao tác** (điều hướng, DOM, bẫy tự động hoá). Luật nội dung tin nhắn ở [`vault/10-rules/ota-messaging-rules.md`](https://harthliving-ota.pages.dev/guide/chung/ota-messaging-rules/) §4. Luật set up listing ở [`agoda-listing-playbook.md`](https://harthliving-ota.pages.dev/guide/agoda/agoda-listing-playbook/). Kho tin nguồn ở [`vault/16-ota-messages/agoda/`]. ⚠️ **Mặc định Agoda là CHỈ ĐỌC** — [`vault/10-rules/ota-readonly-rule.md`](https://harthliving-ota.pages.dev/library/tech/ota-readonly-rule/). Ba script ghi bên dưới là **ngoại lệ có chủ đích**, chỉ chạy khi user ra lệnh trực tiếp cho đúng việc đó. #### 1. Điều hướng — URL là đường nhanh nhất | Cần tới | Cách | |---|---| | Hộp thư khách của một property | `https://portal.agoda.com/mldc/en-us/app/hermes/inbox/ycs/` | | Đổi property | **Đổi thẳng `` trên URL** — không cần bấm menu chọn căn ở thanh trên | | Message scheduler | Trong hộp thư → `Automation tools` → `Scheduled messages` | | Auto reply | `Automation tools` → `Auto reply` (**khác** Scheduled messages, chưa khảo sát) | | Template replies | Panel cố định bên **phải** hộp thư, có nút `Create new` | Breadcrumb khi vào scheduler: `Guest messages > Message preference`, hai tab `Auto reply` | `Message scheduler`. **Sáu Agoda ID** (đối chiếu [`../listings.md`](https://harthliving-ota.pages.dev/properties/)): `84463574` 181 Tô Hiến Thành · `84463562` 15 Nước Mặn 5 · `84463560` 41 Lê Hy Cát · `63382515` A La Carte 305 · `84510952` A La Carte 404 · `84463577` A La Carte 502. `25anthuong11` **không có** listing Agoda. #### 2. Template replies — mẫu tin 🔴 **Mẫu tin thuộc về TỪNG Hotel ID.** Không dùng chung giữa các property. Cùng một nội dung vẫn phải tạo lại ở mỗi listing → 6 listing × 3 mốc = **18 mẫu**. Tên trùng nhau giữa các căn là cố ý. **Giới hạn:** ô `Name` 100 ký tự · ô `Message` 2.500 ký tự. DOM **không** đặt `maxlength`, nên phải tự đếm. ##### Quy ước đặt tên (user chốt 05/09/2026) | Mẫu | Tên | Vì sao | |---|---|---| | Xác nhận đặt phòng | `01 Booking confirmed` | nội dung giống hệt mọi căn → **không gắn tên căn** | | Nhận phòng | `03 Check-in - ` | địa chỉ, mã khoá, Wi-Fi khác nhau → riêng từng căn | | Trả phòng | `05 Check-out - villa` **hoặc** `05 Check-out - A La Carte` | **chỉ hai bản**, chia theo giờ trả phòng và cách khoá cửa | Số `01`/`03`/`05` khớp tên file trong `vault/16-ota-messages/agoda/`, tra ngược được. Tên viết **không dấu**. ##### DOM của form mẫu tin | Thứ | Selector | Ghi chú | |---|---|---| | Ô tiêu đề | `input[name="Name"]` **hoặc** `input[placeholder*="title of your template"]` | 🔴 **Có property không có attribute `name`** — phải bắt kèm placeholder | | Ô nội dung | `textarea[name="Message"]` | ổn định hơn | | Nút khi **TẠO** | `Save` / `Discard` | | | Nút khi **SỬA** | `Update` / `Cancel changes` | 🔴 tên khác hẳn — dùng nhầm là không tìm thấy nút | | `Update` bị `disabled` | tới khi React ghi nhận thay đổi | phải **poll vài nhịp**, đừng bấm một lần rồi bỏ | #### 3. Message scheduler — ba mốc gửi Ba hàng, mỗi hàng một công tắc + accordion riêng. **Bấm `Save` của chính hàng đó mới lưu.** | Mốc | Ô `Select a time` | Lựa chọn | |---|---|---| | `Upon booking confirmation` | **không có** | gửi ngay khi đặt phòng được xác nhận | | `At check-in` | *"Select a time before guest check-in"* | `On the day of check-in` · `1 day before` · `2 days before` · `3 days before` | | `At check-out` | *"Select a time after guest check-out"* | `On the day of check-out` · `1 day after` · `2 days after` · `3 days after` | 🔴 **Hai mốc lệch NGƯỢC CHIỀU.** Check-in đếm lùi trước ngày đến, check-out đếm tiến sau ngày đi → **không có cách nào gửi tin trước ngày trả phòng** trên Agoda. Bản Booking gửi tin trả phòng tối hôm trước; bê nguyên mốc đó sang Agoda là chọn nhầm. **Cấu hình đang dùng:** booking = ngay khi xác nhận · check-in = `1 day before check-in` · check-out = `On the day of check-out`. **Mỗi mốc chỉ gắn được MỘT mẫu tin** → phải chọn: `At check-out` dùng cho tin dặn trả phòng **hoặc** tin cảm ơn sau kỳ nghỉ (`1 day after check-out`), không thể cả hai. #### 4. Bẫy tự động hoá qua CDP — đã trả giá Nối Chrome đang đăng nhập qua CDP: xem `scripts/ota-read-booking.mjs` để lấy mẫu kết nối (đọc `DevToolsActivePort`, nối WebSocket, **không gọi `Page.enable`** — treo phiên trên portal OTA). | # | Bẫy | Cách đúng | |---|---|---| | 1 | Nút là `SPAN`/`DIV` chứ không phải `BUTTON` → `.click()` trong `Runtime.evaluate` **vô hiệu** | Dùng `Input.dispatchMouseEvent` theo toạ độ `getBoundingClientRect()` | | 2 | Thiếu `mouseMoved` trước `mousePressed` → **React không nhận click** | Luôn bắn `mouseMoved` → `mousePressed` → `mouseReleased` | | 3 | `input#toggle` là checkbox **ẩn, kích thước 0** → bấm không ăn | Bấm phần tử `[role=switch]` hiển thị; lấy cả 3 theo thứ tự DOM: `0` booking · `1` check-in · `2` check-out | | 4 | Gán `el.value = x` thẳng → React không thấy, `Save` gửi chuỗi rỗng | Native setter: `Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value').set.call(el,v)` rồi `dispatchEvent(new Event('input',{bubbles:true}))` | | 5 | Đếm nút `Edit` theo chỉ số **toàn trang** → bấm nhầm | Trang có **6 nút tên `Edit`**: 3 của scheduler + 3 của panel Template replies. Tệ hơn: **hàng đang bung ra thì mất nút `Edit` của chính nó**, nên số nút tụt 3→2 và mọi chỉ số lệch. Phải giới hạn tìm kiếm **trong panel scheduler** trước khi đếm | | 6 | Nút dropdown ở chế độ sửa hiện **giá trị đang chọn**, không phải chữ `Select …` | Regex phải nhận cả hai: `/^(Select template\\|0[135] )/i` | | 7 | 🔴 **`--set-method` và `--set-instructions` dùng CHUNG endpoint `ArrivalGuide/instructions`**, mỗi cái ghi `null`/`0` vào trường của cái kia (dính 23/09/2026 ở `15nuocman5`) | Chạy **`--set-method` TRƯỚC**, rồi `--set-instructions` (nó đọc method hiện tại và giữ). Kiểm giữa chừng bằng `--dry`: body phải có `"checkInMethod":5` | | 8 | 🔴 **GET của Agoda bị CACHE.** Ghi mô tả xong đọc lại vẫn ra bản cũ → tưởng ghi hỏng, suýt ghi lại lần hai | Đọc xác minh bằng `fetch(url+'?_='+Date.now(),{cache:'no-store'})`. Đừng kết luận "ghi không ăn" từ một lần GET thường | | 9 | `--set-facilities` nhận **MẢNG PHẲNG** `[{facilityId,isSelected,name,from}]` | Bọc `{"facilities":[…]}` là `plan.map is not a function` | | 10 | Điểm **ảnh phòng ngủ / phòng tắm** không đến từ nhóm Property | Đến từ nhóm **ROOM** (`categoryId 7` + `roomTypeId`). Khuôn 100/100 của `41lehycat`: Property 15 ảnh · Room 16 ảnh với **Bedroom 6–7 + Bathroom 4–5** | | 7 | **Dải cảnh báo chống lừa đảo của Agoda phủ lên nút `Edit` của Template replies** → bấm theo toạ độ rơi vào banner, form không mở (gặp ở 502, 21/09/2026; 305 và 404 cùng lúc đó lại không dính) | Nút này là `BUTTON` **thật** nên `.click()` trong `Runtime.evaluate` ăn. Ưu tiên DOM `.click()`, chỉ rơi về chuột CDP khi DOM không mở được form. Kiểm bằng `document.elementFromPoint(cx,cy)`: trả về `DIV` lạ ⇒ đang bị che | | 8 | **Nút `Edit` của hàng scheduler là `DIV`**, không phải `BUTTON`/`SPAN`/`A` → mọi selector `querySelectorAll('button,span,a')` **bỏ sót hoàn toàn**, báo "không thấy Edit". Ngược với #7, `DIV` này `.click()` **không** ăn | Quét bằng `querySelectorAll('*')` lọc `innerText.trim()==='Edit'`, chọn phần tử **cùng dòng** với nhãn hàng (`\\|y − y_nhãn\\| < 30`) rồi bấm bằng **chuột CDP**. Phân biệt hai bộ bằng toạ độ x: scheduler ở panel trái **x≈1481**, Template replies ở panel phải **x≈1785** | **Chưa thông:** *ghi* vào một hàng scheduler **đã cấu hình**. Công tắc đã bật thì bấm lại **không tắt được**, và đường qua `Edit` vướng bẫy #5. Hàng **chưa** cấu hình thì chạy ngon (15/15 mốc ở 5 listing). → Muốn sửa hàng đã cấu hình: **làm tay**, hoặc viết lại phần tìm `Edit` giới hạn trong panel scheduler. 🟢 **ĐỌC hàng đã cấu hình thì thông rồi (21/09/2026).** Bấm `Edit` của hàng (theo bẫy #8) là khung `Message preview` bên phải hiện **tên mẫu đang gắn + toàn văn thân tin**. Đây là cách rẻ nhất để xác minh một mốc đang gắn đúng mẫu nào — không phải mở form ghi, không chạm `Save`. ⚠️ `scripts/ota-agoda-scheduler.mjs --probe` hiện **báo "không thấy mục Scheduled messages"**: Agoda đã đổi nhãn tab thành **`Message scheduler`**, script vẫn tìm chữ cũ. Chưa sửa. #### 5. Sự thật đã xác minh về hiển thị và nội dung 🟢 **Agoda GIỮ dấu xuống dòng trong mẫu tin.** Đọc ngược `textarea` từ portal thấy đúng ký tự `\n`; panel Template replies hiện rõ từng khối tách dòng. Format emoji + dòng trắng **hiện đúng**. ⚠️ **Khung `Message preview` bên phải nuốt ngắt dòng thị giác** — chữ chạy liền một mạch. Đó là CSS của khung preview, **không phải** tin thật. Đừng kết luận format hỏng từ khung này. 🔴 **Agoda che dữ liệu**: số thẻ · số điện thoại · email · **URL** → thay bằng `X`. Kakao ID / Zalo dạng chữ **có thể lọt lưới** — nhưng lọt là dính luật chống off-platform, xem `ota-messaging-rules.md` §4. Agoda dán sẵn câu mời khách tố cáo về `safety@agoda.com` trong mọi cuộc trò chuyện. 🔴 **KHÔNG có placeholder.** Không chèn được tên khách, không chèn được ngày → mẫu tự động là **chữ chết**. Cách né đang dùng: bỏ hết tên và ngày, thay bằng **mốc tương đối** mà chính scheduler bảo đảm (`tomorrow` cho tin check-in gửi trước 1 ngày, `today` cho tin check-out). 🟢 **Agoda tự dịch tin sang ngôn ngữ khách khi gửi** → không cần làm bản tiếng Hàn. ⚠️ Nhưng máy dịch chạy qua **cả địa chỉ tiếng Việt, tên Wi-Fi và tên thương hiệu** — `Harth Living` có chữ `Living` là từ có nghĩa, dễ bị dịch thành nghĩa đen. **Chưa test.** 🟢 **Scheduler đọc thân mẫu SỐNG, không phải bản chụp lúc gán** (xác minh 21/09/2026 trên 305). Sửa nội dung một mẫu trong `Template replies` là tin tự động của mốc đang gắn mẫu đó **đổi theo ngay** — không phải gỡ ra gắn lại. Bằng chứng: sau khi ghi đè `01 Booking confirmed`, mở hàng `Upon booking confirmation` thì khung `Message preview` hiện đúng câu vừa thêm. → Hệ quả: **đổi câu chữ chỉ cần chạy `ota-write-agoda-templates.mjs --update`**, không đụng scheduler. ⏱️ **Cửa sổ 14 ngày:** không liên hệ được khách sau 14 ngày kể từ ngày trả phòng. #### 6. Ba script | Script | Việc | Chạy | |---|---|---| | [`scripts/ota-write-agoda-templates.mjs`] | tạo / đổi tên / **ghi đè thân tin** mẫu, đọc nội dung từ khối text` trong `vault/16-ota-messages/agoda/*.md` | `--dry` · `--only ` · `--rename` · **`--update`** (sửa mẫu đã có cho khớp vault; so trước khi ghi, mẫu nào đã khớp thì bỏ qua; ghi xong **mở lại form đọc lại** rồi mới báo xong) | | [`scripts/ota-agoda-scheduler.mjs`] | bật 3 mốc + gắn mẫu | `--probe` (không lưu) · `--only ` · `--force` | | [`scripts/ota-agoda-photos.mjs`] | ảnh: đọc · tải gốc · upload · đặt ảnh chính · **chuyển nhóm Property⇄Room** · gán tag (thêm 16/09/2026, xem §8) | `--id ` + `--read` · `--download

` (chỉ đọc) · `--upload plan.json` · `--set-main` · `--reassign … --to room\\|property` · `--tag`, mọi lệnh ghi có `--dry` | **Cả hai cần quyền Bash.** Agent không tự cấp được — đưa dòng này cho user dán vào `/permissions`: `Bash(node scripts/ota-agoda-scheduler.mjs:*) ` 🔴 **Rule không khớp vòng `for` của shell.** `for id in …; do node …; done` bị chặn dù rule đã có. Phải gọi **từng lệnh `node` trần một**, mỗi listing một lượt. **Nội dung tin không gõ trong script** — luôn đọc từ vault, để vault và portal không trôi khỏi nhau. #### 7. Còn chưa biết - `Auto reply` hoạt động ra sao (khác `Scheduled messages`) — chưa mở. - ~~Mã `missingPhotoGroup` chưa giải nghĩa~~ → **đã giải 26/09/2026**, xem bảng nhóm ảnh ở §10. - Agoda bắn tin `At check-out` vào **giờ nào** trong ngày → ảnh hưởng câu mở đầu `Today, before 11:00 AM.` - Máy dịch xử lý địa chỉ tiếng Việt, tên Wi-Fi, tên thương hiệu ra sao. - Bộ lọc có bắt nhầm mã cửa 8 số (`[đã che]`) hay mật khẩu Wi-Fi toàn số thành số điện thoại không. - Hồ sơ YCS đã khai số điện thoại chỗ nghỉ chưa — quyết định câu *"call the property number shown on your booking confirmation"* có đúng không. #### 8. Photos 2.0 — ảnh property và ảnh phòng (thêm 16/09/2026) Trang `portal.agoda.com/en-us/app/setting/photos/`. Toàn bộ API đọc từ bundle `PhotosPage.*.js` + `api.*.js` (theo read-wizard-copy-from-bundle-not-clicks), **không cần bấm nút nào**: | Việc | Gọi gì | Ghi chú | |---|---|---| | Đọc toàn bộ ảnh | `GET /en-us/api/setting//Photos/GetAllPhotos` | mảng nhóm: `categoryId 5` = Property (`roomTypeId 0`) · `7` = Room (`roomTypeId` thật). Mỗi ảnh: `photoId` · `photoToken` · `pictureTypeId` (**6 = ảnh chính**, 5 = property, 7 = room) · `pictureCaptionId` (0 = chưa tag) · `order` | | Bảng tag | `GET …/Photos/GetPhotoCaptions` | 97 tag; hay dùng: 13 Exterior view · 19 Lobby · 23 Reception · 9 Entrance · 21 Swimming pool · 25 Restaurant · 5 Buffet · 22 Bar/lounge · 8 Coffee shop · 11 Fitness center · 27 Spa · 121 Massage · 125 Sauna · 154 Bedroom · 3 Bathroom · 139 Separate living room · 102 Kitchen · 1 Balcony/terrace | | Upload | `POST …/Photos/UploadPhoto` multipart `CategoryId` · `RoomTypeId` · `CaptionId` · `Order` · `FormFile` | trả `{photoId, photoToken, recStatus}` — `recStatus 1` = lên ngay, khác 1 = chờ duyệt. **Gán `CaptionId` ngay lúc upload** thì không dính "Missing tags" | | Tag · đặt ảnh chính · **chuyển nhóm** | `POST …/Photos/UpdatePhotos` `{updatePhotoInfoList:[{photoId, photoToken, roomTypeId, imageType, captionId, order}]}` | cùng một endpoint: đổi `captionId` = tag · `imageType 6, order 1` = ảnh chính (ảnh chính cũ phải hạ về `5`) · đổi `imageType 5↔7` + `roomTypeId` = **chuyển Property⇄Room không cần tải lại** (giữ nguyên gốc) | | Ảnh gốc | lấy `uri` từ API, thay `s=x` bằng `width×height` API trả | **giữ nguyên `ce=`** (ảnh mới `ce=3`; ép `ce=0` → CDN trả 1×1); không có `s=` chỉ được 2048px. **Agoda ép cạnh dài ảnh upload về 2048px** — bộ 6016px của 2024 là đường upload cũ | **Bẫy đã gặp:** - Ảnh chính (`pictureTypeId 6`) **không chuyển nhóm / không xoá được** khi đang là ảnh chính → đặt ảnh chính mới trước (`--set-main`), rồi mới `--reassign`. - Sau mỗi `UpdatePhotos`, server **đánh số lại `order` của cả nhóm Room (1→24)** theo thứ tự riêng của Agoda — `order` trên YCS không phải thứ tự mình đặt, đừng dùng nó làm khoá; dùng `photoId`. - Header chỉ có chuẩn + `Request-Id`/`traceparent`, **không có CSRF** → `fetch()` cùng origin trong tab là đủ; upload đi qua `DOM.setFileInputFiles` vào `` tạm do script tạo (không đụng input của app). - 🔴 **Upload trả 409 "duplicate"** khi file định upload trùng md5 với ảnh **đang có** trên listing (41LHC 17/09: 70 ảnh cũ chính là file vault) → re-encode (thumbnail 2048 + save lại) trước khi upload, rồi mới xoá bản cũ. - 🔴 **Mã ảnh trên CDN = md5 của file upload, và bản ghi khoá theo md5:** tải lại đúng file đã xoá thì Agoda trả **cùng `photoId` cũ** và ảnh **sống lại** trong danh sách (đã trả giá 16/09: agent tải lại `restaurant-01` để dò lỗi, làm sống lại tấm user vừa xoá tay). **Thấy ảnh biến mất → hỏi user trước**, đừng tải lại để thử. - Sau upload, CDN trả ảnh **1×1** và API trả `0x0` trong ít nhất 30 phút — không phải lỗi, là xử lý bất đồng bộ. - **Trang khách (agoda.com) trễ theo:** ngay sau khi đổi ảnh (upload · reassign · tag hàng loạt), card tìm kiếm + gallery trang chi tiết **rút xuống chỉ còn 1–2 ảnh** (`contentImages.hotelImages`), trong khi listing khác vẫn 10. Đo 16/09: 2 ảnh lúc 16:45 → đủ **10 ảnh** (trần của card) lúc 17:10, tức ~30 phút sau lần `UpdatePhotos` cuối. **Đừng kết luận mất ảnh từ trang khách trong vòng 1 giờ sau khi sửa.** Trang chi tiết còn tự chèn 4 ảnh "Nearby attraction" (`providerId 999979`) không phải của mình. - 🔴 **`GET …/Facilities/` bị cache trong tab**: PUT xong đọc lại ngay bằng `fetch()` mặc định vẫn thấy giá trị cũ (16/09 tưởng lưu hỏng). Luôn `fetch(url,{cache:'no-store'})` hoặc thêm `?_=Date.now()` khi đọc lại sau khi ghi. - `photoToken` là handle của từng ảnh — **không lưu vào vault** (luật §9), script `--read` lấy lại được. **Tiêu chí ảnh lên trang khách (đo 16/09/2026 trên 305 + đối chứng 502, 41 LHC):** - Gallery trang chi tiết (`contentImages.hotelImages`) = **toàn bộ Property photos** (305: 11/11) + **chỉ 2 Room photos** (305: 2/24 · 502: 2/24 — cùng mẫu) + 4 ảnh "Nearby attraction" Agoda tự chèn. 22 ảnh phòng còn lại **không** vào gallery — chỉ hiện trong card phòng khi ngày tìm còn phòng (chưa xem được vì hai ngày thử đều Sold out). - **Card tìm kiếm = 10 ảnh đầu của gallery** (trần 10, mọi listing đều 10). - Thứ tự: **ảnh chính property (`pictureTypeId 6`) luôn đứng #1**; từ #2 trở đi **không theo `order` trên YCS** mà theo "AI smart ordering" của Agoda (305: hồ bơi → DELI → spa → nhà hàng → buffet → bar → hồ bơi → gym → massage → hồ bơi bình minh — xen kẽ nhóm Facilities/Dining, đẩy gym/massage xuống cuối). Kéo-thả trên YCS chỉ đổi `order`, chưa thấy tác dụng lên trang khách. - 502 có **4 ảnh trên card không tồn tại trong YCS** → là ảnh Agoda nhập từ Booking.com (đúng như chân trang YCS nói). 305 không có ảnh nhập kiểu này. - Muốn một tấm lên card: **đặt vào Property photos + gắn tag**; muốn nó đứng đầu: **đặt làm Main photo**; vị trí 2–10 không điều khiển được. Lần đầu áp dụng: `alacarte305` 16/09/2026 — hồ sơ [`../properties/alacarte305/agoda.md`](https://harthliving-ota.pages.dev/status/agoda/alacarte305/#doc-agoda), sổ việc `L-101`. Lần hai: `alacarte502` 17/09/2026 — [`../properties/alacarte502/agoda.md`](https://harthliving-ota.pages.dev/status/agoda/alacarte502/#doc-agoda): 30 ảnh (17 Property + 13 Room) tag ngay lúc upload, 3 bản sao nội thất re-encode 2048px cho md5 khác bản Room, xoá 37 ảnh cũ bằng `--delete`. #### 9. Content score (Homes) · Arrival guide · Host profile (thêm 16/09/2026) Script: [`scripts/ota-agoda-content.mjs`] — `--score` · `--read` (chỉ đọc) · `--set-times` · `--set-method` · `--set-bio` (ghi, có `--dry`). ⚠️ Mục này là rubric **Homes**; property ở chế độ khách sạn (xem §10) chấm 11 mục khác. Luật chấm điểm chính thức: [`agoda-homes-content-score-guideline-2025.pdf`](https://harthliving-ota.pages.dev/guide/agoda/agoda-homes-content-score-guideline-2025/) (Photos 30 · Arrival guide 30 · Amenities 15 · Host 15 · Description 10; điểm refresh ≤24 h). | Việc | API | Ghi chú | |---|---|---| | Điểm từng mục | `GET /mldc/en-us/api/reporting/AnalyticsCenter/ContentScoreDetails/` | 18 mục, `isImproveNeeded` + `improvements[]` (gợi ý chung, không phải tiện ích đã tick) | | Arrival guide đọc | `GET /en-us/api/setting/ArrivalGuide/` | `checkInCheckoutTime` · `checkInDetails` · `directions` · `parking` · `houseRules` | | Giờ nhận/trả | `POST …/ArrivalGuide/checkincheckouttime/` body = khối `checkInCheckoutTime` | giờ dạng `"2:00 PM"`; `null` hiện là "Flexible" trên UI **nhưng không được tính điểm** | | Cách nhận phòng | `POST …/ArrivalGuide/instructions/` body = khối `checkInDetails` | `checkInMethod` 1 Reception · **2 Meet and greet** · 3 Key self-collection · 4 Lockbox · 5 Door code · 6 Secret key · 7 Email · 8 Other | | Host profile | `GET /mldc/en-us/api/iam/HostProfile/ViewModel` · `POST …/HostProfile/SaveHostProfile` | **cấp tài khoản** (chung 6 listing); bio 20–500 ký tự, score đòi ≥100 | | Mô tả property | `POST /en-us/api/setting/PropertyDetails/UpdatePropertyDescription/` `{description}` | client chặn URL (`/(https?:\/\/[^\s]+)/`); lưu là lên ngay, không qua duyệt (đọc lại `GeneralInformation` thấy ngay) | | Facilities | `GET/PUT /mldc/en-us/api/setting/Facilities/` — PUT `{facilities:[{facilityId,isSelected}]}` chỉ gửi dòng thay đổi | 88 mục / 8 nhóm; `isSelected` null = chưa khai · false = đã khai không | | Giường | `POST /en-us/api/setting/RoomSettings/BedConfigurations//` `{bedroomConfigurations:[{productBedTypeId,numberOfBed,bedroomGroupNumber,optionId:1,productBedTypeLocalName:null}],commonRoomConfigurations:[]}` | bedType 1 Single · 3 Double · 4 Queen · 5 King · 8 Sofa; trả `true` | | House rules · parking · directions | `POST …/ArrivalGuide/houserules|parking|directions/` body = đúng khối trong GET | airport transfer: `isOffered=true` **bắt buộc có `feeValue`** (0 = miễn phí); server HTML-encode dấu `'` thành `'` trong parkingInstruction | | **Occupancy phòng** | `GET /en-us/api/setting/ChildRate/getroombypropertyId/` · `POST …/ChildRate/setuproomoccupancy/` `{setAdultChild:true, rooms:[{roomTypeId, adultSettings:[{baseOccupancy, guestAllowed, maxAdult, maxChildren}], extraBedSettings:[{numberOfExtraBed, numberOfBabyCot}]}]}` | 🔴 **Toàn `null` = Agoda bán mặc định 2 người lớn** dù Rooms khai max 4 (305 mất mọi khách 3–4 người tới 16/09). Sau POST, rate plan tự sinh `occupancyRate {1..n}` cùng giá; trang UI `childrenrateocc` lỗi với property Homes, chỉ API chạy; GET đọc lại vẫn null một lúc — tin response POST + `GetRate.occupancyRate` | | Mô tả trên trang khách | `contentDetail.contentInformation.description.short` (GraphQL agoda.com) | **Agoda tự sinh "About us" từ dữ liệu tiện ích**, không đăng mô tả partner (đo 16/09 trước và sau khi đổi mô tả). Mô tả partner chỉ còn ý nghĩa cho Content Score / app; sai tiện ích (vd Free parking) sẽ lộ ngay ở đoạn tự sinh | | Booking settings | `GET /en-us/api/supply-pricing-metadata/BookingSettings/GetViewModel/` · `POST …/UpdateBookingSettings/` body = `{bookTypeId:{isDirty,value,oldValue}, cancellationPolicyId:{…}, ratePlanSetting:{isDirty,value:[{ratePlanId,maxAdvPurchase,minAdvPurchase,minNightsStay,maxNightsStay}],oldValue:[…]}, dateBasedStayConditions:{…}}` | -1 = No limit / không giới hạn; **không bọc `bookingSettingUpdateModel`** (400 "RatePlanSetting field is required") | | Local recommendations | `GET/POST …/ArrivalGuide/thingsnearby/` `{thingsNearby}` | | | **Room spec (diện tích · số WC)** | `POST /en-us/api/setting/RoomSettings/RoomSpecifications//` body = `{maxOccupancy:{isDirty,value,oldValue}, isChildrenAllowed:{…}, maxAllowedFreeChildren:{…}, noOfBathroom:{…}, sizeOfRoom:{…}, externalRoomTypeCode:{…}}` (cùng mẫu dirty của BookingSettings; đọc từ bundle `RoomSetupBasicDetailsPage` + `useSaveRoomSpecifications` 17/09) | `--set-room-spec ":size=50,bathrooms=1"`; trả `true`; GET đọc lại thấy ngay | | Địa chỉ ngôn ngữ khác | trong `PUT PropertyLocation`: `localizedStreetAddresses:[{productAddressId:0, languageId, streetName}]` | ALL_LANGUAGE: 24 = Tiếng Việt; server trả về kèm `productAddressId` thật | - 🔴 **Nhãn trên trang khách lấy từ taxonomy KHÁCH SẠN, cùng id với toggle Homes:** `Keyless access` (272) hiện thành **"Check-in [24-hour]"**; `Gym` (57) hiện **"Fitness center — Free"** (không có cờ paid — `FacilityProperties: []`). Bật toggle Homes là chấp nhận nhãn khách sạn tương ứng. Đối chiếu id ở `kipp …/usefulinformation` → `propertyFacilitiesApi/GetViewModel`. - 🔴 **Ô bio Host profile là React controlled — native setter + dispatch `input` KHÔNG ăn** (ô về 0/500 ngay). Phải `Input.insertText` qua CDP sau khi `focus()` (gõ như người). Bảng `SET_VAL` ở §4 chỉ đúng với form Template replies. | Đổi tên listing | `POST …/PropertyDetails/UpdatePropertyName/` `{propertyName, propertyLocalName}` | lưu ngay, `propertyLanguageName` tự bằng tên mới; luật đặt tên Agoda cấm ngoặc/khuyến mãi — user tự chịu | | Check-in instructions | `POST …/ArrivalGuide/instructions/` body = khối `checkInDetails` (giữ `checkInMethod`) | ≥25 ký tự; **Directions không hiện cho khách**, muốn khách đọc điều kiện thì viết vào instructions/tên | - 🔴 **Airport transfer trên Homes chỉ có 3 ô Có/Phí/Phút, không có ô điều kiện** → bật là Agoda tự viết "Free airport transfer" + FAQ "Yes" + đoạn AI cho MỌI booking. Điều kiện phải gài ở tên listing + check-in instructions + mẫu tin (305, 16/09). **Luật chấm cần nhớ (đọc lại PDF 17/09):** *Check-out Time: Specify the check-out **from and** check-out until time or indicate if it is flexible* → chỉ khai `checkOutUntil` là **0/4** (305 vẫn 0/4 sau khi 91/100). 502 khai cả `checkOutFrom = 6:00 AM` + `checkOutUntil = 12:00 PM` (user chốt 17/09) — chờ refresh để xác nhận. Ảnh bedroom/bathroom **ở nhóm Room vẫn được tính** (305 lên 4/4 + 4/4 chỉ với tag ở Room). **Bẫy 17/09 (502):** `PUT Facilities` trả 200 nhưng GET `no-store` ngay sau vẫn **null cả 88** — PUT lại lần hai → 88/88 khớp. Chưa rõ do xử lý bất đồng bộ hay lần đầu không ăn; **luôn đọc lại và so từng dòng với plan trước khi báo xong**. **Lặp lại ở 404 (23:10): lần 1 chỉ 59/88 ăn** (29 dòng nhóm Guest favorites còn null), PUT lại → 88/88. Coi như quy tắc: **PUT hai lần, đọc lại giữa hai lần**. Cùng ngày: `setuproomoccupancy` **đặt `maxAllowedFreeChildren` về 0** (305 16/09, 404 17/09) → muốn giữ 1 phải chạy `--set-room-spec ":children_free=1"` SAU occupancy. Cùng ngày: 502 đang **Non-refundable (13308)** chứ không phải 949 như 305 — đừng suy chính sách từ căn này sang căn khác, đọc `GetViewModel` trước khi hỏi user. **Mục "Add more photos of your property facilities" (2 điểm, 18/09):** Agoda dò **từng tiện ích đã tick Yes** xem có ảnh gắn đúng caption tag hay chưa và liệt kê tên tiện ích thiếu trong `improvements[]` (41LHC: *Bathtub · Dryer*; 181: *Dryer*). Tag `Bathroom` (3) KHÔNG đếm cho Bathtub — phải là `Bathtub` (136); ảnh máy giặt tag `Washing machine` (144) không đếm cho Dryer — cần thêm ảnh tag `Clothes dryer` (137) dù máy sấy xếp ngay trên máy giặt trong cùng khung. Cách vá rẻ nhất: đổi tag bản Property của ảnh WC có bồn (nhóm Room vẫn giữ đủ Bathroom = số WC) và upload thêm một bản ảnh giặt là re-encode (md5 khác, tránh 409) tag 137. Bảng tag đầy đủ: `GET …/Photos/GetPhotoCaptions` (Private pool 138 · Sauna 125 · Swimming pool 21 · Garden 38 · Fitness center 11 · Hot tub 17 · Parking lot 166). **Bẫy đã trả giá 16/09:** - 🔴 **SaveHostProfile đòi số điện thoại đã xác minh OTP** — handler Submit của form kiểm `phoneVerified && phoneNumber` trước khi gửi; gọi API thẳng khi chưa có SĐT → **500 "Failed to save host profile"**. Agent không xác minh OTP được → **user làm tay** (Host profile → Edit → Phone → Verify). - `photoUrlString` phải rỗng/`null` hoặc `/avatar/<64hex>_<32hex>.jpg` — gửi lại URL `pix6.agoda.net` cũ là **400 regex**; form gốc gửi `null` khi không đổi ảnh. - `userProfileType` chỉ nhận `1` (Individual) / `2` (Company) / `null`. #### 10. Property ở chế độ YCS KHÁCH SẠN (không phải Homes) — thêm 19/09/2026 **Nhận biết:** `GET /mldc/en-us/api/layout//PrivateLayout/Main` → `MenuViewModel.IsNonHotelAccommodation = false` (Homes = true). Dấu hiệu trên UI: star rating có giá trị (5) · menu *Rate plans · Room mapping · Cancellation policies · Children Rate and Occupancy* · trang Facilities hiện **440 mục / 16 nhóm** (Guest favorites 15 · Things to do 47 · Dining 60 · … · Languages 44 · Payment 63) thay vì 88 toggle / 8 nhóm · không có Host profile card. `isNhaEnabled` trong GeneralInformation và `isNhaProperty` trong ArrivalGuide **vẫn true** — không tin hai cờ đó. Lần đầu gặp: `25anthuong11` `96450982`, sinh ra từ *List my property → Fast-track import* (URL Booking) 18/09/2026 — wizard không có bước chọn Hotel/Homes; 5 căn tạo trước đó đều là Homes. Không có toggle/API đổi loại hình → xin support (`L-120`). **Rubric content score bản khách sạn = 11 mục** (CMS id đọc từ bundle `ContentScorePage.*.js`, chữ lấy bằng `POST /mldc/en-us/api/reporting/Cms/MultiGet` body `{languageCode:'en-us',origin:'VN',ids:[…]}`): | CMS | Mục | Trang sửa | |---|---|---| | 522393 · 522394 | Add more photos of your property · high-resolution | Photos (API Photos 2.0 như §8 — dùng chung cả hai chế độ) | | 522395 | Add more photos of your property **facilities** | Photos — tag khớp facility đã Yes (Parking lot 166 ↔ Car park · Kitchen 102 · Washing machine 144) | | 522396 · 522397 · 522398 | photos of your rooms · high-res · photos of your **room amenities** | Photos nhóm Room (Bedroom 154 · Bathroom 3 · Balcony 1 · Kitchen 102) | | 522399 · 522400 | essential / additional **property facilities and services** | `/en-us/kipp/app/settings/propertysetting/propertyservices/` — API vẫn là `GET/PUT /mldc/…/Facilities/` (440 dòng, PUT `{facilities:[{facilityId,isSelected}]}`) | | 522401 | Add **room amenities** | Rooms (kipp) → `POST /en-us//kipp/api/roomtype/UpdateRoomType` | | 522402 | Update your **star rating** | chỉ qua chat Agoda (`#chat`) — import đã gán 5 | | 522403 | guest **age policy** | `/en-us/app/setting/childrenrateocc/` — 4 POST `ChildRate/setup*` | **Nhóm ảnh `missingPhotoGroup` — giải 26/09/2026 từ bảng `ks` trong bundle `es.*.js` của trang Photos** (không bấm thử; kiểm chứng bằng chính API: gắn tag xong, số nhóm tụt ngay trong `GetAllPhotos`): | Nhóm | Caption id thuộc nhóm | Nghĩa | Mục content score dò nó | |---|---|---|---| | 1 | 8 Coffee shop · 25 Restaurant · 165 Restaurant (private room) | Nhà hàng | 522395 (nếu tick tiện ích nhóm Dining) | | 2 | 5 Buffet · 104 Food and beverages | Ăn uống | 522395 | | 3 | 21 Swimming pool · 122 Pool [outdoor] · 138 Private pool | Hồ bơi | 522395 | | 4 | 27 Spa · 32 Beauty salon · 119 Hot spring bath · 121 Massage · 125 Sauna | Spa | 522395 | | 5 | 11 Fitness center · 153 Gym/fitness | Gym | 522395 | | 6 | 36 Kid's club · 37 Playground · 142 Pool [kids] · 151 Kids areas | Trẻ em | 522395 | | **7** | **24 Recreational facilities** · 40 · 41 · 101 · 103 · 105 · 112 · 113 · 114 · 118 · 124 · 126 · 131–135 · 147 · 149 | **"Things to do"** | 522395 — `improvementKeyId 7` = đúng nhóm này | | 8 | 3 Bathroom | Phòng tắm (Room) | 522398 room amenities | | **9** | **110 Bed** | Giường (Room) | 522398 | | **10** | **29 View** | Tầm nhìn (Room) | 522398 | ⇒ Mục **522395 bản khách sạn** đòi ảnh theo **nhóm tiện ích đã tick** (tick Karaoke/Massage chair thuộc nhóm facility *Things to do* → cần ≥1 ảnh Property mang caption nhóm 7, vd `24 Recreational facilities`). Mục **522398** đòi Room có đủ nhóm 8 · 9 · 10 — tag `Bedroom` (154) **không** thay được `Bed` (110). `missingPhotoGroup` liệt kê cả nhóm của tiện ích **không tick** (25AT11 thiếu `[1..7]` nhưng `improvements[]` chỉ nêu *Things to do*) — suy ra chỉ nhóm khớp tiện ích đã tick mới bị chấm; xác nhận khi điểm refresh. Lần đầu áp dụng: 25AT11 26/09 (97 → chờ refresh). Bộ Homes (522415–522432: 18 mục — ảnh 6 · amenities 2 · mô tả · host 3 · arrival guide 6) **không áp** cho property hotel; nhưng Arrival guide/mô tả vẫn ghi được bằng API §9 và nên làm sẵn để đổi loại hình không phải làm lại. **API kipp (đọc từ `cdn5.agoda.net/ycs/dist/22-*.js` + `184-*.js`):** - Room: `GET /en-us//kipp/api/roomtype/GetRoomType?roomTypeId=` → `Data.Room` (Facilities = `{Access,Accessibility,Bath,Clothing,Comfort,Dining,Entertainment,Layout,Safety,Others:[id]}` · `IsChildrenAllowed` · `NoOfBathroom` · `SizeOfRoom` · `ViewId` · `RoomBedConfigs`). Bảng id→tên: `…/roomtype/getRoomTypeMasterData` (`Facilities` 10 nhóm · `HotelViews` · `BedTypes`). **Ghi:** `POST …/roomtype/UpdateRoomType` body = đúng object Room + `hotelId, language:'en-us', RoomTypeId` (builder `c=function(e,t,n,l,…)` trong bundle 22). Script: [`scripts/ota-agoda-room-amenities.mjs`] `--read` / `--apply plan.json [--dry]`, tự đọc lại so từng nhóm. Hằng số: `nonSmoking 15 · bathtub 37 · smokingAllowed 281`. Server bỏ qua `MaxAdultsOccupancy/MaxChildrenOccupancy` (null), `NoOfBedroom` tự tính từ bed config. - Property facilities kipp: `GET …/kipp/api/propertyFacilitiesApi/GetViewModel?facilityGroupIds=` · `POST …/UpsertHotelFacilities` — không cần, PUT `/mldc/…/Facilities` ăn cả 440 (19/09: lần 1 khớp 440/440). - Age policy (mldc `ChildRate`, `Content-Type: application/json-patch+json`, body thường): `setupagepolicy` `{minimumAgeAllowed:0, childRateEnabled:true, childAgeRange:[{ageFrom:0, ageTo:2, recStatus:1, needExtraBed:false}]}` → trả `childAgeRanges[].hotelChildAgeRangeId` · `setupuniversalrate` `{mode:1, ageRanges:[{ageRangeId, stayRate:{value:0, type:4}, breakFast:{}}]}` (pricingType 1 Flat · 2 Discount adult · 3 % adult · **4 Free** · 5 Not provided) · `setupextrabed` `{isExtraBedEnabled:false, ageRequireExtraBed:null, ageRanges:[], isChannelManager:false}` · `setuproomoccupancy` như §9 · `setupfacilities` (child facilities, tuỳ chọn). Đọc lại: `childviewmodel` (`ageRange`, `hotelOccupancy.childRateModeId`) + trang wizard hiện **Active**. Bed config vẫn ghi qua mldc `BedConfigurations` (chạy được ở hotel-mode). **Bẫy 19/09:** - 🔴 **Ảnh dọc 2:3 (2000×3000 hay 1365×2048) bị Agoda ép về cao 1536 → rộng 1023**, dưới ngưỡng 1024×768 của mục high-resolution. Resize dọc về đúng **1030×1536** (cắt 9 px) trước khi upload thì Agoda giữ nguyên (181 qua với 1030×1536). - **Ghi hai lần** lặp lại: `UpdateRoomType` lần 1 chỉ ăn `IsChildrenAllowed`, amenities ăn lần 2; `UpdatePropertyDescription` lần 1 đọc lại 0 ký tự, lần 2 ăn. Luôn đọc lại `no-store` so plan. - `ContentScoreDetails` trả **204** cho listing mới (cả 404 hôm 17/09) — không phải lỗi, chờ ≤24 h; trang Analytics hiện "No content score data at the moment". - Tab CDP: `chrome-grab` mở/đổi tab nên script tự viết phải chọn tab theo URL (`TAB=childrenrateocc`), không lấy tab `portal.agoda.com` đầu tiên. **Liên quan:** Agoda — cơ chế đã hiểu · Cẩm nang set up listing Agoda · issues.md L-15 · Luật tin nhắn OTA · Luật chỉ đọc OTA --- # Chrome nào được dùng để làm việc URL: https://harthliving-ota.pages.dev/library/tech/chrome-profile-rule/ [Tổng quan](https://harthliving-ota.pages.dev/) › [Dữ liệu & báo cáo](https://harthliving-ota.pages.dev/library/) › [Tài liệu kỹ thuật](https://harthliving-ota.pages.dev/library/tech/) # Chrome nào được dùng để làm việc ## Chrome nào được dùng để làm việc Nguồn: `10-rules/chrome-profile-rule.md` ### 🔴 Chỉ làm việc trên Chrome của tài khoản Huy **User chốt 24/09/2026.** Mọi thao tác đọc OTA (Booking · Airbnb · Agoda · PriceLabs) phải chạy trên profile Chrome đang đăng nhập **Huy · huyngstr@gmail.com** (avatar Harth Living). Máy này có nhiều profile Chrome khác — Brandee · Duy · Hanh · Hiếu · Living · Trọng — **không dùng bất kỳ profile nào trong số đó.** #### Vì sao có luật này Các profile khác đăng nhập tài khoản khác, nên vừa không thấy đúng listing, vừa có nguy cơ thao tác nhầm trên tài sản của người khác. #### 🔴 Bẫy lớn nhất: tab mới mở SAI PROFILE, không phải hết phiên Một `user-data-dir` chứa nhiều profile; mỗi profile là một `browserContextId`. **`Target.createTarget` luôn mở ở context MẶC ĐỊNH** — và context mặc định ở máy này **không phải** profile Huy. Nên tab mới chưa bao giờ đăng nhập Booking, mọi trang bị đá về `sign-in`, **trông y hệt phiên hết hạn**. Truyền `browserContextId` của profile cũng không được: `createTarget` chỉ nhận context do chính nó tạo — trả `Failed to find browser context with id …`. **Cách duy nhất chạy được:** nhờ một tab đang đăng nhập mở tab con bằng `window.open(url,'_blank')` với `userGesture: true`. Tab con thừa hưởng đúng profile. `# so hai giá trị này; khác nhau là KHÔNG được tạo tab trần curl -s -X POST http://127.0.0.1:9333/cdp -H 'content-type: application/json' \ -d '{"method":"Target.getBrowserContexts"}' # defaultBrowserContextId curl -s -X POST http://127.0.0.1:9333/cdp -H 'content-type: application/json' \ -d '{"method":"Target.getTargets"}' # browserContextId của tab extranet ` Đã sửa trong `chrome-grab.mjs`, `ota-read-booking-funnel.mjs`, `ota-read-booking-reviews.mjs` (24/09/2026). #### Bẫy đi kèm: nhiều tab = nhiều token `ses` Extranet cấp một token `ses=` cho mỗi phiên. Mở nhiều tab qua nhiều lần đăng nhập thì các tab mang **token khác nhau**, và token cũ **đã chết** nhưng URL vẫn còn đó. `chrome-grab.mjs` lấy token của **tab đầu tiên** tìm thấy — nếu đó là tab cũ thì mọi lệnh sẽ bị đá về trang đăng nhập, trông y hệt "hết phiên". Đã dính 24/09/2026. **Cách tránh:** lấy token của tab **mới nhất**, hoặc đóng hết tab extranet cũ trước khi chạy. `scripts/ota-read-booking-funnel.mjs` đã làm đúng (hàm `session()` lấy token cuối danh sách). #### Kiểm nhanh trước khi chạy lô lớn `curl -s -X POST http://127.0.0.1:9333/cdp -H 'content-type: application/json' \ -d '{"method":"Target.getTargets"}' | grep -o 'ses=[a-f0-9]*' | sort -u ` Ra nhiều hơn một token là phải dọn tab trước. --- Phần 33/35 · tiếp: https://harthliving-ota.pages.dev/ai/full/part-34.txt