Hospitality · Operations

Cleaning turnover cost

Cleaning turnover cost is total cleaning cost divided by the number of turnovers, compared with the cleaning fees guests paid. It finds a quiet margin leak.

Plan your metrics

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.

Cleaning fee minus cleaner cost, per turnoverBeach house$20Condo$10Lake house−$20Studio$5fee $250, cost $230fee $150, cost $140fee $400, cost $420fee $100, cost $95Portfolio: 22 turnovers. Cleaner cost $4,010 + linens and supplies $330 = $4,340, or $197.27 per turnover.Cleaning fees collected $4,150. Gap −$190. The lake house loses $20 a turn before supplies.
Example data Cost per turnover and how it compares to the cleaning fee guests pay.

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.
Customer report mockupExample data
Cleaning cost by homeOctober 2026
Cost per turnover$197.2722 turnovers
Fees collected$4,150
Gap−$190incl. supplies
HomeTurnoversCost per turnFee per stayGap
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.

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.

Version 1.0 · Last reviewed 2026-10-20 · Machine-readable definition