🏨 Hotel Price Management — Master Guide

tp.1bogo.live · as of 2026-07-28 · Comparison policy: Price Comparison Policy →  |  한국어 · English · Tiếng Việt

① The Big Picture — Price Management Cycle

1. CollectOur & competitor prices
auto + extension + manual
2. VetRoom matching · QA flags
establish data trust
3. CompareCurated room comparison
site-displayed price
4. AdjustWorkbench suggestions
apply/request within guard
5. TrackSales signals · changes
verify effect → back to 1
🎯 Operating goal: "Stay slightly cheaper than the price the competitor displays on its site, while never breaking the Net margin floor."
🚨 Top-level pricing principle (set by the CEO, 2026-08-15): any figure shown as a price must be one a customer can see for themselves on that site. A hidden price estimated from promotion notice text is not a price and is never used for comparison, suggestions, or transmission. It appears only as a "possible hidden discount −N% (unverified)" notice; a real discount affects price only after it has been measured on the checkout page.

② Screen Map — Where to Do What

🏠 Hotel List

  • All hotels at a glance (card/list mode)
  • Urgent worklist: overpriced hotels · largest price gaps
  • Search (KR/EN), recollect & collection-request buttons
  • Mini KPIs: overpriced / Tourpik-missing hotel counts

⭐ Curated Room Comparison (main)

  • 3-provider prices per confirmed room group, one row each
  • Title row: sales snapshot (week · month · prev month · 3 months)
  • Hidden-price notice show/hide · full-rate comparison toggle (price figures do not change)
  • Verdict vs competitors (± signs) · per-room ↗ links (rate & dates auto-set)
  • KPIs: overpriced / suspected input error / max price gap

💰 Price Adjustment Workbench

  • Sale/Net/markup/competitor-low table per room & promotion
  • Apply rule (₩-mode default) → preview → apply/request
  • Open column: TP PK TR deep links with rate & dates auto-set
  • Per-row "no change" reasons

🛏 Room Matching

  • Confirm/hold/exclude per group + canonical name & memo
  • Review suspects (bedroom-count mismatch etc.)

📈 Competitor Signals / Rate Sheet

  • competitor_signal time series · our actual sales
  • Rate sheet tab: raw KV rates

🧪 Data QA / Details

  • Row checks by severity (critical/warning/normal)
  • Not-comparable reasons · condition summaries

③ Collection — Three Paths

PathBehaviorCaution
🤖 Auto pipelineServer-scheduled collection (TP_PIPELINE=1). Our rate sheet every 6h + bucket recollectionFull bucket recollection uses the Vietnam date boundary (UTC+7) window
Chrome extension (fast)Collection offloaded to the page — default when the extension is installed. Progress & stage shown; save failures are reported as failuresAn extension change = repack + zip version check as one unit. Latest zip: /downloads/tp-ext.zip
🖱 Manual recollectRecollect button on hotel card/detail. On completion the Tripon cache is invalidated immediately → fresh values shown right awayRefresh the page right after recollecting
🚨 Never pm2 restart while a collection is running — in-flight collection state is lost (restart-wipe incident history). Deploy only when no collection is running.

④ Daily Routine

1
Hotel list → check the urgent worklistStart from the hotels with "max +N₩ overpriced". Prioritize by overpriced / Tourpik-missing counts
2
Hotel detail → verify data trust in Curated viewClear T0 flags first (matching suspect · breakfast mismatch · input-error suspect · price outlier) — wrong data means wrong adjustments
3
Compare on site-displayed pricesJudge overpricing against the price the competitor displays on its site. The hidden-price notice badge is context only and never enters the comparison. Cross-check via ↗ links to the actual pages
4
Workbench → apply rule (preview)₩-mode (competitor low − random range) by default · check guard clamps 🟡 · untick rooms to exclude
5
Apply, or record a requestLIVE hotels = sent for real upon approval / others = sealed (recorded only). Leave the rationale in the memo
6
Track effect via sales snapshot & competitor signalsSales line in the curated title row (week/month/prev/3mo) + signals tab time series

⑤ Badge & Warning Glossary — What to Do When You See It

