Bookkeeping
Hotel statistics and KPIs
Send daily rooms available and rooms sold; read occupancy, ADR, and RevPAR.
How it works
Your property management system sends two counts per day: rooms available and rooms sold. HelloLedger stores them with the company (the same numbers the Data Entry screen shows) and combines them with Rooms Revenue from the books to calculate the KPIs.
Only Hospitality companies have room statistics. Other companies return 400 report_not_available.
Set one day
Scope: stats:write. PUT replaces the counts for that date, so sending the same day again is safe. rooms_sold can't be more than rooms_available. The response's result is created, updated, or unchanged.
curl -X PUT "https://api.helloledger.ai/v1/companies/{company_id}/room-statistics/2026-10-01" \
-H "Authorization: Bearer $HL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"rooms_available": 120,
"rooms_sold": 96
}'{
"date": "2026-10-01",
"rooms_available": 120,
"rooms_sold": 96,
"occupancy_pct": "80.00",
"updated_at": "2026-10-02T06:00:00+00:00",
"result": "created"
}Set many days
Send up to 366 days in one request, for a nightly sync or a backfill. Each date can appear once.
curl -X PUT "https://api.helloledger.ai/v1/companies/{company_id}/room-statistics" \
-H "Authorization: Bearer $HL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"days": [
{
"date": "2026-10-01",
"rooms_available": 120,
"rooms_sold": 96
},
{
"date": "2026-10-02",
"rooms_available": 120,
"rooms_sold": 88
}
]
}'{ "company_id": "{company_id}", "created": 1, "updated": 0, "unchanged": 1, "data": [ … ] }Read and delete
Scope: stats:read or stats:write. List a date range of up to 366 days, read one day, or delete a day entered by mistake.
curl "https://api.helloledger.ai/v1/companies/{company_id}/room-statistics?from=2026-10-01&to=2026-10-31" \
-H "Authorization: Bearer $HL_API_KEY"curl "https://api.helloledger.ai/v1/companies/{company_id}/room-statistics/2026-10-01" \
-H "Authorization: Bearer $HL_API_KEY"curl -X DELETE "https://api.helloledger.ai/v1/companies/{company_id}/room-statistics/2026-10-01" \
-H "Authorization: Bearer $HL_API_KEY"Hotel KPIs
Scope: reports:read. Returns rooms available, rooms sold, occupancy, Rooms Revenue, ADR, and RevPAR by month (default) or by day, plus a total for the range. Monthly ranges can cover up to 36 months; daily ranges up to 366 days.
curl "https://api.helloledger.ai/v1/companies/{company_id}/reports/hotel-kpis?from=2026-01-01&to=2026-10-31" \
-H "Authorization: Bearer $HL_API_KEY"curl "https://api.helloledger.ai/v1/companies/{company_id}/reports/hotel-kpis?from=2026-10-01&to=2026-10-31&granularity=day" \
-H "Authorization: Bearer $HL_API_KEY"{
"company_id": "{company_id}",
"currency": "USD",
"from": "2026-10-01",
"to": "2026-10-31",
"granularity": "month",
"data": [
{
"period": "2026-10",
"days_reported": 31,
"rooms_available": 3720,
"rooms_sold": 2790,
"occupancy_pct": "75.00",
"rooms_revenue": "362700.00",
"adr": "130.00",
"revpar": "97.50"
}
],
"total": { "period": "total", "days_reported": 31, "rooms_available": 3720, "rooms_sold": 2790, "occupancy_pct": "75.00", "rooms_revenue": "362700.00", "adr": "130.00", "revpar": "97.50" }
}Formulas
- Periods with no room statistics return null counts and KPIs; Rooms Revenue is still shown. days_reported tells you how many days had counts.
- ADR is null when no rooms were sold, and RevPAR when no rooms were available.
| KPI | Calculation |
|---|---|
| Occupancy % | Rooms sold ÷ rooms available × 100 |
| ADR | Rooms Revenue ÷ rooms sold |
| RevPAR | Rooms Revenue ÷ rooms available |
| Rooms Revenue | Accounts in the Rooms Revenue group, minus Miscellaneous Income accounts such as parking and in-room movies. Same as the Hotel TTM report. |