Guided demo script

Facilities Manager — hands-on walkthrough

Facilities Manager is a facilities and fleet CMMS (computerized maintenance management system) for running the full lifecycle of maintenance work: someone reports an issue, it's triaged and turned into a work order, a technician is dispatched and completes the job, and a supervisor signs it off. The same platform covers the location/asset register, scheduled preventive maintenance, and inspections that can spin off their own corrective work.

This document is a hands-on walkthrough you can follow yourself in a live demo environment, clicking along step by step. Every step below was personally tested in the running application — the exact screen, the exact button label, and the exact values to type are all included so you never have to guess.

Application URL
facilities-manager.localhost
Sign in at
/operations/login
Email
demo@facilities-manager.localhost
Password
demo-password-123
One login, every role. Administrators, supervisors and technicians all sign in through this same screen — what differs between people is which pages they're sent to and what they're allowed to do.
Email notifications go to Mailpit, not real inboxes. This demo environment does not send real email. Every notification the system would normally deliver (work order assignments, approvals, and so on) is instead captured by Mailpit, a local mail-catcher, at localhost:8025. Keep a second browser tab open on that address while you work through the steps below — you'll see each notification land in real time, with the exact subject line and body the recipient would have received.
The seeded organization is "Meridian Facilities Group," with one location branch already built out from portfolio down to a room ("Room 301"), and one asset in that room ("Rooftop AHU Unit 1").
Scenario A

From a reported issue to a closed work order

