insights.json
outputs/insights.json
{
"week_start": "2027-10-18",
"insights": [
{
"property_id": "HOTEL-001",
"what_changed": "The next 7 days average 66.6% occupancy on the books. The last 7 days averaged 57.3%. That is up 9.3 points.",
"why": "Most of the gain is Sunday 2027-10-24 at 85.0%. The other six days sit between 60.4% and 66.0%. The 85.0% day uses a derived availability number (see the data note insight).",
"what_to_look_at": "Read the gain as one strong Sunday, not a strong week. Confirm the Sunday number before you act on it.",
"evidence": [
"outputs/report.json: last_7_days (occupancy_avg 0.5727, next_7_days_occupancy_avg 0.6656, change_vs_last_7_days 0.0929)",
"outputs/report.json: row 2027-10-24 (hotel-001.json, occupancy[13]; derived from inventory)"
]
},
{
"property_id": "HOTEL-001",
"what_changed": "Two dates are below the 63% threshold: Monday 2027-10-18 at 60.4% and Saturday 2027-10-23 at 62.7%.",
"why": "Group business does not help these dates. On 2027-10-18 the group grid shows 2 rooms allocated and 0 picked up. On 2027-10-23 it shows no group rooms. Today is already the business date, so 2027-10-18 has little room to move.",
"what_to_look_at": "Saturday 2027-10-23: 461 rooms are still available. Check open rate restrictions and late-booking channels for that night.",
"evidence": [
"outputs/report.json: row 2027-10-18 (hotel-001.json, occupancy[7]; availability[0])",
"outputs/report.json: row 2027-10-23 (hotel-001.json, occupancy[12]; availability[5])"
]
},
{
"property_id": "HOTEL-001",
"what_changed": "Group pickup is 0 of 2 allocated rooms on 2027-10-18 and 0 of 2 on 2027-10-19. No other date has group rooms in the grid.",
"why": "One block (BLOCK-001) holds these rooms and nothing is picked up. The group grid covers only 1 of the 25 blocks listed in the export, so the real group picture is wider than this.",
"what_to_look_at": "Ask sales whether BLOCK-001 should release its rooms. Ask why the export has a grid for only 1 of 25 blocks before trusting any group number.",
"evidence": [
"outputs/report.json: row 2027-10-18 (hotel-001.json, occupancy[7]; availability[0])",
"outputs/report.json: row 2027-10-19 (hotel-001.json, occupancy[8]; availability[1])",
"outputs/normalized/groups.csv: rows BLOCK-001 2027-10-18 and 2027-10-19",
"outputs/report.json: warnings[1]"
]
},
{
"property_id": "HOTEL-001",
"what_changed": "45 rooms have open maintenance records ahead of the busiest date, Sunday 2027-10-24 at 85.0% with 186 rooms available.",
"why": "Every maintenance record in the export is still unresolved. Many were created in 2026, more than a year before the business date. Some rooms have dozens of open records. The export has no end dates, so the same 45 rooms count against every date.",
"what_to_look_at": "Ask engineering which of the 45 rooms are truly out of order on 2027-10-24, and close the old records that are already fixed.",
"evidence": [
"outputs/report.json: row 2027-10-24 (hotel-001.json, occupancy[13]; derived from inventory)",
"outputs/normalized/maintenance.csv: all rows (status UnResolved, created from 2026-04-22 to 2027-10-13)",
"outputs/report.json: warnings[2]"
]
},
{
"property_id": "HOTEL-001",
"what_changed": "Data note: the 2027-10-24 numbers are less certain than the other dates.",
"why": "The export has no hotel-level availability row for 2027-10-24. The script derived rooms available (186) from the inventory and the occupancy. The other six dates come from a real availability row.",
"what_to_look_at": "Check 2027-10-24 in OPERA before quoting the 85.0% or the 9.3 point gain to anyone.",
"evidence": [
"outputs/report.json: warnings[0]",
"outputs/report.json: row 2027-10-24 (hotel-001.json, occupancy[13]; derived from inventory)"
]
}
]
}