A good homestay cleaning schedule is not a spreadsheet of checkouts. It is a rule that decides, for every unit and every day, whether a cleaner is needed, at what hour, and whether the room is really empty. In our PMS a booking write creates the job, a nightly run double-checks it, and three situations (extensions, late check-outs, duplicates) are handled by rules we learned the hard way across 100+ units.
Why does a cleaning schedule break when you run it by hand?
With 5 units, you remember who leaves when. With 100+, you cannot, and a hand-built schedule fails in two quiet ways. Either a checkout never becomes a cleaning job, so the next guest walks into a dirty room, or a job exists for a day when nobody actually left, so a cleaner knocks on a door where a guest is still asleep.
Neither failure throws an error. The first shows up as a one-star review about hair on the pillow. The second shows up as an angry message that starts with "someone tried to come in." Both come from the same root problem: the calendar and the cleaning list are two separate documents that someone has to keep in agreement.
The fix is to stop keeping them in agreement by hand. In AntlerHub the cleaning job is derived from the reservation, and it is re-derived whenever the reservation changes.
How does a booking become a cleaning job in AntlerHub?
Three things run together:
- On every reservation write. When a booking is created or changed, the system checks whether that unit turns over on the checkout day and, if so, creates one cleaning job for that unit and that day.
- A reconcile at 01:00 Malaysia time. Every night it walks today's checkouts again and fixes what the real-time step missed or got wrong.
- A seven-day sweep. Real-time triggers are fire-and-forget: a restart or a database hiccup can silently lose one. So the nightly run also looks back seven days for jobs stuck in the wrong state and repairs them.
The job goes to Cleanlemons, our cleaning-operations software, where cleaners see it on their own board. If you use your own cleaners through a WhatsApp group, this automation does not apply to you. It works because both sides are ours, so the link is a setting you switch on, not an integration project.
Cancelled and no-show bookings never create a job. A booking with no status is treated as valid.
What does the system do in each situation?
| Situation | What happens |
|---|---|
| Normal checkout, nobody checks in after | One job for that unit, starting 09:00 |
| Same-day turnover (one guest out, another in) | Job is created and flagged as back-to-back, because this is the day cleaning matters most |
| Guest paid for a late check-out | Job starts at the hour the room frees up, with a note such as "guest leaves 15:00 (late check-out)" |
| Late check-out bought after the job exists | A job the robot made, not started yet, is moved later; it is never moved earlier |
| Guest extends their stay | No job on the old checkout day, because the unit does not free up |
| Extension shortened back to the original date | The turnover is back, so the job is back |
| Two bookings land on one unit at once | Still one job per unit per day |
| A person created or edited the job | The robot leaves it alone |
That last row matters. The nightly reconcile deletes jobs it created itself when the checkout disappears, but it never touches a job created by a client or an operator by hand.
What are the three traps that sent cleaners to the wrong door?
These are real, and the rules above exist because of them. Details are kept anonymous.
Trap 1: the extended stay that looks like a checkout. A guest who pays to extend does not move the original booking's dates. A second booking is created that checks in on the day the first one checks out. On paper the unit turns over. In reality the same guest is still in bed. We sent a cleaner to a room where the guest was still asleep, on a day they had paid us to stay. The rule now follows the whole chain of bookings, including extensions that staff entered as a second Direct booking, and treats the unit as occupied. A genuine same-day turnover, where a different guest checks in, still counts.
Trap 2: the late check-out that nobody told the cleaner about. We sell late check-outs. A job created the day before still said 09:00 while the guest had paid to stay until 14:00. Same knock on the same door. Now the start time follows the late check-out, and a job that already exists is moved automatically. It only ever moves later, and only if it is the robot's own untouched job.
Trap 3: the same unit on the board twice. Three different paths can create the job for one unit and one day: the booking write, a self-healing step, and the nightly reconcile. When two of them ran at once, each saw "nothing scheduled" before the other had written, and the cleaner's board listed the unit twice. Creation is now queued per unit per day, with a database guard behind it.
What happens after the guest leaves?
The status chain matters as much as the job itself. When the guest checks out, the cleaning job moves from pending-checkout to ready-to-clean automatically. This used to be a manual button, and when nobody pressed it the cleaner stood at the door unable to press "start".
When the cleaner finishes, the unit flips from dirty to ready, so the calendar knows it can be sold. The system only repairs a unit that is still dirty; if the next guest is already in, occupied is newer and is left alone. The seven-day sweep fixes both directions if a step was missed.
What can go wrong, and what does this not do?
Being honest about the limits:
- It depends on the link. If the connection to the cleaning side breaks, jobs stop appearing. Our nightly run used to report success whatever happened, so a broken link looked identical to a quiet day. It now reports failure.
- If the system cannot read the extension picture, it does nothing. It neither creates nor deletes, because "unreadable" looks exactly like "nobody extended". That can mean a manual check on a rare day.
- The default is 09:00, not your checkout time. A cleaner sent too early is a knock; a cleaner never sent is a dirty room for the next guest. We chose the knock as the lesser evil.
- It does not choose the cleaner for you, and it does not make cleaning cheaper. It removes typing and reduces mistakes, nothing more.
- Test listings are skipped, so a listing marked as a test never creates a real job.
Is it worth it for a small operator?
If you manage under about ten units and the same person does the cleaning and the booking, a calendar and a good habit may be enough. The rules above start to pay off when the person making the schedule is not the person answering guests, because that is when "the guest extended" stops reaching the cleaner. For the sync side of the same problem, see Channel manager for Malaysian homestays: 7 things sync gets wrong, and for what a late check-out looks like from the guest's side, see Homestay check-out day in Johor Bahru.
If you want to see how AntlerHub runs housekeeping next to the calendar, start at /antlerhub.