Maintenance
Projects, Requests, Visits, Visit Planner & Timesheets
Maintenance (/admin/maintenance)
Repairs and upkeep. Sub-pages in the sidebar: Projects (the front door) · Requests · Field visits · Visit planner · Timesheets.
The section was rebuilt around a simple idea: a report is not a job. Several people can report several problems that are really one piece of work, and one piece of work usually takes several tasks, only some of which involve going to the building. So there are now five words, and they mean different things.
The five words to learn
- Request (MNT-0001) — a report. "The window in 402 is broken." One per thing somebody told us. It never changes number and never disappears.
- Project (PRJ-0001) — the job. What we are actually going to do about it, from start to finish. A project holds one request or many.
- Task — one ordered piece of the project. "Inspection", "Order the glass", "Install". Some tasks are field visits; most are not. Tasks are numbered on screen, and that number is the order they happen in.
- Step — one line under a task. "Measure the window frame." Each step remembers which request it arrived with, so you can always see who asked for it.
- Data room — the project's files. Every photo, quote, invoice and receipt for that job in one place.
Everything else follows from those five.
Projects (/admin/maintenance)
The main screen. Three views, switched at the top of the page:
-
List — the whole hierarchy in one table: project, then its tasks indented under it, then each task's steps. The MNT reports themselves are not rows here — you read them by opening the project's Requests tab. A project row opens closed — it already tells you how many tasks it has and how far along they are — so click its arrow when you want to see inside.
Click a project's name to open it. The name is the link; the PRJ number is not shown on the row, because you only need it once you are inside. To rename a project, use Rename on its "⋯" menu — a single click on the name now opens the project, so it cannot also mean "edit this".
Nothing in this table is dragged. Rows are moved from the "⋯" menu — Move up, Move down, Move to project…, Merge into task…, and on a step Move to task…. Those were always the movements a keyboard and a screen reader could drive, and they are now the only ones, so there is one way to move a row rather than two that can disagree. (The Board still drags — see below. That is a different thing: there, the drop is the edit.)
How to read the indentation. Each level sits further right than its parent, with a faint vertical guide line running down from it — follow the line up and you are at the row something belongs to. The marks tell you what a row is: a numbered chip (1, 2, 3) is a task, and a tickbox is a step. A step that came in with a report says from MNT-#### beside it — that is where it came from, not where it lives; every step belongs to the task above it.
A new report becomes a project and one task, both named after it — nothing else. It used to also lay down a step repeating the same words, so one report painted three near-identical lines; and the task was called "Work", which nobody had chosen and which told you nothing when you were scanning a column of them. Older projects were renamed to match, and their leftover duplicate step removed where no one had touched it.
-
Board — projects as cards in status columns (Open / In Progress / On Hold / Completed / Closed). Dragging a card to another column is changing its status.
-
Gantt — one month at a time, one bar per task. The bar runs from the day the task is planned for (its own date, or the day of the visit it rides on) to the day it is due. Diamonds mark the project's due date and any dated steps. Use the arrows to move a month at a time.
Reading a row. Every project and task row shows when it was created, in a Created column you can sort by — click the header (or use the ⇅ Sort pill) once for oldest first, again for newest. It sorts projects only: a project's tasks stay in the order you put them in. The sort is kept in the URL, so a reload keeps it. The building is in the Location column and nowhere else — it used to repeat as a chip beside the project's number on every row, which cost the title its space and said nothing twice. A project with no building still says so in grey beside the number, because that is not a label but a warning: it marks the project whose visits land in the worker's building-less bucket and whose purchases book with no building attached, and Location can only render that state as a dash.
Flat or by building. A Flat / By building toggle above the table bands the list under building headings — alphabetical, with No building last. It is the project-list twin of the inbox's Newest first / By building switch. Every band starts folded away — you get the list of buildings, and open the one you came for — and its tickbox selects every project in it at once. The choice rides in the address bar, so a reload, a shared link, and coming Back out of a project all keep it.
What you can change without opening anything. Double-click a task's title or a step to rename it where it sits; for a project, whose name is a link to the project itself, use Rename on its "⋯" menu. A title cannot be left blank — clear it and the old one simply stays. A task's description, the row directly beneath an expanded task, is the exception: it may be emptied, and it saves with ⌘/Ctrl+Enter or by clicking away, because plain Enter starts a new line. Status, priority, owner and dates are all editable on the row itself. Tick some projects and the bar at the foot of the screen sets status, priority, manager or due date across every one of them at once, and tells you plainly if only some of them took ("9 updated, 3 failed"). It can only set a due date — clearing one stays a single-row edit.
Merging several projects at once. Tick two or more and press Merge on that same bar. They all fold into the oldest of them — the lowest PRJ number, which is the one already quoted in emails and on any share link you have sent out, so the merge costs you no reference anybody holds. Everything moves: reports, tasks, steps, purchases, files, work logs and history; each emptied project is then deleted. You are asked to confirm, and shown exactly which numbers are about to disappear. Afterwards you are offered a new name for the survivor, because that is precisely the moment its old one stops being true — five reports folded into the project called "Bed" leaves a job about a whole room named after one mattress.
Suggesting a name. Beside every project's name is a ✨ button — hover the row to reveal it, or on a touch screen it is always there — and the same thing sits on the "⋯" menu as Suggest a name (AI)…. It reads the reports inside the project and proposes a title and a one-line description. It only ever proposes: you are shown both in full and nothing is written unless you accept, because the title is what staff scan, what the contractor share page leads with and what an email subject quotes.
Across the top: counts for Open, In Progress and On Hold — click one to filter the list by it — plus an Overdue count. Overdue is not a status: it is every project whose due date has passed and which is not yet Completed or Closed, so a project can be On Hold and overdue. The counts are of the whole section, not of what the filters currently show, so they will not add up to the number of projects on screen.
Filters: free-text search, which matches any word anywhere inside a project: its title, description and notes, every task and step, the requests inside it (title, description, location, notes, model number) and its purchases (name, description, supplier). That matters because the reporter typed "window is broken" on the request while a planner later named the project "Room 402 — glazing". Numbers work too: type PRJ-0012 or MNT-0042 (or just the digits) to find that project, or the project holding that request; a number also still matches text, so "305" finds "Room 305". Every word you type must match somewhere. Plus, under + Filter, status, building, manager, priority, and source (Housekeeping or Manual). The list opens on Status is Open +2 (Open, In Progress, On Hold); remove that pill to include Completed and Closed projects.
Two create buttons. + Request files a new report — use this for anything somebody told you about. + Project opens a job with no report behind it — planned work nobody complained about (a scheduled boiler service, a batch of lock replacements). The new-project dialog offers Start from the standard tasks, which lays down Inspection and disposal → Order parts → Receive and install in that order, with the first and last already marked as site visits and the middle one not. Leave it unticked for a job that isn't shaped like that.
Statuses look after themselves, with two exceptions. A project moves to In Progress as soon as a task is started or a visit is booked, and to Completed once every request is finished and every task is done or skipped. On Hold and Closed are decisions you made ("waiting on the landlord", "we're done arguing about this") and nothing automatic will ever undo them — set them from the project's "⋯" menu. There is one automatic Closed, and it only ever tidies up: when a housekeeping report is edited so that an issue disappears, the request it raised is closed, and if that leaves a project holding nothing but that request — no step started or booked onto a visit, no steps ticked, nothing bought, no hours logged — the project closes with it. A project anyone has actually planned work on stays open and visible.
Inside a project
Click a project to open it. The title is editable in place: click it to rename (Enter saves, Esc cancels). The panel on the left holds building, unit, manager, priority, due date and notes. Tabs:
- Tasks — the tasks, in order. Each task has a status (Pending / In Progress / Done / Skipped), an assignee (see below), a scheduled date, a due date, its steps, its own files, and anything ordered for it. Open a task's panel from the small open icon beside its title — hover the row to reveal it, or on a touch screen it is simply always there — or from Open details, the first entry in that task's "⋯" menu. That panel is where you tick off the steps, schedule the visit and attach files, and it carries the "This task is site work (needs a visit)" tickbox, which is what puts the task in front of field staff. Double-clicking the title renames the task rather than opening it. Add a task with + Task; add a step straight under any task.
- Requests — one card per report folded into this project: its number, its category, who reported it, whether it came from housekeeping or the public form, its photos, and its own status and priority (both still editable). This is the provenance panel, not a second workspace. Move to another project… on a card re-files that one request — its steps, purchases, files, work logs and history go with it, and every purchase is re-booked against the destination's building.
- Files — the data room (below).
- Purchases — parts and materials bought for the job: item, which task it belongs to, quantity, unit cost and total, supplier, and status (Pending / Ordered / Shipped / Received / Returned). These become expenses automatically, booked against the project's building — so if a purchase moves to another project, its expense follows it.
- Activity — the full change history plus the hours logged against the job. Field workers write those hours through the share link; here you can only read them or delete one.
The header also carries Share link (below) and a "⋯" menu with Change status…, Merge into… and Delete project.
Share links — treat one like a key to the building
You cut a share link from a request, so the dialog asks you to pick one. That choice only records which report the link was cut from. The link opens the whole project. Anyone holding the URL is inside — no login, no password, no staff account — and sees:
- every request folded into the project, in MNT order: title, description, category, who reported it, and the photos that came in with it;
- every task, in order, with its steps, and for a task that rides on a visit, the date and the arrival window;
- the purchases (item, quantity, cost, supplier, status, receipt), the hours logged, the data-room files, and the full change history;
- the building's and the unit's handbook content — entrance code, key box, WiFi password.
The page title is the PRJ number, not the MNT number. Nothing in the project is hidden from the holder.
It is not read-only either. Whoever has the link can:
- move a task between Pending / In Progress / Completed;
- tick and untick steps;
- log hours against the job (those are the hours you read on the Activity tab);
- upload files into the data room and attach a receipt to a purchase;
- create a purchase — which books an expense straight to the P&L, against the project's building.
What it cannot do is mark a task Skipped, or put the project On Hold or Closed. Those stay office decisions, and the project's own status is only ever rolled up from its tasks.
So a share link is a building credential and a write handle on the money, in one URL. In practice:
- Send it to the contractor actually doing the work, and to nobody else in copy.
- Set an expiry when you create it. The dropdown defaults to No expiry; 7 / 30 / 90 days are right there.
- Revoke it when the job is done — the Share link dialog lists every link cut for the project, with its click count, and a Revoke beside each live one. Revoking is instant and permanent; cut a fresh link if you need one again.
- If a project holds work you would not show that contractor — another resident's report, a quote you are still arguing about — move that request to its own project before you share, because there is no way to hide part of a project from a link.
Requests (/admin/maintenance/requests)
The inbox. This is the old flat issues list, unchanged in how it works — one row per report — but its job now is triage: read what came in, then decide which reports are really one job.
Requests arrive three ways:
- Manual — you or another staff member filed it.
- Housekeeping — a cleaner recorded an issue during a visit and it was turned into a request automatically, carrying the photos they took.
- Resident report — a resident submitted the maintenance report form.
Columns: created date, request number, title, building/unit, the project it belongs to (Part Of counts its requests when it holds more than one), category (Plumbing, Electrical, HVAC, Structural, Appliance, Painting, Flooring, Pest Control, Cleaning, Safety, General), priority (Low / Medium / High / Urgent), status (Reported → Scheduled → In Progress → Completed / Closed), Manager and Worker (a wrench beside the worker means a field visit is booked; hover it for the details), due date, step progress and estimated cost. Created, request number, title and due date are sortable, from the header or the ⇅ Sort pill. Status and priority are editable straight in the row. + Filter covers status, category, priority, assignee, building and source, plus Grouping: Standalone (the only request in its project) versus In multi-request projects (already grouped with others) — counted across every request, not just the ones currently listed. The list opens on Status is Reported +2 (Reported, Scheduled, In Progress); remove that pill to include finished requests.
The search box matches any word in a request's title, description, location, notes or model number; MNT-0042 finds that request and PRJ-0012 the requests in that project.
The list itself can be read Newest first or By building. Select rows and the action bar offers Group into project… (two or more) and Schedule visit… (which is refused, with a count, if any of the selection is already on a visit or closed).
Every request belongs to a project — there is no such thing as a loose request. Filing a new one with + Request quietly wraps it in a new project of its own, so nothing is ever homeless; group it with something else later if it turns out to be part of a bigger job.
Grouping — the whole point
Select two or more rows in the inbox and choose Group into project. Either create a new project or fold them into an existing one.
The example this was built for: "window is broken" and "wallpaper is damaged" arrive as two reports about the same room. Grouped, they become one project — with the standard tasks, Inspection and disposal → Order parts → Receive and install — and Task 1, Inspection, now holds both lines: "measure the window frame" and "inspect the wallpaper". One person, one trip, one job.
What you need to know before you click:
- Everything the requests brought comes with them — their steps, purchases, files and history.
- Steps land on the task that matches, by title. If the target project has a task with the same name, the steps join it; if it doesn't, that task is added at the end rather than the steps being dumped onto task one. A fresh, unplanned request (whose only task is called "Work") sends its steps to the target's first open task.
- Building, unit and priority depend on which of the two targets you picked — the rules below apply to a new project only.
- Into a NEW project. Building and unit are worked out for you: the project takes the value every selected request agrees on, and is left blank the moment two of them differ. Priority becomes the highest of the ones you selected. That is why the dialog warns you when your selection spans two buildings — usually it means you have ticked one row too many.
- Into an EXISTING project. Nothing about the target changes. It keeps its own building, unit and priority, however much the incoming requests disagree with it, and every purchase that comes across is re-booked against that project's building — so a request reported for Building B, folded into a Building A project, starts costing Building A. There is no warning for that case: the only warning on this path fires when the target has no building at all. Check the target before you confirm.
- A project with no building sends its visits into the worker's building-less bucket and books its purchases to the P&L with no building attached. Both paths warn about it, but about different things — the new-project warning is "these requests span different buildings, so the project has no building"; the existing-project warning is "the target project has no building".
Move to project… on a single row does the same thing for one request — from the inbox, and from its card on the project's Requests tab. Merge into project… on a project does it for a whole project: its requests, tasks and files move to the survivor, every purchase is re-booked against the survivor's building, and the emptied project is deleted.
Suggest a name (AI) is on every project's "⋯" menu, and it exists because grouping makes titles go stale. A project raised from a housekeeping report is named after that ONE report — "Bed", "Vacuum Cleaner" — so the moment a second report joins it, the title describes a fraction of the job. Pick it and the reports inside are read back to you as a proposed title and one-line description.
It proposes; you accept. Nothing is written until you confirm, and the dialog shows both the new title and the new description in full, because accepting replaces both. Confirming is an ordinary edit: it lands in the project's Activity with your name on it, and you can type over it afterwards like any other title. If the suggestion is poor, cancel and ask again — it is not remembered and nothing changed.
It is told the building and room and instructed not to repeat them, since they are already on screen beside the title, and it is told not to invent a cause, a part or a cost that is not in the reports. A project with no reports behind it — planned work you opened yourself — will be named from its tasks instead.
Make it a task of… is the same move with a different shape, and it is the one for the five-reports case. Instead of pouring the source's tasks in beside the survivor's, the whole project becomes one task there, named after the project. So five housekeeping reports — five wrapper projects — become one job with five tasks, each still carrying its own report, steps, purchases and files. It refuses rather than guess in the two cases where folding would lose something: a project with more than one task (their order would be discarded) and a project whose task is already booked onto a field visit. Both say so, name the project, and tell you to merge normally instead.
The data room (a project's Files tab)
Every project has one, and it is the answer to "where is the quote for that job?".
- Filter with the switch above the files: All · Photos · Documents · Receipts. Group by task or by request when there are a lot of files.
- Upload with a target: the file can sit at project level, or be pinned to a specific task. Photos open in a lightbox; documents open in a new tab.
- Files that came from somewhere else — a photo out of a housekeeping report, a resident's upload — are listed here but cannot be deleted here. They belong to the report that owns them, and deleting them would blank the photo out of that report. Only files uploaded into the data room itself can be removed.
- The same task panel shows the same room, filtered to that task, so a worker looking at "Install" sees the glass measurements and not the whole job's paperwork.
Field visits (/admin/maintenance/visits)
Field visits — a worker physically going somewhere — listed by day: the assigned maintenance-capable staff member, the building, the time window, how many tasks the trip carries, its status (Scheduled / In progress / Completed / Cancelled) and its total cost. Filter by status, staff, building and a date range, and reschedule from the row.
A visit is a trip, not a job: several tasks, from different projects, can ride on one visit. Booking a task for the same worker, on the same day, in the same building automatically folds it into the visit that already exists rather than creating a second one. That is why the visit count is much lower than the number of tasks scheduled.
A visit a worker claimed themselves is theirs immediately. A visit an admin assigned has to be accepted or declined by that worker; a past-dated one that was never answered settles itself as accepted, because there is nothing left to act on.
Visit planner (/admin/maintenance/tasks)
Planning a month of field work, in three views — Calendar, Kanban and Gantt — filtered by staff, building and status. Cancelled visits are hidden unless you filter for them. On a phone the Calendar shows one button per day that has visits (the day number over a dot per visit); tap it to list that day's visits under the calendar. Use it to see whether Tuesday is already full before you promise a landlord a Tuesday.
Timesheets (/admin/maintenance/timesheets)
Monthly timesheets for maintenance staff, built from their completed visits — hours, wages and transit — mirroring the housekeeping timesheets. Click a staff row for the per-building month detail. Visits with no building roll into a "No building" bucket.
Who does a task or a step: the Assignee
Every task and every step has an Assignee — who does it. The picker lists, in this order:
- Office — office staff;
- Housekeeping & maintenance — every active housekeeper and maintenance staffer;
- House leader — the house leader of the project's building, when it has one.
Assignee is not Manager: the manager is always office staff and answers for the whole project.
When a task or step is given to a housekeeper, maintenance staffer or house leader, they get an email naming the project, the place, what to do and the due date, and the work appears in their own list — My maintenance for staff, the Maintenance page of the house-leader portal for a house leader. From there they can tick the checklist and mark the task done:
- given a task, they can tick every step under it and mark the task done;
- given only a step, they can tick that step, and leave the task for whoever owns it.
They cannot rename anything, reassign it, or see costs and purchases. Office staff assignment sends no email, as before. Marking a task done this way moves the project's status just as it does from this screen.
The work leaves their list once the task is done, or the project is completed or closed. A house leader's assignment counts only while they lead the project's building: if the project moves to another building, or the building gets a new house leader, it drops off their list and they can no longer tick it. Their name stays in the Assignee field until you pick someone else.
What field staff see on their phones
Maintenance staff work from My maintenance in the dashboard, not a separate app. It has two views, switched at the top: Unassigned (the backlog any maintenance staffer can claim) and My Tasks (what that staffer has taken or been assigned). Above them, Asked of me lists any task or step assigned to that person. A housekeeper who does no other maintenance also gets My maintenance while something is assigned to them, and sees only that section. From a job they can open its checklist — tickable one-handed, with a running "3/5 done" count — start and finish a visit, reschedule it, or say they cannot do it. Handbook, beside the job's building and room, opens the staff handbook for that place: the codes, wifi and house information they need on site.
Two things worth knowing when a worker asks:
- Each step shows the MNT number it came from. That is grouping paying off: one visit can carry two people's complaints, and the worker can tell which line answers which report.
- The tick is two-state — done or not done. In Progress and Skipped are office decisions a checkbox can't express, so an item in one of those shows as unticked with its status badge beside it. Ticking it marks it done; nothing is lost.
Ticking steps does not move the task or close the request. Marking the task done is the office's decision, or the person the task was assigned to.
Numbers, old links and other gotchas
- PRJ numbers have gaps, by design. The counter behaves like a ticket machine: a project that was started and rolled back still burns its number.
PRJ-0007simply may not exist, and the highest PRJ number is not a count of projects. Do not try to "fix" it and never quote it as a total — count the rows instead. MNT numbers do the same thing. - Old MNT links still work. Every
/admin/maintenance/<number>link ever pasted into an email, a Slack message or a bookmark now opens the project that request belongs to, with that request highlighted on the Requests tab. Links inside housekeeping reports and move-out reports go the same way. - A request's number never changes, even when it moves between projects. Quote MNT numbers to reporters, PRJ numbers to whoever is doing the work.
- Search by number. Type PRJ-0012 or MNT-0042 in either search box. A long run of digits (a model or phone number) is searched as text only.
- Requests, projects, tasks and steps are separate things with separate statuses. Closing a request does not finish the job; finishing every task does.
Quick answers
- "A resident reports a broken aircon." File it from + Request (category HVAC), set priority and building/unit. If there's already a project for that room, group the new request into it rather than starting a second job.
- "Two reports about the same room came in." Requests inbox → tick both → Group into project. Check the building warning before confirming.
- "Where are the photos / the quote / the receipt for this job?" The project's Files tab.
- "What did we spend on Building X repairs?" Purchases roll into Expenses automatically, booked to the project's building — filter Expenses by building, or open the project's Purchases tab.
- "What's overdue?" Projects screen, the Overdue counter at the top.
- "Why is PRJ-0007 missing?" It isn't missing — the number was burned by a project that was never saved. Normal.
- "Who reported this step?" The MNT number printed beside it.
- "I need to send this to a contractor." Open the project → Share link. Know what you are sending: the link opens the whole project — every request in it, the visit windows, the files, and the building's entrance code and WiFi — and the holder can tick off tasks, log hours and book purchases to the P&L. Set an expiry, and revoke it when the job is done. Picking a request in the dialog does not narrow what the page shows.