Skip to main content

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:

RoleCan do
AGENCY_ADMINEverything, including inviting other admins
PMAll 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:

  1. Click Invite in Settings → Team members
  2. Enter email + pick role (PM or AGENCY_ADMIN)
  3. Copy the URL (email delivery via SES is planned but not yet wired)
  4. 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

KindTriggerTypically routed to
MAINTENANCE_URGENTNew urgent request, SLA breach, duplicate detectedTenant submission → agency-wide; PM-created → that PM
WO_DISPATCHEDWorkOrder transitioned to ASSIGNEDThe PM who dispatched
WO_OVER_BUDGETInvoice > costCeilingThe PM who created the WO
WO_COMPLETEDWorkOrder transitioned to COMPLETEDThe PM who created the WO
COMPLIANCE_DUECompliance task due within 14 daysAgency-wide (scanner)
COMPLIANCE_OVERDUEPast dueAgency-wide (scanner)
CONTRACTOR_INSURANCE_EXPIRINGWithin 30 daysAgency-wide (scanner)

Sources

  • Hibernate post-insert / post-update listener — fires immediately on entity changes (new MR, WO status transition). Reads SecurityContextHolder to 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