Rate sheet updated · headline from old snapshotOur snapshot disagrees with the rate sheet — normally the page waits for recollection and shows the fresh price; this badge remains only when recollection failed/timed out→ refresh shortly; report if persistent Possible hidden discountThe competitor's notice mentions a conditional discount, but whether it actually applies is unverified→ a notice only; the competitor low stays the displayed price +N₩ vs PK (overpriced)We are above the competitor low (per night)→ adjustment candidate −N₩ vs PK (cheaper)We are cheaper — the target state→ if far too cheap, check margin ⚠ Suspected input errorOur price is under half the competitor low — likely a rate entry mistake→ check the raw rate sheet ⚠ Price outlier / matching suspectMatching/data trust problem→ recheck in Room Matching △ Condition-mismatched comparisonNo same checkin/nights data — compared via auto-lowest→ recollect to obtain matched conditions N competitors not collectedSome competitor data missing→ recollect Not comparable (display only)e.g. competitor capacity below party size — excluded from calculations→ reference only Sealed · record onlyNon-LIVE hotel — adjustments are not actually sent→ switch to LIVE in policy admin if needed LIVE · sent upon approvalThis hotel transmits to the real rate API→ always check the preview before applying 🟡 Guard clampThe suggestion hit the Net floor and was raised→ review the policy floor

⑥ Hidden-Price Operations

Parse rulesPK detail pages
long-stay · early-bird · seasons
Risk gateambiguous rules are held
(not shown > over-discount)
Notify"possible −pct% (unverified)" badge
the price does not change
Audit1-night vs N-night unit price
full double-apply verification
WhenWhat
Hidden-price notice badge not showing
(unrelated to price figures — D-030)
Check in order: ① is check-in inside the rule period ② nights/lead-days satisfied ③ is the rule risk-held (rulesHeld). Refresh rules: node scripts/refresh-hidden-promos.js --apply
Hidden price looks wrongCross-check with the real booking window (payment step) for extra-discount items like [long-stay benefit] — never judge by the displayed discount rate
Periodic checkKeep "already applied" at 0 via scripts/audit-hidden-applied.js. Early-bird-only hotels need manual booking-window checks

⑦ Safety Rules

LevelRule
🚨No restarts while collecting — collection state is lost
🚨No test transmissions to LIVE hotels — real sale prices change. Test on sealed hotels
🚨Never mark hidden price "already applied" from the displayed discount rate — don't fall for the marketing framing
⚠️Room-matching rule (room-sig) changes require the npm test regression + manual re-vetting of new TRIPON entries
⚠️An extension change counts as deployed only after repack + zip version verification
⚠️Before applying, habitually check guard clamps and per-row "no change" reasons in the preview
ℹ️Deploy: after code changes run pm2 restart tourpik-price-report (no build step; public/* needs no restart)

⑧ Troubleshooting Quick Table

SymptomMost likely causeAction
Hotel list empty after loginLogin ID autofilled into the search boxClear the search box
Price differs from the actual siteCollection timing gap (cards show the basis & date)Recollect → refresh. Tripon cache auto-invalidates
"Old snapshot" badge persistsOur recollection failed (15-min cooldown)Recheck later; report if persistent
Hidden price not detectedCheck-in outside rule period / risk-held ruleFollow section ⑥
No account can log inDB race at bootpm2 restart (when no collection runs)
Extension collection stuck/failedIngest (save) failure — reported as failure, never disguised as successRetry; report if repeated

Service: pm2 tourpik-price-report · port 3201 · memory cap 700M · DB PostgreSQL tourpik_price_report

⑨ Recently added (as of v1.0.7.89)

Approve / reject from TelegramWhen an auto-adjust run ends awaiting approval, the price channel receives a report with Approve / Reject buttons. Approval takes two taps (a confirm step); rejection takes one. Handling it in the admin screen first closes the buttons automatically.
Elapsed and remaining time on the scan barThe auto-adjust “Scan now” progress bar now shows elapsed time and an estimated time remaining, computed from the current phase.
Automatic room-match top-upIf a competitor is added later, one collection run now fills in the room matches automatically — but only where the room names match exactly. Near matches are never attached automatically, so review them in Curation.
Inspect and edit price bandsClicking “N price ranges active” in the workbench opens a table of the discount per competitor-price band, with an Edit rules button that jumps straight to the pricing-rule screen.
Version shown on screenThe product name in the top bar is followed by v 1.0.7.89. It increases on every deployment — quoting it in a report tells us exactly which build you saw.