This is the core loop of the product: someone reports a problem, it's approved and converted into scheduled work, a technician executes it, and a supervisor reviews and closes it.

  1. Go to /portal — the requester's "My requests" home. Click Request help.

  2. On the "How can we help?" form, fill in:

    • What kind of issue is it?Heating and cooling
    • How urgent is it?Urgent
    • Where is the issue? → pick the option ending in "Room 301"
    • What is happening? → a few sentences describing the problem (20+ characters required) — for example: "Rooftop AHU Unit 1 on Floor 91 is short-cycling and blowing warm air instead of cool air. It has been doing this since this morning and the room temperature is now above 27C, which is affecting the equipment stored in Room 301."
    • Optionally attach a photo under "Photos (up to 5)" — drag a file in or click to browse.
    • Click Submit request.
    What you'll see

    The request opens showing status Submitted, with an "Updates" timeline starting at "Request submitted."

  3. As a supervisor, go to /service-requests/triage. The new request appears with status Submitted. Click Decide, type a comment in Reason (e.g. "Confirmed with facilities team, HVAC issue affecting Room 301 is a priority."), and click Approve.

    What you'll see

    Status changes to Approved, and a Convert to work order button appears.

  4. Click Convert to work order.

    What you'll see

    The request disappears from the triage queue (it's been converted); a new work order now exists with a generated number like WO-202609-000001, visible under Work Orders in the left nav.

  5. Go to /dispatch (the Assignment board). The new work order appears in the Backlog column. Click Select for assignment on its card, then click the "Place [work order number] here" slot under the technician you want to assign it to.

    • A Start / End planned window appears — fill in both date/times, then click Assign.
    What you'll see

    The work order moves out of the Backlog and onto the technician's column with status Assigned. Check Mailpit — a "Work order [number] assigned" email has landed for that technician.

    Heads up

    If the technician hasn't been granted access to that location yet, you'll see a "NO ACCESS TO THE WORK LOCATION" warning and the assignment won't go through — grant access first from Facilities administration → Location Access Grants, picking the technician, the facility, and scope Operate.

  6. As that technician, open /technician (the Technician workbench). The assigned work order is listed with a Start work button.

    • Click Start work. Status becomes In Progress.
    • Under Notes, type a field note and click Add note.
    • Under "Put this job on hold", type a reason and click Pause work — status shows the pause; then click Resume work to continue.
    • Under the reading fields, type a Reading name (e.g. "Supply air temperature") and a Value (e.g. "18.5C"), then click Add reading.
    • Under Complete work order, fill in Action taken, Root cause, and Completion notes, then click Complete work order.
    What you'll see

    Status changes to Completed, and every action above appears in the Timeline at the bottom of the page.

  7. As the supervisor, open the work order at /work-orders/{id}. Under Review completion, type a comment and click Approve — status becomes Approved. Then under Close work order, type closure notes and click Close — status becomes Closed.


Scenario B

Assets, the location hierarchy, labels, and imports

  1. Go to Facilities administration → Hierarchy (/operations/hierarchy-tree). Type "Room 301" into the search box and click Search — the result shows the room with its full breadcrumb path (Portfolio / … / Room 301).

  2. Go to Assets (/operations/assets). The seeded asset "Rooftop AHU Unit 1" is listed. Scroll the table right to see the row actions: View, Edit, Print label, Archive, Upload photo, Upload document, Request move.

  3. Click Print label — this downloads a printable HTML label for the asset containing a scannable QR code that resolves back to the asset's page when scanned.

  4. Click Request move. Choose a destination under Move to (e.g. a different floor in the same building) and type a Reason (e.g. "AHU relocated to a dedicated mechanical bay on Floor 91 during the retrofit."), then click Submit.

    • As a manager, go to Asset Movements (/operations/asset-movements). The request shows status pending with Approve / Reject actions. Click Approve, add a note, and submit — status becomes approved and a Complete action appears. Click Complete, confirm, and status becomes completed.
  5. Go to Assets → Import CSV (/assets/import). Choose a CSV file and map its columns: asset_code, name, location_code, plus optional asset_tag and category_code. Click Preview.

    What you'll see

    A count of valid vs. invalid rows, with the specific validation error for any bad row (e.g. "This field is required" for a missing name) — nothing is written yet. Commit import only becomes available once every row in the file is valid — a deliberate safety gate so a bad batch can't partially land. Fix the file (or drop the bad rows) and re-upload; once the preview shows 0 invalid, click Commit import to create the assets.

  6. Back on the Assets list, click Upload photo on the asset's row. Choose a file under Photo, optionally type a Caption (e.g. "Rooftop AHU Unit 1 - contactor replacement, Sep 2026"), and click Submit. The photo is attached to the asset. Upload document on the same row works the same way — choose a file and submit.


Scenario C

Inspection checklists

  1. Go to Checklist Templates (/operations/checklist-templates/create). Fill in:

    • Name → e.g. "HVAC Rooftop Unit Safety Inspection"
    • TypeSafety
    • Applies toInspection
    • Under Checklist items, fill the first item's Prompt (e.g. "Is the unit free of unusual noise or vibration?") and set Response type to Yes/No. Click Add item for a second item (e.g. "Is the condensate drain clear and free of leaks?", also Yes/No).
    • Click Create.
  2. On the resulting Edit screen, click Publish and confirm. Publishing locks in an immutable version — editing the template afterwards does not change a version that's already published (a new one is versioned separately). The template list shows Published versions: 1.

  3. Go to Inspector workspace (/operations/inspector-workspace) and click Schedule inspection. Fill in the target asset, the inspector, an inspection type, and a scheduled date/time, then Save.

    What you'll see

    The inspection appears under Upcoming and on the workspace calendar with its type and target asset shown.

    Known gap

    This quick-schedule form doesn't currently offer a field to attach a checklist template to the inspection, even though the guided inspection screen (next step) needs one to show any items. Until that's added, linking the two is a one-line fix an administrator makes for you behind the scenes — worth flagging to your Facilities Manager contact rather than something you'll find a button for today.

  4. Open the inspection from the workspace calendar (or go directly to /operations/guided-inspection-execution?inspection={id}) and click Start inspection. Status changes to In Progress and the checklist's items appear, each with a Select an... dropdown (Yes/No for a boolean item) and its own Save button.

    • Answer the first item Yes and click its Save — a green Pass tag appears next to it.
    • Answer the second item No and click its Save — a red Fail tag appears, and the Preview result at the top of the page updates to Fail with a Preview score.
    • Under Comment, type a note (e.g. "Condensate drain has a slow leak at the trap; recommend replacement.") and click Add comment.
    • Under Signature name, type the inspector's name and click Capture signature — this satisfies the "capture a signature before completing" requirement shown in the checklist above the items.
    • Click Complete inspection.
    What you'll see

    Status becomes Completed, locking the checklist answers; the overall result and score stay visible as they were at completion.

  5. Go to Failed-item triage (/operations/failed-item-triage). The failed item appears grouped by severity (e.g. under MEDIUM), showing its prompt and the asset it was raised against. Click Raise corrective.

    What you'll see

    The button is replaced by the new work order's number (e.g. WO-202609-000002). Opening Work Orders (/operations/work-orders) confirms it: a work order titled "Corrective: [the failed item's prompt]" — one corrective work order per failed item, named directly after what failed, ready to be assigned and worked exactly like any other work order from Scenario A.


