The paper ancestor of the RPP Sales Plan is one Google workbook per property, built during Ronald's December 2025 budget cycle (GM deadline 2025-12-20, email 2025-12-12, Spark msg 13967).
| Property | File | Created | Last edited | Drive path |
|---|---|---|---|---|
| HOURP | 2026 Sales Goal HOURP - v1 (UNLOCKED) | 2025-11-25 | 2026-02-16 | Drive (THM) / HOURP - SpringHill Suites Houston Med Center / HOURP - Sales and Marketing / Sales Performance / Sales Goals and Targets |
| HOUUS | 2026 Sales Goal HOUUS - v1 (UNLOCKED) | 2025-11-24 | 2026-02-16 | .../ 01 - Sales Performance / 01B - Sales Goals and Targets |
| HOUZN | 2026 Sales Goal HOUZN - v1 (UNLOCKED) | 2025-11-20 | 2026-02-16 | .../ 01 - Sales Performance / 01B - Sales Goals and Targets |
The punchline of the design: the GM's plan is forced to declare a market-share position (projected RGI), not just a revenue number. HOURP's 2026 plan landed at $6,534,417 projected on $6,093,340 TTM 2025 (+6.8%), projected RGI 101.2 vs 96.0 actual (Sales Goals rows 9, 28, 40, 41).
Downstream: the plan's monthly Growth row is copied into "HOURP - Sales Team Goals - 2026" (same folder), which sets the group-sales team's monthly revenue goals. HOURP's tracker has 2026 actuals through April; HOUUS has no tracker file at all; HOUZN's exists but is empty (see question 2).
| Option | What it is | Gets you | Effort* | Verdict |
|---|---|---|---|---|
| A. Status + lock | Add status (draft / submitted / approved / locked) + approved_by/at to sales_plans; gate writes when approved or locked; status badge in the UI. | The plan stops silently changing. A real "this is the committed budget" state. | 0.5-1 day | Do this week |
| B. Immutable versions | New sales_plan_versions table: on approval, the full plan (scenarios + the three adjustment maps + targets) is frozen as a labeled snapshot ("Original Budget", "Q2 Reforecast"). The live row stays the working draft. Version picker in the top bar; the existing Scenarios tab becomes the compare view. | Exactly the industry model: Budget locked, Forecast rolling, Reforecasts as approved snapshots, all comparable side by side. | 2-4 days | The real answer |
| C. Full change log | Append-only log of every field change (who, when, old, new), point-in-time reconstruction. | Forensic audit trail ("who moved June ADR"). | 3-5 days | Only if lender/partner scrutiny demands it |
Checked three places: the Google workbook, the sibling files, and the RPP database. December exists in the workbook and the database. The blank December lives in a different file.
| Where | December state | Evidence |
|---|---|---|
| 2026 Sales Goal HOUZN workbook | Fully populated | All 12 months + totals present in both the 2025 actuals and 2026 projection blocks (cells pulled 2026-07-19): Dec 2025 occ 56.23%, Dec 2025 RevPAR $62.72, Dec 2026 projected ADR $113.79, RevPAR $64.63. Comp/Response tabs carry the full December 2025 STR report (created Jan 17, 2026, STR ID 63698, 9-member compset). |
| RPP database (sales_plans) | Fully populated | All four HOUZN scenarios (2025 Actual, GM Budget 2026, SMART Forecast 2026, Fair Share 2026) carry months 1-12; GM Budget December: $278,475 revenue, 56.8% occ, $113.79 ADR (live query 2026-07-19). |
| "HOUZN - Sales Team Goals - 2026" tracker | Entirely blank | Every row Jan-Dec, all years 2022-2026, is empty; the sheet's own total row computes $0 (cells pulled read-only 2026-07-19 from file 1CiAgtwC...IE4k). Last touched 2026-06-30, the most recently edited file in the whole investigation. HOURP's equivalent tracker has actuals through April 2026 (same-day pull of file 1kPj1UrS...-sfw); HOUUS has no tracker file in its folder. |
So the answer: if you saw a missing December for HOUZN, you were most likely in the Sales Team Goals tracker (which is 100% empty and was touched as recently as June 30), not the Sales Goal workbook. If you did see it blank in the workbook itself, that state no longer exists and predates nothing we can reconstruct: revision history is not readable through our tooling, so pre-Feb-16 states are unverifiable. Flagging that honestly rather than inventing a cause.
All three workbooks were exported to xlsx and every populated cell's font inventoried (4,900+ cells total, ~1,600-1,800 per workbook).
Route /app/sales-plan, five tabs. Property picker defaults to the most recently updated property that has a plan; properties are tagged "plan" / "no plan".
| Tab | What it does (plain English) | Data source | You can edit | State |
|---|---|---|---|---|
| Forecast | The heart, and the direct descendant of the Google sheet. Auto-pulls last year's STR actuals for you and your compset, gives the GM the same three levers (Market Growth, Occ Adjustment, ADR Adjustment), instantly projects occ/ADR/RevPAR/revenue and projected RGI per month. Closed months show real actuals. A rank-goal bar lets you set a target compset rank, and "Wynn" auto-suggests the lever values needed to hit a target RGI. | STR via compset_metrics (auto), room counts via budget_assumptions, math in salesPlanCalc.ts | 3 adjustment rows, target rank | Works, best-in-class core |
| Pace | "Will this month make budget?" Budget vs month-to-date actuals vs on-the-books, plus the pickup still needed and the ADR that implies. | night_audit_current + booking_pace + the GM Budget scenario | Nothing (read-only) | Blank without a pace feed + budget |
| Actuals vs Plan | Monthly report card for closed months: actual vs GM Budget, green/amber/red variance, YTD summary, STR RGI column where it exists (never fabricated). | night_audit_current + GM Budget scenario + compset_metrics | Nothing (read-only) | Dead-ends without a budget |
| Scenarios | Side-by-side comparison of stored scenarios (GM Budget, SMART Forecast, prior-year actual): weighted annual cards + a 12-month revenue matrix. | scenarios JSONB on the plan row | Nothing (read-only) | Redundant today; becomes the version-compare view |
| Compset Intel | 18-month STR trend table (occ/ADR/RevPAR with MPI/ARI/RGI and ranks) plus the compset member roster. | compset_metrics + compset member tables | Nothing (read-only) | Duplicates the Compsets page |
| Problem | Why it hurts | Where | |
|---|---|---|---|
| 1 | You cannot create or edit a budget in the app. The budget editor (BudgetBuilderTab, 467 lines) was deleted 2026-07-17 as already-dead V1 code and never replaced. | Budgets exist only for the 3 seeded pilots (HOURP, HOUUS, HOUZN, verified by live DB query). For any other property, "Create Sales Plan" makes an empty shell and Pace, Actuals vs Plan, and the Forecast's budget rows all dead-end. The single biggest blocker to landing the feature. | commit f57e8a0; SalesPlan.tsx:71 |
| 2 | Two "plans" with an unexplained relationship. Editing the Forecast levers changes the SMART Forecast scenario, but Pace and Actuals vs Plan always grade against the GM Budget. | A GM will assume the numbers they edit are "the plan." Nothing on screen says otherwise except a footnote. | ForecastTab.tsx:349 |
| 3 | Projected revenue silently shows $0 when budget_assumptions is missing for the property/year. | RevPAR rows populate while the revenue KPI reads $0. Looks broken, no warning shown. | ForecastTab.tsx:73-81 |
| 4 | RGI is averaged three different ways on one screen (revenue-weighted KPI, arithmetic-mean grid total, arithmetic TTM in the rank bar). | The numbers visibly disagree with each other, eroding trust in all of them. | salesPlanCalc.ts:264; ForecastGrid.tsx:38 |
| 5 | Occ adjustment is points in the app, was % in the sheet. | A GM trained on the sheet typing "+3" gets +3 occupancy points, not +3%. | salesPlanCalc.ts:165 |
| 6 | The brand forecast is stored with no provenance. The SMART forecast is Marriott's own number (Ace, 2026-07-19), but the app stores it as an anonymous scenario, indistinguishable from something we computed. | Who produced a forecast, when, and via what feed is the whole ballgame for a multi-brand operator. Fixed by the forecast-lane model below. | Spark msg 179768; sales_plans.scenarios JSONB |
| 7 | Wynn's goal-seek is a black box (magic weighting constant, hard caps, unexplained per-month suggestions). | GMs will blindly accept or entirely ignore it. | salesPlanCalc.ts:352-453 |
| 8 | No role scoping. RLS is tenant-only; every role that sees the nav, including front desk, can edit any property's plan. | Fine for internal pilot, untenable the day GMs get logins. | migration 259:15; nav-config.ts:131 |
| 9 | Half the data model is dead (target_revpar_rank, rgi_goal, fair_share_formula, market_context, actuals_through: no UI reads them), plus dead V1 hooks including the orphaned GL-4100 budget sync. | Cruft, and the market-events overlay everyone wants is already modeled but invisible. | useSalesPlan.ts:129-292 |
| 10 | Five tabs where three carry the load; invisible save state; heavy horizontal scroll on mobile. | Feels bigger and clunkier than it is. | SalesPlan.tsx:118 |
Web research across industry guides, tool vendors, and asset-management sources. Full source list in the footer note; key claims linked inline.
Correction to the initial research (Ace, 2026-07-19, confirmed in the inbox): franchise revenue management requests budgets. Marriott's SMART program runs on HOUZN (Amy Wickliff's SMART Recaps to Sam Xie and ownership, Spark msg 179768) with One Yield as the yield system (registration approval msg 63402), and IHG's equivalent covers HOUUS. So the module needs a brand-RM-ready output: monthly occupancy / ADR / RevPAR in the shape the revenue manager loads into One Yield or Concerto, on the brand's calendar. What it does not need is franchise-compliance workflow beyond that.
| Tier | Tools | Cost signal | Who uses it |
|---|---|---|---|
| Enterprise budgeting suites | Actabl ProfitSword, Otelier TruePlan, Aptech Targetvue, Fairmas | "Contact us" pricing | 20-30+ property groups, PE/asset-manager mandates |
| RMS forecasting | IDeaS G3, Duetto | ~$1,200-3,500 / mo / hotel* | Full-service and better-performing select-service |
| Accounting-platform budget modules | M3, Inn-Flow | Bundled with accounting | The select-service mainstream |
| The actual default | Excel / Google Sheets + STR STAR | $0 | Most 10-30 property operators, including THM today |
Seven independent reviews of this plan: the four W5 lenses, two cross-vendor advisors on non-Claude models, and the Hormozi offer lens. All seven returned REVISE. The plan below already incorporates their accepted findings and Ace's round-2 decisions.
| Reviewer | Lens | Sharpest finding |
|---|---|---|
| Wynn | Revenue science | Compute projected RGI per month as an exact ratio (not the flat TTM approximation); grade the budget on attainment but prediction lanes on accuracy at matched snapshot horizons, or GMs learn to sandbag. |
| Warren | Money math | Measure THM's actual STR-to-GL revenue gap and calibrate the 4100 sync with it; store integer rooms-sold as the budget primitive; a reforecast approval must never silently re-baseline the locked budget. |
| Walton | Operations | Brand-recap feeds need expected-cadence freshness alerting like every other ingestion pipeline; the monthly ritual needs the same reminder machinery as the annual season or it decays like the trackers did. |
| Woz (fresh eyes) | Engineering | The "SMART Forecast" scenario in code is the GM's own computed projection, not Marriott's number (two-lane split required); snapshots must freeze computed outputs, not input levers; the orphaned 4100 function is broken as written. |
| Andrej (GPT-5.4) | Systems rigor | No cutover acceptance bar: freeze a golden corpus from the pilot workbooks and assert month-level parity before the sheet loses system-of-record status; approval needs atomicity and a read-back reconciliation assertion. |
| ChaseAI (Gemini) | Scope discipline | Ship P0 completely before any P1; the auto-suggest black box must be fixed or removed, not shipped as-is; gate the GL sync. |
| Hormozi | The offer | Flat $299/mo breaks the pricing model for a portfolio product; the accuracy-grading proof can be built from THM's existing history now; nothing in the plan was designed to make an operator switch. |
| Decision | Call |
|---|---|
| Occupancy lever | REVERSED to points (stored and computed), displayed unmistakably as "+3.0 pts" with a translation tooltip for sheet-trained GMs. No pilot data migration, no suggest-logic rewrite. |
| 4100 sync guardrail | Calibrated auto-sync: per-property trailing-12 STR-to-GL ratio applied and shown at approval; residual gap over ~5% flags a data-integrity review instead of posting as a grade (threshold is Warren's convention, tuned after measuring). |
| Pricing | Per-property base plus premium tier (accuracy grading, multi-brand aggregation, portfolio rollup are the premium). Warren models the per-door number before the first external conversation. |
| Proof artifact | Build the accuracy-grading case study on THM's own history during P0/P1, as both the sales proof and the design spec for the live P2 feature. |
| Design partner | Hard gate: when P0 proves on a non-pilot property, one external management company onboards (founder-priced) so P1/P2 are shaped by two operators. |
| Auto-suggest | Rebuilt as Ace's manual process: per-month, raise-only against the hotel-set RGI target, each suggestion with its one-line reason, capped, never lowering months already above target. Stays in for the 2027 season. |
| Compset Intel tab | Dropped from the module; a link jumps to the Compsets page with the property preselected. |
| Portfolio rollup | Built during the 2027 season work; aggregates only approved locked budgets, everything else shows "no plan yet". Ready as the design-partner demo. |
| The offer | Free graded-budget diagnosis ("if we don't show you something you didn't know, you pay nothing") as the opening offer, reusing the case-study machinery. |
| Support path | Ronald is first line for GM data questions with in-app explainers ahead of him; genuine data or bug issues escalate to Woz. |
The Forecast tab's core (STR-anchored, three levers, projected RGI, rank goals) is already better than anything in the affordable tier. What is missing is the boring institutional half: a budget you can enter, lock, version, and report against. Three phases.
| Decision | Call |
|---|---|
| Budget entry | Promote forecast to GM Budget (tune the three levers, freeze as budget, inline month tweaks allowed before approval). Plus a one-click "Set budget = last year" seeding option, since the non-pilot properties budget off prior year today. |
| Roles | GM drafts own property, ownership approves and locks; Ronald/Junaid get portfolio-wide staff edit. |
| Occupancy lever | Percent, matching the workbook. Superseded Reversed to points in round 2 after the engineering review (see Review Board section). |
| First in-app season | 2027 budget season starting September 2026, lock by early December; dry run = a 2026 mid-year reforecast on the pilots. |
| Rollout scope | The 3 pilots stay the real users for now. Wider THM rollout later; last-year seeding covers the rest meanwhile. |
| IHG feed | IHG sends an email recap like Marriott's (Ace), so the IHG parser follows the SMART parser on the same pattern. |
| Accuracy grading | Visible to ownership and GMs, every lane including the brand RM's. |
| Segments | One group/negotiated lane only in P2, replacing the Sales Team Goals sheets. No full segmentation yet. |
| P&L scope | Rooms revenue only. Approved budget auto-syncs to GL 4100 in the budget/BVA system (revive the orphaned sync); expenses stay in the budget module. |
| Connector timing | After P1 lock ships: SMART parser then IHG as the first P2 items. |
The SMART forecast comes from Marriott directly; IHG has an equivalent that is not wired in; many management companies use brand revenue management. So the architecture treats forecasts as lanes with provenance and brand programs as connectors: