It’s 9 p.m. and a host is scrolling three apps at once. Airbnb for tomorrow’s check-outs. Booking.com for tomorrow’s arrivals. WhatsApp, to tell the cleaner which apartments to do first.
Then she sees it. Apartment 3 has a guest leaving at 11:00 and a new guest arriving at 14:00. Same day. Three hours. Nobody told the cleaner.
This happens because the cleaning list lives in someone’s head. This post moves it into a Google Sheet. You type each booking once. The sheet works out every turnover, flags the tight ones, and gives your cleaner a short list for today and tomorrow.
It’s a build-along. Every formula is in a code block you can copy. If you’ve read The One Google Sheet That Runs a Small Business, this is the same idea, applied to the one job every host does after every stay.
The example we’ll use
This is a made-up example. Hoa runs six apartments in Đà Nẵng, near An Thượng. She calls them A1 to A6. Most guests book on Airbnb, some on Booking.com, a few message her directly. Two cleaners, Linh and Thảo, split the work. Check-out is 11:00 and check-in is 14:00 unless a guest asks otherwise.
If you have two units or fifteen, the sheet is the same. Only the number of rows changes.
The file has three tabs:
- Bookings: one row per stay. This is the only place you type.
- Cleaning: every upcoming turnover, built by formulas. You never type here.
- Today: today’s and tomorrow’s turnovers, for the cleaner.
Step 1: the Bookings tab
One row per stay. Not per night, not per guest. One stay, one row.
| Col | Header | Example | Who fills it |
|---|---|---|---|
| A | Unit | A3 | you (dropdown) |
| B | Guest | Ms. Thu | you |
| C | Check-in | 2026-10-21 | you |
| D | Check-out | 2026-10-24 | you |
| E | Nights | 3 | formula |
| F | Guests | 2 | you |
| G | Channel | Airbnb / Booking.com / Direct | you (dropdown) |
| H | Notes / requests | Baby cot, late arrival | you |
| I | Check-in time | 14:00 | you |
| J | Check-out time | 11:00 | you |
| K | Arrive at | formula | |
| L | Leave at | formula | |
| M | Next arrival | formula | |
| N | Window (hours) | formula | |
| O | Same-day? | formula | |
| P | Next guest’s requests | formula | |
| Q | Cleaner | Linh | you (dropdown) |
| R | Clean status | To do / Done | you or the cleaner (dropdown) |
Freeze the header row (View > Freeze > 1 row) so you always see which column is which.
Why Cleaner and Status live here
This is the one design choice that matters most, so here’s why.
The Cleaning tab is built by a formula. Every time you add a booking, the list re-sorts. If you typed “Linh” next to row 5 of that list, tomorrow row 5 might be a different apartment, and “Linh” would still be sitting there, now next to the wrong turnover.
So the rule is: anything you type goes in Bookings. Each stay ends in exactly one turnover, so the Cleaner and Status for “the clean after this stay” belong on the stay’s own row. The formulas carry them across.
The simple formulas
Put each one in row 2 and drag it down as far as you expect bookings to go (a few hundred rows is fine). The IF($A2="","",...) part keeps empty rows empty.
Nights, in E2:
=IF($A2="", "", D2 - C2)
Arrive at, in K2 (the date plus the time, in one value):
=IF($A2="", "", C2 + I2)
Leave at, in L2:
=IF($A2="", "", D2 + J2)
In a spreadsheet, a date is a whole number of days and a time is a fraction of a day. Adding them gives one value that means “21 October at 14:00.” That makes the next step easy. Format K, L and M as Format > Number > Date time so you can read them.
Step 2: find the next arrival in the same unit
For each stay, we want to know: after this guest leaves, when does the next guest arrive in the same apartment?
That’s the earliest “Arrive at” for the same unit, at or after this “Leave at.” MINIFS does exactly that. It returns the smallest value in a column, counting only rows that match your conditions.
Next arrival, in M2:
=IF($A2="", "", IF(MINIFS($K$2:$K, $A$2:$A, A2, $K$2:$K, ">="&L2) = 0, "", MINIFS($K$2:$K, $A$2:$A, A2, $K$2:$K, ">="&L2)))
In words: among all stays in the same unit (A2), find the earliest arrival that is on or after this stay’s departure. Google’s help page says MINIFS returns 0 when nothing matches, so the outer IF turns that 0 into a blank. A blank means “nothing booked after this yet,” which is useful to see too.
Window in hours, in N2:
=IF(M2 = "", "", ROUND((M2 - L2) * 24, 1))
The difference between two date-times is in days. Multiply by 24 for hours. Apartment 3 from the opening scene shows 3.
Same-day flag, in O2:
=IF(M2 = "", "", IF(INT(M2) = INT(L2), "Same-day", ""))
INT drops the time part, leaving only the date. If the next arrival is on the same date as this departure, it’s a same-day turn.
Next guest’s requests, in P2:
=IF(M2 = "", "", IFERROR(INDEX(FILTER($H$2:$H, $A$2:$A = A2, $K$2:$K = M2), 1), ""))
In words: find the stay in this unit that arrives at that next-arrival time, and bring over its Notes. This is how “Baby cot” ends up on the cleaner’s list for the clean before that guest, which is when it’s needed.
One honest warning: if you double-book a unit by mistake, two stays overlap and these numbers go strange (negative windows, odd matches). That’s actually a feature. A negative window is a bright sign you have an overbooking to fix.
Step 3: dropdowns for unit, channel, cleaner and status
Free typing is where sheets go wrong. “A3”, “a3” and “Apt 3” are three different units to a formula.
Select the column, then Insert > Dropdown, and type the options:
- Unit (A): A1, A2, A3, A4, A5, A6
- Channel (G): Airbnb, Booking.com, Direct
- Cleaner (Q): Linh, Thảo
- Clean status (R): To do, In progress, Done, Problem
You can also point a dropdown at a range (Google calls it “Dropdown from a range”), for example a small list of cleaners on a Settings tab. Then adding a new cleaner means adding one cell, not editing every dropdown. By default the dropdown rejects anything not on the list, which is what you want.
“Problem” is worth having. A broken kettle or a missing towel gets a status, and the note goes in column H.
Step 4: the Cleaning tab
Now the part that builds itself. Make a tab called Cleaning, type these headers in row 1:
Date · Unit · Out at · Next arrival · Window (h) · Same-day · Requests · Cleaner · Status
Then in A2, one formula fills the whole list:
=IFERROR(SORT(CHOOSECOLS(FILTER(Bookings!A2:R, Bookings!A2:A <> "", Bookings!D2:D >= TODAY()), 4, 1, 10, 13, 14, 15, 16, 17, 18), 1, TRUE, 2, TRUE), "No upcoming turnovers")
It looks long. It’s three small steps nested inside each other:
- FILTER keeps only stays that have a unit and check out today or later.
- CHOOSECOLS picks the columns the cleaner needs, in a new order: check-out date (column 4), unit (1), check-out time (10), then next arrival, window, same-day, requests, cleaner and status (13 to 18). The guest’s name and phone are left out on purpose.
- SORT orders the list by date, then by unit.
IFERROR catches the one case where FILTER finds nothing. Google’s help page notes FILTER returns #N/A when no rows match, and a friendly sentence looks better than an error.
Format column A as a date, C as a time, and D as a date time. Every new booking you type in Bookings shows up here, in the right place, on its own.
If you prefer QUERY (a function that lets you write something close to a database question), it can do the same job. I’ve used FILTER here because when a column mixes numbers and blanks, as Window does, QUERY can quietly treat the minority type as empty. FILTER doesn’t guess.
Step 5: make tight turnovers impossible to miss
A list with 40 rows in black text is a list nobody reads. Colour does the reading for you.
On the Cleaning tab, select A2:I, then Format > Conditional formatting > Custom formula is.
Rule 1, red, for any turnover with less than four hours:
=AND(ISNUMBER($E2), $E2 < 4)
Rule 2, amber, for any same-day turn:
=$F2 = "Same-day"
Put the red rule above the amber one in the rules list, so the more urgent colour wins when both apply. The $ before the column letter keeps every cell in the row looking at column E or F, so the whole row lights up.
Rule 3 (optional), grey text, for anything already done:
=$I2 = "Done"
Pick your own threshold. Four hours is just Hoa’s number for “one cleaner can’t do this comfortably alone.” If a deep clean takes your team five hours, use five.
Red should mean “act now.” If half the list is red, your threshold is wrong, or your pricing for same-day turns is.
Step 6: the Today tab for the cleaner
Your cleaner doesn’t need next week. She needs today and tomorrow. Make a tab called Today, copy the same headers into row 1, and in A2:
=IFERROR(SORT(FILTER(Cleaning!A2:I, Cleaning!A2:A >= TODAY(), Cleaning!A2:A <= TODAY() + 1), 1, TRUE, 3, TRUE), "No turnovers today or tomorrow")
In words: from the Cleaning list, show rows dated today or tomorrow, sorted by date and then by check-out time. Copy the same conditional formatting rules onto this tab.
On a phone, this is six or eight lines. That’s the point. The cleaner opens the Google Sheets app, taps Today, and sees which apartments, in what order, which ones are tight, and what the next guest asked for.
Step 7: sharing it with your cleaner, honestly
This is the part where people get surprised, so here’s what Google’s own help pages say, and what I’d do.
What doesn’t keep things private:
- Hiding tabs. Google’s help page says plainly that hiding a sheet is not the same as protecting it. A viewer who makes a copy of the file can unhide the hidden sheets.
- Filter views. A filter view shows a filtered version of the data, and you can share a link to one. It’s handy for convenience, but it doesn’t remove anything. Anyone with access to the file can still see every row. Even a view-only user can create their own temporary filter view.
- Protected ranges. These stop editing, not seeing. Google’s page says protection shouldn’t be used as a security measure.
Your Bookings tab has guest names, and maybe phone numbers. So decide what your cleaner should see.
Option A: a separate file, view-only (most private)
Make a second spreadsheet called “Cleaning – Linh & Thảo.” In A1:
=IMPORTRANGE("paste-the-URL-of-your-main-sheet-here", "Today!A1:I40")
The first time, it shows #REF! and an Allow access button. Click it. Then share only this second file with your cleaners as Viewer (Share, add their email, choose Viewer).
They see the Today list and nothing else. Your guest data stays in the main file, which they don’t have.
Two things to know. IMPORTRANGE refreshes by itself, but not instantly: Google’s page says it checks for updates every hour while the file is open, and changes in the source make open files reload. And because this file is view-only, the cleaner can’t tick “Done.” She tells you on WhatsApp, and you set the status in Bookings. For two to six units, that’s often fine.
Option B: share the main file, protect everything else (simplest)
If you trust your cleaners and they need to update status themselves, share the main file as Editor. Then go to Data > Protect sheets and ranges, choose the Bookings sheet, tick Except certain cells, and leave only column R (Clean status) open. Protect the Cleaning and Today tabs fully. Set permissions so only you can edit the protected parts.
Now the cleaner can change “To do” to “Done” from her phone, and can’t accidentally type over a formula or a booking. But remember, she can still see the whole file, guest names included. That’s the trade.
Neither option is wrong. Pick based on how many people touch the file and how much guest data is in it.
Where the bookings come from
Here’s the honest part. The sheet is only as good as the Bookings tab, and the Bookings tab is typed by you.
You might have heard you can pull bookings in automatically with the iCal link that Airbnb and Booking.com give you. I checked, and I wouldn’t build on it in Sheets:
- Airbnb’s own help page describes the calendar export as a way to sync availability: nights that are blocked or booked show as blocked on the other calendar. It doesn’t promise guest names, guest counts or requests, which are exactly what a cleaning list needs.
- Google’s IMPORTDATA function is documented for .csv and .tsv files, not calendar (.ics) files. People do hack around this, but you end up parsing a calendar file line by line with formulas. It’s fragile, and when it breaks, it breaks silently.
So my advice: add the booking to the sheet the moment the confirmation arrives. It takes about 30 seconds per stay. Check your platform’s reservations page once a week against the sheet, to catch anything you missed, and look out for changed dates and cancellations. When a stay is cancelled, delete its row. Version history (File > Version history) keeps a record if you ever need it.
That weekly check is boring. It’s also the thing that stops a cleaner turning up to an apartment where the guest is still asleep.
When the sheet stops being enough
This sheet goes a long way for 2 to 15 units. It breaks down in predictable places:
- You forget to type a booking. Then the formulas are confidently wrong.
- Dates change on the platform and the sheet doesn’t know.
- Requests arrive in messages, not in the booking, so they never reach column H.
That last one is a whole topic of its own. If guest messages are where your day goes, I wrote about automating guest messages without sounding like a robot.
This is the same job the morning briefing in Santara does: it lists the day’s arrivals, departures and cleaning from live booking data, so there’s no typing step to forget. But a host with a good sheet and a weekly check is in better shape than most, and the sheet costs nothing. If you’d rather start from a finished file than build from scratch, HiTaVa, the template business I co-founded, has rental management templates with the formulas already written.
The takeaway
- Type each stay once, in one Bookings tab. One row per stay.
- Put everything you type in Bookings, including Cleaner and Status, so it never drifts away from the right apartment.
- Let MINIFS find the next arrival, and let FILTER, CHOOSECOLS and SORT build the cleaning list.
- Red for tight windows, amber for same-day turns. Nothing else needs colour.
- Give the cleaner today and tomorrow only, and decide on purpose what she can see.
- Don’t trust a calendar link to fill it for you. Type it in, check it weekly.
A cleaning schedule that builds itself isn’t magic. It’s one tidy tab and a handful of formulas, doing every evening what you used to do from memory at 9 p.m.
Sources: Google Docs Editors Help pages for FILTER, SORT, CHOOSECOLS, MINIFS, IMPORTDATA, IMPORTRANGE, conditional formatting, dropdowns, filter views and protecting and hiding sheets; Google Drive Help on sharing roles; Airbnb Help Center on syncing your calendar. All checked October 2026.
Related: The One Google Sheet That Runs a Small Business, and Automate Your Guest Messages Without Sounding Like a Robot.



