Appearance
Toilet Hygiene
Cleaning a washroom on a fixed rota means cleaning it whether or not anyone has used it, and not cleaning it when four hundred people have. This app replaces the rota with what the sensors actually saw.
Who it is for
| Cleaning supervisors | The operations board: what is dirty, who is free, what is overdue |
| Cleaners | My Work — their own jobs, on their own phone |
| Facilities managers | The reports, the compliance exports, and the feedback |
Before it is useful
A zone per washroom, mapped to the app. Everything hangs off the zone. The mapping is done from Your Apps → Toilet Hygiene on the admin side, where you also give each washroom its code, stall and urinal counts, and opening hours.
Something that counts visits. A people counter on the door is the usual answer; a presence sensor works too. Without one the dirty score falls back to time alone, which is a rota with extra steps.
Opening hours per washroom. A washroom that is closed does not accumulate "time since clean" — nobody wants a 3 a.m. job for a mall toilet that opens at ten. Mark it 24-hour if it really is.
Cleaner accounts, as app users, if you want assignment and tracking. Give them tags as well and you can see where they are and how long a clean actually took.
The dirty score
Each washroom carries a score from 0 to 100 — higher is dirtier — recomputed every minute from a weighted sum:
| Contributes | Up to | From |
|---|---|---|
| Time since the last clean | 25 | Full once past the washroom's expected interval. Only while open; a closed washroom carries a flat 5 |
| Visits this hour | 20 | The people counter — one point per two visits, full at forty |
| Occupancy now | 15 | One point per person in the zone |
| Ammonia | 10 | If an air-quality sensor is bound and reads above 5 ppm |
| Humidity | 10 | If a sensor reads above 75 % |
| A cleaner stuck | 10 | A cleaner's tag has been in the zone for twice the expected clean time and is still there |
| Bad feedback | 5 | Any rating of 2 or below from the QR page in the last 24 hours |
| Missed schedule | 5 | A recurring clean is overdue |
The bands are green below 30, yellow to 60, orange to 80, red at 80 and above.
The point of a score rather than a timer is that it moves for the right reasons. A washroom nobody used stays green through its scheduled slot; one that took a conference crowd goes red long before the clock says it is due.
The score does not raise a job on its own
It colours the board. To turn it into work, give it a rule: a rule scoped to the washroom's zone with the action Auto-create cleaning WO (dirty score). The action carries its own threshold (70 by default), the work type, priority and due time, and a cool-off so a score flickering around the threshold does not raise a job a minute. The rule needs no condition of its own — the action fires whenever the score crosses a band and checks the threshold itself.
High traffic triggers immediately. The score is deliberately gradual, which means a sudden rush would take half an hour to show. A separate trigger watches the counter and raises a high-priority job straight away when this hour's visits pass a threshold — which is what people actually mean by "clean it when it gets busy". It is off until you switch it on per washroom, on the washroom's own page. The threshold is suggested from the stall and urinal counts and the floor area (never below 15 an hour), and you can override it. It will not fire while the washroom is closed, while a high-priority job is already open there, or within half an hour of the last time it fired.
The cleaning week
A recurring schedule is stored as a rule — every N minutes, between these hours, on these days, optionally pinned to a particular cleaner — not as a list of jobs. Nothing holds "the 10:30 clean on Tuesday" until the scheduler fires and writes a work order.
Two things happen at each slot that a paper rota cannot do:
- A clean washroom is skipped. Each schedule has a skip below score (30 by default). If the washroom is under it when the slot comes round, no job is raised and the board records why.
- An already-open job is not duplicated. If there is an open cleaning job on that washroom, the slot is marked against it rather than raising another.
The calendar view has to expand the rule into slots itself and then match each slot against what actually happened. A slot with no job against it twenty minutes after its time is a miss, and the board shows it as such rather than silently omitting it. Cleaners can attach photos to a job from the board, and there is a gallery of them per washroom.
Work orders
A job is a work order: raised by a rule on the score, by the high-traffic trigger, by a schedule, or by any other rule using the Create toilet-hygiene work order action (an ammonia sensor over its limit, a leak). It is assigned to a cleaner, acknowledged, and closed.
Assignment is automatic. When a job is raised the app scores every available cleaner — in the zone now, in the venue now, seen there in the last hour, holding the right role — and the washroom's dedicated cleaner outranks all of that when they are on shift. If the dedicated cleaner is absent, the backup takes it, and the job records which tier won. Cleaners marked absent (sick, on leave, off site) are never assigned.
Reassignment by hand exists because rotas meet reality: a cleaner goes off shift, another is nearer. The app offers the candidates rather than making you know the roster.
Stuck and overdue jobs escalate on their own. A job in progress for half an hour whose cleaner has not been in the venue for a quarter of one is re-dispatched to somebody else, its priority raised, and an incident recorded — up to three times. A job past its due time gets one incident, one priority bump and one re-dispatch; it does not keep climbing to urgent every ten minutes.
Compliance scoring is per work order, and answers two questions: was it closed inside the washroom's grace window, and by how many minutes was it late if not. The grace window is per washroom if you set one; otherwise five minutes for an urgent job, fifteen for high, thirty for medium, sixty for low. Those roll up into the reports, so "we cleaned everything" and "we cleaned everything on time" stay different claims.
Cleaner tracking
If cleaners carry tags, the live view reads the same positioning trail the rest of the platform uses. You see who is where, and how long they were actually in the washroom — which is the difference between a job marked done and a job done.
Dwell verification works from that trail without the cleaner touching the app. When the assigned cleaner's tag leaves the washroom, the job is closed automatically if they were inside for at least the expected clean time, and marked verified. If they were in and out in under it, the job is reopened with a note saying so — a clean recorded in fifteen seconds from the corridor is visible as one.
Feedback
A QR code by the door — there is a printable poster per washroom — opens a public feedback page for that washroom in English, Malay, Chinese or Tamil: no login, no app, one submission a minute per visitor. Complaints feed the score, so the thing people actually notice moves the queue. The app keeps feedback for four months.
Reports and exports
Cleanings per day, response time, dwell on close, the enter/exit heatmap by day and hour, per-cleaner throughput, coverage and absences, and the 30-day feedback picture. Because washrooms are zones, they also appear in the platform's own reports — Space Utilisation, Enter / Exit, Environment — with everything else.
Five compliance exports come as CSV for a date range: a HACCP-style verification log, a healthcare infection-control audit, a personal-data export for a subject-access request, the per-washroom audit trail, and a sustainability estimate.
When it disappoints
Every score is driven by time alone. Nothing is counting visits. Check the people counter is online and its zone is the washroom's.
The board is red but nobody has a job. The score raises nothing by itself. Add the rule above, or switch on the high-traffic trigger.
The high-traffic trigger never fires. It is off by default per washroom; or the washroom is outside its opening hours; or it fired within the last half hour.
Nobody appears on the live cleaner view. The cleaner app users have no linked entity, or their entities have no tags — people and assets is the chain.
Jobs keep going to the wrong person. Set a dedicated cleaner and a backup on the washroom; that outranks proximity.
Schedules look empty. The board expands a rule into slots; if the rule has no days or no hours set, there are no slots to show.