Scenario D

Preventive maintenance

  1. Go to Maintenance → Pm Schedules (/operations/pm-schedules/create). Fill in:

    • Name → e.g. "Rooftop AHU Unit 1 - Quarterly PM"
    • Applies toAn asset
    • Asset → search and pick "Rooftop AHU Unit 1"
    • Recurrence typeQuarterly
    • Checklist template version → pick the published version of the checklist template you created in Scenario C
    • Anchor date → any date (e.g. tomorrow)
    • Click Create.
    What you'll see

    The schedule is saved and linked to both the asset and the checklist, ready to generate its first work order occurrence on schedule (generating the same due occurrence twice never creates a duplicate work order — it returns the existing one).

  2. Go to Fleet Assets (/operations/fleet-assets/create) and create a vehicle: CategoryUtility Vehicles, Location → pick your facility, Code → e.g. "VEH-001", Name → e.g. "Utility Truck 1", leave Status as Available, then click Create.

  3. Go to Drivers (/operations/drivers/create) and create a driver linked to a real login: Linked user account → pick the technician you created earlier (e.g. "Jordan Silva"), Name"Jordan Silva", License number → e.g. "DL-4821093", License expires on → a future date, then Create.

  4. Go to /fleet/checkouts (Vehicle checkouts). The vehicle appears under Available. Click Check out, fill in Driver (pick the driver), Odometer (km) (e.g. "12000"), Fuel level (0–1) (e.g. "0.8"), Key reference (e.g. "KEY-014"), and Signature (the driver's typed name), then click Confirm checkout.

    What you'll see

    The vehicle moves to Checked out, showing who has it and since when.

  5. As that driver, sign in and open /driver-portal. Four actions are available on the checked-out vehicle: Pre-trip check, Log reading, Report defect, Report accident.

    • Click Log reading, leave Type as Odometer, enter a Value (e.g. "12085"), and click Log reading — it's recorded immediately under "What you've logged."
    • Click Report accident, fill in Location (e.g. "North Riverside Campus loading dock") and What happened? (e.g. "Minor collision with a parked pallet jack while reversing; rear bumper scraped."), then click Report accident.
    What you'll see

    A work order is created automatically — type fleet_maintenance, priority urgent — summarised from what you typed. Reporting the same accident again (the system recognises it by its own record, not by re-typing the same words) never creates a second work order; it always resolves back to the one already raised.

  6. Back on /fleet/checkouts, click Check in on the vehicle, fill in the closing Odometer (km), Fuel level, and Signature, then Confirm check-in — the vehicle returns to Available and the trip appears under "Recent activity" with its out/in odometer readings.

Known gap

Logging an odometer reading through the driver portal records the reading but does not itself check it against a maintenance interval — unlike an accident report, nothing today automatically raises a fleet maintenance work order purely from crossing a mileage threshold. The underlying idempotent "raise it once" mechanism is proven (see the accident step above, which uses the same mechanism), but the mileage-threshold trigger itself isn't wired up to any screen yet — worth confirming your fleet coordinator's expectations here before a demo leans on it.

Inventory and labor on a work order

  1. Go to Inventory Stores (/operations/inventory-stores/create) and create one: Code (e.g. "STORE-01"), Name (e.g. "Central Parts Store"), a required Location, optional Custodian, then Create.

  2. Go to Inventory Items (/operations/inventory-items/create) and create one: Code (e.g. "ITEM-CONT-40A"), Name (e.g. "HVAC Contactor, 40A"), Category (e.g. "HVAC parts"), Unit (e.g. "each"), Reorder level and Standard cost (numbers, default 0), optional Preferred vendor, then Create. Actual stock quantities live on a separate per-store ledger, not on this form.

Known gap

Reserving that stock against a specific work order, then issuing it against the reservation, is a real and tested capability (App\Actions\Inventory\*), but this session did not find a screen that exposes "reserve for this work order" or "issue" as a click — the Inventory Items/Stores screens above are plain admin CRUD, not a reservation workflow. Adding a labor entry to a work order (and having a supervisor approve it so its cost rolls into the work order total) is the same story: a real, tested capability with no verified click path yet. Both are worth a follow-up pass rather than demoing live today.


Part 2

Administration reference

The four scenarios above are the day-to-day workflows. Everything below lives in the administration panel (the same /operations/... area you've been using) and is where an administrator sets up the data those workflows run on: who has access, the location and asset structure, vendors, fleet and inventory records, and the audit trail. Each entry below is a compact reference, not a full walkthrough: how to get there, what the list page shows, and the create form's exact fields with a realistic example value — enough to recognise the screen and fill it in confidently the first time.

Organization & people

Organizations /operations/organizations

List shows Name, Code, Status, with an Edit action per row (no delete — status is how you retire one). New organization form: Name (e.g. "Meridian Facilities Group"), Code (e.g. "ORG-2836"), Status (defaults to Active).

Memberships /operations/memberships

List shows User, Email, Roles (as tags), with Edit and Delete. New membership form lets you pick a User and one or more Roles in one screen; a duplicate user+organization pairing is rejected at the database level.

Users /operations/users

List shows Name, Email, and an Admin column (a green check or red cross icon), with only an Edit action (there is no "New user" button — accounts are provisioned by invitation, not created directly here). The Edit form has just three fields: Name, Email, and an Administrator toggle — no password field is ever shown or settable from this screen.

Roles /operations/roles

New role form: Name (e.g. "Technician") and a multi-select Permissions field drawn from the platform's permission catalogue (e.g. work-order.complete, asset.archive). A duplicate role name within the same organization is rejected.

Teams /operations/teams

New team form: Name (e.g. "HVAC Field Team"), Status (Active by default), and a multi-select Members field.

Departments /operations/departments

New department form: Name (e.g. "Facilities Operations") and Status (Active by default).


Location hierarchy

Each level is a separate resource under /operations/..., and every create form requires picking its Parent from the level above (so a Building must pick a Facility, a Floor must pick a Building, and so on) — this is what keeps the tree consistent. The visual tree itself is covered in Scenario B under Hierarchy (/operations/hierarchy-tree).

  • Portfolios /operations/portfolios — top of the tree, no parent. Fields: Code (e.g. "PF-2405"), Name (e.g. "North America Portfolio"), optional Manager, Starts on / Ends on dates, Status.
  • Continents /operations/continents — Parent (a Portfolio), Code, Name, Status.
  • Countries /operations/countries — Parent (a Continent), Code, Name, plus optional Currency, Language, Timezone, Manager, Status.
  • Cities /operations/cities — Parent (a Country), Code, Name, required Timezone, optional Manager id, Status.
  • Facilities /operations/facilities — Parent (a City), Code, Name, required Address line 1, plus optional Address line 2, Postal code, Latitude/Longitude, Ownership type, required Timezone, an Operating hours key/value table (Add row to add entries), Opened on, Contact name/email/phone, Area sqm, Manager id, Status.
  • Buildings /operations/buildings — Parent (a Facility), Code, Name, optional Type, Area sqm, Floor count, Year built, Manager id, Status.
  • Floors /operations/floors — Parent (a Building), a required Number (not a name — floors are identified by number), optional Usage, Area sqm, Capacity, Status.
  • Rooms /operations/rooms (labelled "Rooms and zones" in the nav) — Parent (a Floor), Kind (defaults to Room; also covers zones), Code, Name (e.g. "Room 301"), optional Type, Area sqm, Capacity, Status.
  • Location Access Grants /operations/location-access-grants — covered in Scenario A: grants a User a Scope (View, Operate, or Manage) on a Location node id, with an Inherit toggle so the grant also covers everything below that node in the tree.

Work & maintenance admin

Work Orders /operations/work-orders

The administrative list/CRUD view of every work order, distinct from the technician/dispatch workflow in Scenario A. List columns: Number, Summary, Location (scroll right for more). The filter panel (funnel icon) offers Status, Priority, and Location. New work order opens the same create form referenced in Scenario A's gap note (Summary, Type, Source, Priority, Status, Scope).

SLA Policies /operations/sla-policies/create

Fields: Name (e.g. "Standard HVAC response"), optional Priority and Category (leave empty to match any), optional Location scope (applies to that location and everything under it), required Response target and Resolution target in minutes, a Business hours table (Day like "mon" + Open-close like "08:00-17:00", Add row for more), optional Holidays (YYYY-MM-DD), a required Precedence number (lower numbers win when multiple policies match), and Status.

Service Request Routing Rules /operations/service-request-routing-rules/create

Fields: Name, optional Category to match, optional Location scope, and either a Team or a Vendor (or both) to route matching requests to, a Precedence number, and Status.

Checklist Templates and PM Schedules are covered in Scenarios C and D.

Assets

The Assets resource itself (list, create, photo/document upload, labels, movement requests, CSV import) is fully covered in Scenario B.

Asset Movements /operations/asset-movements

The administrative list behind the "Request move → Approve → Complete" flow from Scenario B. Columns: Asset, From, To, Reason, Requested by, Status, with Approve/Reject actions on a pending row and a Complete action once approved.


Vendors

Vendors /operations/vendors/create

Code (e.g. "VND-001"), Name (e.g. "CoolAir HVAC Services"), a tag-style Service categories field (type a value and press enter for each, e.g. "hvac"), a Contacts key/value table (Add row, e.g. Key "Phone" / Value "+1-555-0142"), and Status.

Vendor Contracts /operations/vendor-contracts/create

Vendor (pick one), Name (e.g. "Annual HVAC Maintenance Agreement"), Starts on / Ends on, Value (a currency amount) and Currency (defaults to USD), a free-text Scope description, an Owner (defaults to the current user), and Renewal state (defaults to "Not due").

Vendor Compliance Documents /operations/vendor-compliance-documents/create

Vendor, Document type (free text, e.g. "Certificate of Insurance"), optional Document number, a required file under Path (choose a file), a Mandatory for engagement toggle, optional Expires on, and Status (defaults to "Current").


Fleet

Fleet Assets (create form covered in Scenario D) and Drivers (create form covered in Scenario D) live here too.

Fleet Defects /operations/fleet-defects/create

Fleet asset (pick one), Reported by (defaults to the current user), Severity (defaults to Medium), Status (defaults to Open), a required Description (e.g. "Rear left tire losing pressure faster than normal."), and Reported at (defaults to now).

Fleet Documents /operations/fleet-documents/create

Fleet asset, Type (e.g. registration, insurance), optional Number, a required file under Path, and optional Expires on.


Inventory & procurement

Inventory Stores and Inventory Items are covered above under Scenario D.

Purchase Orders /operations/purchase-orders/create

Reference is pre-filled with a generated value (e.g. "PO-GKJWBPYS", editable), optional Vendor, required Inventory store and Inventory item, required Quantity, optional Unit cost, and Status (defaults to Draft).


Audit

Audit Events /operations/audit-events

A read-only log. Columns: Occurred at, Action (e.g. "work_order.closed"), Actor, Target type, Target ID, Correlation ID, IP address, with a View action per row for the full before/after detail. There is no create, edit, or delete on this resource by design — it's a record, not data you manage. (Export and full review of the audit trail are out of scope for this walkthrough.)


Other supporting screens

A handful of operational pages round out the panel. These are supporting tools, not core workflows, so a quick look is enough:

  • Operational Inbox /operations/operational-inbox — a queue with tabs for Assigned, Unassigned, Overdue, Awaiting approval, and Inspections, each showing "nothing needs attention" until there's a matching work order.
  • Operational Search /operations/operational-search — a single search box across "assets, work orders, and locations you have access to."
  • Supervisor Dispatch /operations/supervisor-dispatch — a supervisor's triage view: tiles for Unassigned, Urgent, Overdue, Blocked, and Awaiting approval counts, with the matching work orders listed below (this is where the two work orders from Scenarios A and D showed up as unassigned/urgent while still in Draft).
  • Failed Item Triage /operations/failed-item-triage — covered in Scenario C.
  • Corrective Verification /corrective-verification (note this one lives outside /operations) — tracks corrective work raised from failed inspection items through Ready to verify, Waiting on work order, and Recently closed.
  • Compliance Evidence /operations/compliance-evidence — lists compliance obligations on the left and, once one is selected, its evidence pack on the right.
  • Auditor Workspace /operations/auditor-workspace — a read-only, evenly-sampled set of work-order records an auditor is authorised to see, each opening to its immutable timeline and evidence, with an Export sample to CSV button.
  • Shift Handover /operations/shift-handover — a simple form to flag something for the next shift: pick a Recipient, a category (e.g. "Unresolved work"), an optional Work order ID, and a free-text note, then Create handover; open items needing acknowledgement are listed below.