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.

    PUT
    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
    }'
    Response (201)
    {
      "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.

    PUT
    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
        }
      ]
    }'
    Response (200)
    { "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.

    GET
    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"
    One day · GET
    curl "https://api.helloledger.ai/v1/companies/{company_id}/room-statistics/2026-10-01" \
      -H "Authorization: Bearer $HL_API_KEY"
    Delete a day · DELETE
    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.

    GET
    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"
    By day · GET
    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"
    Response (200)
    {
      "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.
    KPICalculation
    Occupancy %Rooms sold ÷ rooms available × 100
    ADRRooms Revenue ÷ rooms sold
    RevPARRooms Revenue ÷ rooms available
    Rooms RevenueAccounts in the Rooms Revenue group, minus Miscellaneous Income accounts such as parking and in-room movies. Same as the Hotel TTM report.