What it is
Occupancy measures how many nights were occupied out of the nights in a period. In vacation rentals, a home's calendar has more than two states. A night can be booked by a paying guest, used by the owner, blocked for maintenance (a hold), or open.
Key Data, a market data provider, publishes four versions (Key Data):
- Paid occupancy = guest nights ÷ total nights
- Paid and owner occupancy = (guest nights + owner nights) ÷ total nights
- Calendar occupancy = (guest nights + owner nights + hold nights) ÷ total nights
- Adjusted paid occupancy = guest nights ÷ (total nights − owner nights − hold nights)
This page uses adjusted paid occupancy as the default for judging a manager, and shows the others beside it.
Why operators track it
- Fair to the manager. Owner stays and holds vary a lot between homes. Key Data says owner and hold nights each sit around 10% of US short-term rental nights annually, so about 20% of nights are not open to earn revenue (Key Data).
- Revenue driver. With price held steady, more guest nights means more revenue.
- Owner conversations. Owners compare their home's occupancy to what they expected or saw on a market data tool.
- Capacity planning. Calendar occupancy shows how much inventory is used at all, which matters for cleaning and maintenance scheduling.
How it is calculated
Adjusted paid occupancy = guest nights ÷ (total nights − owner nights − hold nights)
- Guest nights are nights sold to paying guests. Decide whether comp stays count (see choices).
- Owner nights are nights the owner or their guests use the home.
- Hold nights are nights blocked for maintenance, renovation, or deep cleaning.
- Total nights = number of homes × nights in the period, for homes under management during the period.
Worked example
Example data The same made-up portfolio is used on every hospitality page: a manager with 120 homes, four of them shown in detail.
Across four example homes in October, there were 124 total nights: 85 guest nights, 11 owner nights, and 2 hold nights. Adjusted paid occupancy is 85 ÷ (124 − 11 − 2) = 85 ÷ 111 = 76.6%. Paid occupancy on the same calendar is 85 ÷ 124 = 68.5%.
How to read it
- Always say which version. A report that just says occupancy invites the wrong comparison.
- Read it with ADR. High occupancy with low ADR can mean the price is too low.
- Look at the denominator. Adjusted paid occupancy can rise because more homes were taken offline, not because more guests booked. Key Data gives storm damage as an example (Key Data).
- Supply changes. Adding homes mid-period changes total nights. Count only the nights each home was under management.
- We do not publish a benchmark. Levels vary by market, season, and property type.
Definitional choices and common pitfalls
- Which version. Adjusted paid is fairest to a manager. Paid ties most directly to revenue. Show both and label them.
- Comp and staff stays. Decide whether free stays count as guest nights. Many teams treat them as holds.
- Hotels vs homes. Hotels count rooms. A mixed portfolio needs a rule for multi-bedroom homes: per unit, or normalized per bedroom.
- Market data is not like for like. AirDNA divides reserved days by active listing nights, excludes blocked days, and uses machine learning to tell blocks from bookings on calendar data (AirDNA). A PMS number will not match it exactly.
- Partial periods. Homes onboarded or offboarded mid-month should count only their managed nights.
How different roles use it
| Role | How they use it |
|---|---|
| Owner relations | Explains an owner's occupancy, separating owner stays and holds from guest demand. |
| Revenue manager | Tracks adjusted paid occupancy with ADR by home, market, and month. |
| Operations | Uses calendar occupancy to plan cleaning and maintenance capacity. |
| Finance / trust accounting | Ties guest nights to rent revenue on statements. |
| Product / engineering lead | Decides which version the product shows by default and how block types are stored. |
Questions it answers
- Which homes have low occupancy on nights they were open to book?
- Is occupancy falling because of demand or because owners are using the home more?
- How does each home compare to its market, on a like-for-like basis?
- How many nights were lost to maintenance holds?
How to present it in a report
- Show adjusted paid occupancy as the headline, with paid occupancy beside it.
- A calendar strip per home with guest, owner, hold, and open nights in different colors.
- A table by home with each night type counted.
- Label the version on every chart.
| Home | Guest | Owner | Hold | Open | Adjusted paid | Paid |
|---|---|---|---|---|---|---|
| Beach house (3 bd) | 22 | 4 | 0 | 5 | 81.5% | 71.0% |
| Condo (2 bd) | 20 | 0 | 2 | 9 | 69.0% | 64.5% |
| Lake house (5 bd) | 18 | 7 | 0 | 6 | 75.0% | 58.1% |
| Studio (1 bd) | 25 | 0 | 0 | 6 | 80.6% | 80.6% |
Adjusted paid = guest ÷ (total − owner − hold). Paid = guest ÷ total.
Data you need
Fields
| Field | What it means | Example value |
|---|---|---|
| Calendar night | One row per home per night | 2026-10-14 |
| Night type | Guest, owner, hold, or open | owner |
| Reservation ID | Links guest nights to a booking | R-88412 |
| Hold reason | Maintenance, renovation, deep clean | plumbing repair |
| Management dates | When the home joined and left | 2025-03-01 to open |
What the raw data looks like
Example data A few rows as they might come out of the source system.
| Home | Date | Night type | Reservation | Hold reason |
|---|---|---|---|---|
| Beach house | 2026-10-03 | guest | R-88412 | |
| Beach house | 2026-10-18 | owner | OB-221 | |
| Condo | 2026-10-09 | hold | plumbing repair | |
| Condo | 2026-10-10 | open |
Where this data usually lives
- Property management system (PMS) holds units, the calendar with block types, reservations, rates, fees, and often owner statements and trust accounting. For example: Guesty, Hostaway, OwnerRez, Track, Streamline, and Escapia. Some larger managers run their own in-house PMS.
- Market data providers estimate market occupancy, ADR, and pace. For example: AirDNA, which uses listing data plus partner data (AirDNA), and Key Data, which works with property manager data (Key Data). Their definitions may differ from yours.
The same field can live in more than one system. Agree with the customer which one is the source of truth.
Common data gaps and traps
- Owner blocks and holds in one bucket. Some systems store every block the same way. Ask for a block type or reason.
- Calendar history overwritten. Some systems keep only the current calendar. Save a daily snapshot.
- Cancelled stays still blocking. Cancelled reservations that were not released leave false blocks.
- Units vs listings. One home can have several listings across channels. Count the home once.
Related metrics
- ADR: the price side of the same nights.
- RevPAR: occupancy and ADR combined.
- Booking pace: occupancy on the books for future dates.
FAQ
- What is adjusted paid occupancy?
- Guest nights divided by nights left after removing owner stays and maintenance holds. Key Data describes it as the clearest view of how well managers book available inventory (Key Data).
- Why does my PMS occupancy differ from AirDNA?
- They count different things. AirDNA uses reserved days over active listing nights and infers blocks from calendar data (AirDNA). Your PMS knows the actual block types.
- Is there a good occupancy rate for vacation rentals?
- We do not publish a benchmark. Levels vary by market, season, and property type. Compare a home to itself over time and to a like-for-like market figure.
For your data teamFormula variants, tables, SQL sketch, and dashboard spec
Formula details
paid_occ = guest_nights / total_nights
paid_owner_occ = (guest_nights + owner_nights) / total_nights
calendar_occ = (guest_nights + owner_nights + hold_nights) / total_nights
adjusted_paid_occ = guest_nights / (total_nights - owner_nights - hold_nights)
Worked example detail
| Home | Guest | Owner | Hold | Total | Adjusted paid |
|---|---|---|---|---|---|
| Beach house (3 bd) | 22 | 4 | 0 | 31 | 81.5% |
| Condo (2 bd) | 20 | 0 | 2 | 31 | 69.0% |
| Lake house (5 bd) | 18 | 7 | 0 | 31 | 75.0% |
| Studio (1 bd) | 25 | 0 | 0 | 31 | 80.6% |
| Total | 85 | 11 | 2 | 124 | 76.6% |
Tables and fields
| Table | Fields | Notes |
|---|---|---|
calendar_nights |
unit_id, night_date, night_type, reservation_id, hold_reason | One row per unit per night. Snapshot daily. |
units |
unit_id, bedrooms, market, managed_from, managed_to |
SQL sketch
SELECT unit_id,
COUNT(*) FILTER (WHERE night_type='guest') AS guest_nights,
COUNT(*) FILTER (WHERE night_type='owner') AS owner_nights,
COUNT(*) FILTER (WHERE night_type='hold') AS hold_nights,
COUNT(*) FILTER (WHERE night_type='guest')::numeric
/ NULLIF(COUNT(*) FILTER (WHERE night_type IN ('guest','open')),0) AS adjusted_paid_occ
FROM calendar_nights c JOIN units u USING (unit_id)
WHERE night_date >= '2026-10-01' AND night_date < '2026-11-01'
AND night_date >= u.managed_from AND (u.managed_to IS NULL OR night_date < u.managed_to)
GROUP BY unit_id;
Build spec
Copy this into a ticket. It lists the grain, inputs, logic, and edge cases.
metric: hospitality.occupancy
grain: one row per unit per night, aggregated to unit and period
inputs:
- calendar night type (guest, owner, hold, open)
- management start and end dates
logic:
- total = nights under management
- adjusted_paid = guest / (total - owner - hold)
- also return paid, paid_and_owner, calendar
edge_cases:
- denominator 0 (fully blocked): null
- comp stays: configurable, default hold
- partial month: count managed nights only
As a dashboard card
- KPI for adjusted paid occupancy with paid occupancy as a subtitle, and a stacked bar per home of guest, owner, hold, and open nights.
Common mistakes
- Reporting occupancy without saying which version.
- Counting cancelled-but-blocked nights as owner or hold nights.
- Comparing a PMS number directly to market data built from listing calendars.