A deep clean rotation scheduler is one ranked list: every room sorted by days since its last deep clean, filtered to the rooms vacant tonight, capped at your crew's daily capacity. That algorithm fits in a spreadsheet. What kills most rotations is not the tracker but the promise behind it: a 120-room hotel on a 90-day cycle must complete 1.34 deep cleans per day on average, every day, including sold-out weeks, and a two-person team working 4 to 6 hours per room delivers about 2 per weekday. Run that math before building anything, because no software rescues a cycle the capacity never supported.
Every housekeeping department has a deep clean program on paper: mattress rotation, carpet extraction, high dusting, grout scrubbing, drapes to the cleaners. What most departments do not have is an answer to "when was 412 last done?" that survives a change of executive housekeeper. The program lives in a binder, a whiteboard grid, or one supervisor's memory, and when occupancy spikes for a season, the rotation quietly stops and nobody notices until the carpets tell you. This guide is the internal tool that fixes that: the math, the algorithm, and the build, whether you do it in Google Sheets in an afternoon or hand the spec to an AI coding agent. It is the hotel sibling of our housekeeping board build guide and shares its data model.
First, check the cycle is even achievable
The deep clean is a fundamentally different unit of work from daily service. According to SiteMinder's hotel housekeeping guide (siteminder.com), a checkout clean runs 30 to 45 minutes and a stayover service 20 to 30. According to William D. Frye, writing in The Rooms Chronicle (roomschronicle.com), a deep clean takes a total of 4 to 6 hours in the room, works best with two housekeeping employees working together, and pulls the room out of salable inventory while it happens. You cannot absorb that into the regular board; it needs its own schedule, its own capacity, and its own math.
The industry baseline for that capacity is well documented. According to the same Rooms Chronicle article, most hotels deep clean 0.5 to 1.5 percent of their guestroom inventory per day outside peak periods, so a 300-room hotel averages 2 to 3 rooms daily, normally on weekdays between 9am and 5pm, clustered on one floor so equipment does not travel and noise stays contained. And the cycle those daily numbers add up to is also documented: Frye reports most guestrooms are deep cleaned between two and four times a year depending on occupancy, and according to Breezeway's hotel housekeeping checklist guide (breezeway.io), a thorough deep clean should ideally be performed every three to six months for all guest rooms, with a more extensive annual pass for mattress flipping and professional carpet cleaning.
Now the worked example. Say you run 120 rooms and you want the strong version of the standard: every room deep cleaned every 90 days, with one dedicated two-person team at 2 rooms per day.
Three honest conclusions fall out of that worksheet. First, the cycle is a capacity decision, not an aspiration: if you cannot fund roughly rooms ÷ cycle-days cleans per day after weekends and holidays, pick a longer cycle instead of silently missing a shorter one. Second, occupancy is a constraint on which rooms, rarely on how many: even at 85 percent occupancy, 18 of 120 rooms sit vacant on an average night, plenty to fill 2 slots, but a genuinely sold-out stretch takes your capacity to zero and the schedule has to bank slots before it arrives. Third, seasonality is your friend if you plan it: front-load the rotation in shoulder months so the high season inherits a young rotation rather than an overdue one. Note the interaction with your nightly numbers too, since a room blocked for deep cleaning comes out of the sellable count your room attendant quotas and forecasts are built on.
The daily selection algorithm
With the cycle proven feasible, the scheduler itself is almost embarrassingly simple. It is a round-robin driven by one number per room: days since the last completed deep clean. Every morning, run the same five moves.
This is the whole "algorithm." The room that has waited longest is always next in line. No clever weighting needed until the basics work.
A deep clean needs the room empty all day, so the candidate pool is tonight's vacant rooms plus anything already out of order. Pull this from the PMS availability screen or the night audit report.
Vacant but assigned to a same-day arrival is not vacant for your purposes. Neither is a room engineering already has torn open. What survives is the usable pool.
Capacity throttles the list, not the other way around. Prefer picks on the same floor: Frye's guidance is to cluster the day's rooms in one section so equipment, noise, and furniture moves stay contained.
Front office blocks the picks for the day, the team works the task list, and completion writes today's date back to the room's record. Tomorrow's ranking rebuilds itself from that one write.
The elegance of ranking by age is that it self-heals. Miss a week because of a citywide sellout, and nothing needs replanning: the skipped rooms are now the oldest, so they float to the top of every subsequent day until the rotation catches up. A calendar-based plan ("room 101 on March 3") shatters the first time reality disagrees with it; a ranked list never does.
The same view, as the heat map your tracker should be able to show. Each cell is a room, colored by days since its last deep clean on a 90-day cycle. A healthy rotation looks evenly mixed; clumps of amber and red are the drift the daily algorithm exists to prevent. (Illustrative data.)
The build, step by step
Define the deep clean task list per room type
The Rooms Chronicle article breaks a guest room deep clean into ten task areas: high dusting, light fixtures, window areas and drapes, servicing the bed (including rotating or flipping the mattress per the manufacturer's recommendations), washing walls and doors, cleaning furniture, engineering repairs done concurrently, shower curtain replacement, tile and grout scrubbing, and carpet shampoo or extraction. Write your version once per room type: a suite with a sofa bed and a kitchenette is a different task list, and a different time budget, than a standard king. If you also run vacation rentals, our deep cleaning checklist is free source material for the task content.
Set the cycle, and let the math set it with you
Pick the cycle from the worksheet above, not from ambition. The documented range is two to four deep cleans per room per year (The Rooms Chronicle) and every three to six months (Breezeway). A 90-day cycle you hit is worth more than a 60-day cycle you miss, because a missed cycle destroys the team's trust in the whole system. Separate programs can run on separate cycles: quarterly deep clean, semiannual drape cleaning, annual mattress replacement review. Each is just another date column and another ranking.
Build the tracker: a spreadsheet is a legitimate v1
One row per room, columns for room, type, floor, last deep clean date, and tonight's status. Three formulas do the work (Google Sheets or Excel 365, cycle length in H1, last-clean dates in column C, tonight's status in column E):
D2: =TODAY()-C2 gives days since. F2: =IF(D2>$H$1,"Overdue",IF(D2>$H$1*0.8,"Due soon","OK")) gives the status flag. And the daily pick list is one formula: =TAKE(SORT(FILTER(A2:E121,E2:E121="Vacant"),4,FALSE),2), which filters to vacant rooms, sorts by days-since descending, and takes the top 2. Add conditional formatting on the days-since column and you have the heat map above for free.
When to graduate: the sheet breaks down when several programs overlap (deep clean plus quarterly PM plus annual tasks), when multiple people edit it, or when nobody stamps completions reliably. That is the point to build the small app, on the same data model as the rest of your ops stack; see step 7's agent prompt.
Fold preventive maintenance into the same rotation
Frye describes deep cleaning as "really the combined process of repair and preventative maintenance": while housekeeping deep cleans, an engineer concurrently spot-repairs wall coverings, furniture, and fixtures, and the room does not return to salable inventory until those repairs are done. Exploit that. The room is already vacant, blocked, and torn down to the frame, so the marginal cost of running the PM checklist (outlets, lamps, PTAC filter, door lock, drain flow) in the same visit is near zero. In the data model this is simply a second recurring program attached to the same room, completed by a different department on the same day.
Coordinate with front office: block the room honestly
A deep clean day removes the room from sellable inventory, so give it the status that says so. In most PMS conventions that is OOO (out of order, removed from availability) rather than OOS (out of service, a flagged deficiency on a room that can still sell); our room status codes reference covers the distinction. Make the block a request the front office confirms, not a silent edit, and agree the return path in advance: Frye's rule is that the room goes back on sale only after both the cleaning and the concurrent repairs are complete. Booking the block the night before, from the ranked list, is what keeps revenue management from ever being surprised.
Log completion with photo documentation
A deep clean is the easiest clean in the building to fake on paper, because nobody re-checks behind the headboard for another 90 days. So the completion record should be evidence, not a checkbox: the date, who did it, which task list version, and photos of the work that hides (mattress tag after rotation, extracted carpet while damp, grout lines, the dusted vent). That photo set does double duty as a condition baseline: it is the documented state of the room at its best, which is what makes damage found later provable and dateable. This is exactly the class of documentation RapidEye reviews automatically for hotel and rental operators, so if your team is already capturing it, the review does not have to depend on a supervisor having time.
Audit drift monthly
Two numbers tell you whether the rotation is healthy: the overdue count (=COUNTIF(D2:D121,">"&$H$1)) and the oldest room's age (=MAX(D2:D121)). Review both monthly. Overdue count creeping up means capacity is short of the math; oldest-room age spiking means specific rooms keep losing the vacancy lottery, usually your best sellers, and they need a deliberate block rather than another spin of the round-robin. If the heat map shows a whole floor aging together, the clustering habit has quietly become a bias.
Hand it to your coding agent
If you are past the spreadsheet stage, the prompt below scopes the v1 app and points the agent at our hotel operations reference schema so it does not invent its own tables. Paste it into Claude, Cursor, or whatever you build with:
Build a deep clean rotation scheduler for my hotel.
First, fetch and read the reference data model:
https://rapideyeinspections.com/blog/hotel-operations-data-model/schema.sql
Use its room, room_status_log, hk_task, and pm_schedule tables
(drop the rest for now). Hard rules:
- pm_schedule defines each recurring program (deep clean every
90 days, room PM every 90 days, drapes every 180). A room's
"last done" date is derived from completed hk_task history,
never stored as a mutable field someone can fat-finger.
- Daily selection: rank rooms by days since last completed
deep clean, descending; filter to rooms vacant tonight per
room_status_log and not assigned to an arrival; prefer same-floor
groupings; take the top N where N is today's crew capacity.
- Completing a task writes an hk_task row with completed_at,
who did it, the checklist used, and links to photo evidence.
Append-only; corrections are new rows.
- Today's picks generate a room block request (OOO for the day)
that front office confirms; the room returns to inventory only
when the task, including maintenance items, is closed.
- All timestamps UTC.
Phase 1: the ranked daily pick list, a one-tap completion flow
that stamps date + photos from a phone browser, and a drift
dashboard (per-room heat map by days-since, overdue count,
oldest-room age). Seed 120 rooms across 4 room types with
randomized history so I can demo it immediately.
The reference schema this prompt fetches is documented in full, table by table, in our hotel operations data model. The same schema drives the housekeeping board build, so the two tools share rooms, statuses, and task history instead of becoming two more disagreeing systems. And if you run mixed portfolios, the STR equivalent of this whole exercise is the vacation rental ops platform guide, with deep clean frequency for rentals covered separately.
Quick FAQ
How often should hotel guest rooms be deep cleaned?
Between two and four times a year for most hotels, depending on occupancy. According to William D. Frye in The Rooms Chronicle, higher-occupancy hotels need the more frequent end of the range because occupancy drives wear on furniture, fixtures, and equipment. Breezeway's hotel housekeeping guide similarly recommends a thorough deep clean every three to six months for all guest rooms, plus a more extensive annual pass for mattress flipping and professional carpet cleaning.
How many rooms can a hotel deep clean per day?
Far fewer than turnover cleans. According to The Rooms Chronicle, a deep clean takes 4 to 6 hours per room versus roughly 30 minutes for daily service, works best with two attendants together, and most hotels deep clean 0.5 to 1.5 percent of inventory daily, so a 300-room hotel averages 2 to 3 rooms. Plan on about 2 rooms per weekday per dedicated two-person team.
Is a spreadsheet enough for a deep clean rotation, or do I need an app?
A spreadsheet is genuinely enough for one program at one property; the three formulas in step 3 cover a 100 to 200 room hotel. Build the app when several cycles overlap (deep clean, quarterly PM, annual tasks), multiple people edit, or you want completion logging with photo evidence and derived due dates on the shared schema from our hotel operations data model.
Should a room being deep cleaned be set to OOO or OOS?
OOO in most PMS conventions, because a deep clean genuinely removes the room from salable inventory for the day, which is what OOO means; OOS typically flags a minor deficiency on a room that can still sell. Conventions vary by PMS, so confirm yours; the distinction and the full code list are in our room status codes reference.
Sources
Sources are named at the publisher level with their root domain, rather than linked or titled; every figure is verifiable at the named source.
- The Rooms Chronicle, guest-room deep cleaning guidance (William D. Frye, Ph.D.)roomschronicle.com
- Breezeway, hotel housekeeping resourcesbreezeway.io
- SiteMinder, hotel housekeeping guidesiteminder.com

