Skip to main content

AI Property Suggestions

On any property's detail page, the AI suggested actions card shows 2–5 actionable items Claude has inferred from that property's current state. Each item has a CTA that can execute the whole chain in one click.

What Claude reads

ClaudePropertyAiSuggester sends Claude:

  • Open maintenance requests (title + category + urgency + age)
  • Recent completed work orders last 60 days (scope + cost + date)
  • Upcoming compliance tasks next 30 days (friendly name + due date)
  • Already-overdue compliance items
  • Insurance status (current / expiring / expired)

It does not send tenant names, emails, or PII.

Output structure

{
"suggestions": [
{
"kind": "COMPLIANCE_BOOK",
"title": "Book smoke alarm annual test",
"body": "Due in 11 days (2026-05-05). Smoke Alarm Pro available.",
"ctaLabel": "Book now",
"deepLink": "/maintenance?select=new&kind=COMPLIANCE_BOOK&complianceTaskId=CT-abc"
},
{
"kind": "REPEAT_PATTERN",
"title": "Third plumbing issue in 60 days",
"body": "Bathroom tap + shower mixer + kitchen sink. Consider a full bathroom plumbing inspection.",
"ctaLabel": "Draft inspection WO",
"deepLink": "/maintenance?select=new&kind=REPEAT_INSPECTION"
},
{
"kind": "INSURANCE_REMINDER",
"title": "Building insurance expires in 23 days",
"body": "Nominal Insurance Co. Remind the owner to renew via digest.",
"ctaLabel": "Draft owner digest",
"deepLink": "/owners/abc/digest/draft"
}
],
"modelVersion": "claude-haiku-4-5@prompt-v1"
}

Kinds

KindMeaningCTA behaviour
COMPLIANCE_BOOKCompliance task due / overdueTriggers ExecuteAiSuggestedAction → creates WO
INSPECTION_DUERoutine inspection dueTriggers ExecuteAiSuggestedAction → creates inspection WO
INSURANCE_REMINDERBuilding insurance approaching expiryOpens owner digest drawer
DIGEST_DRAFTGood moment to send fortnight digestOpens digest drawer
REPEAT_PATTERNMultiple similar requests at same propertyDrafts a "full inspection" WO
DISMISSNothing actionable; card shows "All clear"No CTA

The action chain

CTAs on COMPLIANCE_BOOK, INSPECTION_DUE, and INSURANCE_REMINDER kinds don't just navigate — they execute. One click chains four use cases:

1. SubmitMaintenanceRequest   (create the request)
2. ApplyTriageDecision (AI-picked category + urgency)
3. WorkOrderScopeDrafter (Claude drafts the scope)
4. ConvertRequestToWorkOrder (commit the WO with scope + ceiling)

Implementation: ExecuteAiSuggestedAction use case. Endpoint:

POST /api/v1/properties/{id}/ai-actions/create-work-order
Content-Type: application/json

{
"title": "Smoke alarm annual test",
"body": "Per VIC minimum standards. Tenant home Thu.",
"category": "OTHER",
"urgency": "NORMAL"
}

Returns:

{
"maintenanceRequestId": "MR-9981",
"workOrderId": "WO-4420",
"scope": "Book licensed smoke alarm technician...",
"costCeilingCents": 12000,
"modelVersion": "claude-haiku-4-5@prompt-v1"
}

The frontend deep-links to the new request via /maintenance?select=MR-9981 so the PM lands inside the drawer ready to pick a contractor.

Fallback

If Claude is unavailable, a rule cascade fires instead:

  1. Any overdue compliance → COMPLIANCE_BOOK suggestion per overdue item
  2. Compliance due within 14 days → COMPLIANCE_BOOK per item
  3. Open work orders ≥30 days old in IN_PROGRESSREPEAT_PATTERN flag
  4. Insurance expires within 30 days → INSURANCE_REMINDER
  5. None of the above → single DISMISS card "All clear at this property"

See also