Team & Settings
Everything under the Settings sidebar item. Four sections.
Agency profile
- Name — displayed on owner digests + tenant report pages.
- ABN — displayed in footer of owner comms.
- Logo URL — paste-in today; proper upload planned. Rendered on
owner digests and the tenant
/report/{token}page (rendering wire-up partly shipped).
Team members
Roles:
| Role | Can do |
|---|---|
AGENCY_ADMIN | Everything, including inviting other admins |
PM | All maintenance / compliance / contractor / owner workflows. Cannot invite or manage billing. |
OWNER | (no login today — future) |
TENANT | (no login — the /report/{token} flow is public) |
CONTRACTOR | (no login — magic-link flow) |
Invites:
- Click Invite in Settings → Team members
- Enter email + pick role (PM or AGENCY_ADMIN)
- Copy the URL (email delivery via SES is planned but not yet wired)
- Share the URL however you like — the recipient opens it and sets a password to claim the seat
Invites expire in 7 days. The pending list shows all unused invites with a Copy URL and Cancel button per row.
Audit log
/audit-logs (admin-only). Every INSERT / UPDATE / DELETE on watched
aggregates writes an audit_events row via a Hibernate event listener.
Watched aggregates:
- MaintenanceRequest
- WorkOrder
- ComplianceTask
- Property
- Owner
- Tenant
- Contractor
- Agency (profile edits)
- TeamInvite (issue + accept + cancel)
Filters: entity type, event type (INSERT/UPDATE/DELETE), date range, actor (who made the change). Expandable rows show before/after JSON diff.
Retention: 7 years. No delete API — the audit log is append-only. If you need to prune historic rows for DB size, talk to us.
Notifications
The sidebar Notifications feed. Two tabs:
- Assigned to me (default) — notifications targeted at the calling PM, plus agency-wide ones (compliance, contractor insurance) that every PM should glance at.
- All in agency — every notification across every PM, useful for agency admins who want a full picture.
Routing
When a PM's action triggers an event, the resulting notification is assigned to that PM. They see it in their "Assigned to me" tab; it counts towards their sidebar unread badge.
Notifications without a specific PM (background scanner finds — say — an overdue compliance task) are agency-wide: every PM sees them in both tabs, and each PM independently marks them read.
Per-user read state
Read + dismiss state is per-user. PM Alice marking a notification read does not hide it for PM Bob. (Pre-V20 it did — that's been fixed.)
Kinds
| Kind | Trigger | Typically routed to |
|---|---|---|
MAINTENANCE_URGENT | New urgent request, SLA breach, duplicate detected | Tenant submission → agency-wide; PM-created → that PM |
WO_DISPATCHED | WorkOrder transitioned to ASSIGNED | The PM who dispatched |
WO_OVER_BUDGET | Invoice > costCeiling | The PM who created the WO |
WO_COMPLETED | WorkOrder transitioned to COMPLETED | The PM who created the WO |
COMPLIANCE_DUE | Compliance task due within 14 days | Agency-wide (scanner) |
COMPLIANCE_OVERDUE | Past due | Agency-wide (scanner) |
CONTRACTOR_INSURANCE_EXPIRING | Within 30 days | Agency-wide (scanner) |
Sources
- Hibernate post-insert / post-update listener — fires immediately
on entity changes (new MR, WO status transition). Reads
SecurityContextHolderto capture the acting user → assigned to that PM. - Daily scanner — runs at 21:00 UTC. No HTTP request context → agency-wide.
Unread badge
The nav shows the calling user's "assigned to me" unread count from
GET /api/v1/notifications?scope=MINE&limit=1. Independent of what
your colleagues have or haven't cleared.
See also
- Getting Started — steps 1–3 cover Agency + Team setup
- Compliance → Reminders