What it is
A turnover is the clean between one stay and the next. Cost includes cleaner pay or invoices, linens and laundry, and supplies. Some teams include inspection time.
Many managers charge guests a cleaning fee per stay. Comparing the two shows whether cleaning is subsidized, breaks even, or earns a margin.
Why operators track it
- Margin leak. Short stays and large homes can cost more to clean than the fee covers.
- Fee setting. Evidence for changing the cleaning fee by home.
- Vendor management. Cost per turnover by cleaner or team.
- Quality. Cost cuts that hurt review scores are visible when read together.
How it is calculated
Cost per turnover = total cleaning cost ÷ turnovers. Cleaning margin = cleaning fees collected − cleaning cost.
- Turnovers: completed cleans after a guest checkout. Owner-stay cleans can be separate.
- Cleaning cost: cleaner pay or invoices, laundry, supplies. Inspection optional.
- Fees: guest cleaning fees on the same stays.
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.
The four example homes had 22 turnovers in October. Cleaner cost was $4,010, and linens and supplies $330: $4,340 in total, or $197.27 per turnover. Guests paid $4,150 in cleaning fees, so cleaning ran $190 short.
How to read it
- By home, not just portfolio. The leak is usually a few homes.
- Read with reviews. Cleanliness is a common review category.
- Seasonality. Peak turnover days can cost more when cleaners are scarce.
- We do not publish a benchmark. Levels vary by market, season, and property type.
Definitional choices and common pitfalls
- What counts as cost. Cleaner pay only, or plus laundry, supplies, and inspection.
- Owner stays. Owner-stay cleans are often billed to the owner. Separate them.
- Re-cleans. Count re-cleans after a failed inspection as cost on the original turnover.
- Fee basis. Fee per stay before or after channel fees.
How different roles use it
| Role | How they use it |
|---|---|
| Operations | Manages cost per turnover by home, team, and season. |
| Revenue manager | Adjusts cleaning fees by home. |
| Owner relations | Explains cleaning charges to owners. |
| Finance / trust accounting | Matches cleaner invoices to turnovers. |
Questions it answers
- Which homes lose money on cleaning?
- Is cost per turnover rising?
- Do re-cleans cluster with one team?
How to present it in a report
- Table by home: turnovers, cost per turn, fee per stay, gap.
- Trend of cost per turnover by month.
- Re-clean count.
| Home | Turnovers | Cost per turn | Fee per stay | Gap |
|---|---|---|---|---|
| Beach house (3 bd) | 5 | $230 | $250 | $100 |
| Condo (2 bd) | 6 | $140 | $150 | $60 |
| Lake house (5 bd) | 3 | $420 | $400 | −$60 |
| Studio (1 bd) | 8 | $95 | $100 | $40 |
Data you need
Fields
| Field | What it means | Example value |
|---|---|---|
| Turnover task | Clean linked to a checkout | T-55031 |
| Cleaner or team | Who did it | Team B |
| Cost | Pay or invoice amount | $230 |
| Supplies and laundry | Allocated per turnover | $15 |
| Cleaning fee | Guest fee on the stay | $250 |
What the raw data looks like
Example data A few rows as they might come out of the source system.
| Task | Home | Checkout | Team | Cost | Re-clean | Fee on stay |
|---|---|---|---|---|---|---|
| T-55031 | Beach house | Oct 7 | Team B | $230 | no | $250 |
| T-55044 | Lake house | Oct 9 | Team A | $420 | no | $400 |
| T-55052 | Condo | Oct 12 | Team C | $140 | yes | $150 |
Where this data usually lives
- Housekeeping and operations tools hold cleaning tasks, inspections (sometimes with photos), work orders, and maintenance cost.
- Accounting software holds the general ledger, AP, and bank reconciliation.
- 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.
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
- Housekeeping tool and AP not linked. Tasks in one tool, invoices in accounting.
- Flat monthly cleaner pay. Allocate across turnovers.
- Supplies bought in bulk. Allocate by turnover or by bedroom.
Related metrics
FAQ
- Should the cleaning fee cover the full cost?
- That is a business choice. The metric shows the gap so the choice is explicit.
- Are owner-stay cleans included?
- Show them separately; they are often billed to the owner.
- Is there a typical cleaning cost?
- We do not publish a benchmark. Levels vary by market, season, and property type.
For your data teamFormula variants, tables, SQL sketch, and dashboard spec
Formula details
cost_per_turnover = (cleaner_cost + supplies + laundry [+ inspection]) / turnovers
cleaning_margin = cleaning_fees_collected - cleaning_cost
Worked example detail
| Home | Turnovers | Cost | Fees | Gap |
|---|---|---|---|---|
| Beach house (3 bd) | 5 | $1,150 | $1,250 | $100 |
| Condo (2 bd) | 6 | $840 | $900 | $60 |
| Lake house (5 bd) | 3 | $1,260 | $1,200 | −$60 |
| Studio (1 bd) | 8 | $760 | $800 | $40 |
| Supplies | $330 | −$330 | ||
| Total | 22 | $4,340 | $4,150 | −$190 |
Tables and fields
| Table | Fields | Notes |
|---|---|---|
turnover_tasks |
task_id, unit_id, reservation_id, completed_at, team_id, cost, is_reclean | |
reservation_lines |
reservation_id, line_type, amount | cleaning_fee |
SQL sketch
SELECT t.unit_id, COUNT(*) FILTER (WHERE NOT t.is_reclean) AS turnovers,
SUM(t.cost) / NULLIF(COUNT(*) FILTER (WHERE NOT t.is_reclean),0) AS cost_per_turnover,
SUM(l.amount) - SUM(t.cost) AS cleaning_margin
FROM turnover_tasks t
LEFT JOIN reservation_lines l ON l.reservation_id=t.reservation_id AND l.line_type='cleaning_fee'
GROUP BY t.unit_id;
Build spec
Copy this into a ticket. It lists the grain, inputs, logic, and edge cases.
metric: hospitality.cleaning_turnover_cost
grain: one row per turnover task
inputs:
- turnover tasks with cost
- supplies allocation
- cleaning fee per stay
logic:
- cost_per_turnover = cost / turnovers
- margin = fees - cost
edge_cases:
- re-clean: add to original
- owner-stay clean: separate
- missing cost: flag
As a dashboard card
- Table by home with cost per turn, fee, and a gap column.
Common mistakes
- Ignoring supplies and laundry.
- Counting re-cleans as extra turnovers.
- Comparing to fees after channel fees on one side only.