Contractors Overview
Contractors in PMFriend are agency-wide — not property-scoped. A plumber you've used on one property is available for every property in your portfolio.
Fields
| Field | Required | Notes |
|---|---|---|
businessName | yes | Display name on WO + magic-link pages |
abn | no | For invoice validation |
trades | yes | One or more from the trade enum (see below) |
email | either email or mobile required | Magic-link delivery target |
mobile | either email or mobile required | SMS delivery target |
insuranceExpiresOn | optional but strongly recommended | Drives ranking + CONTRACTOR_INSURANCE_EXPIRING notifications |
preferred | boolean, default false | +20 in ranking; used for your go-to vendors |
notes | free text | "prefers work orders before 4pm", etc. |
Trade enum
PLUMBER
GAS_FITTER
ELECTRICIAN
HANDYMAN
LOCKSMITH
CARPENTER
ROOFER
TILER
PAINTER
PEST_CONTROL
LANDSCAPER
APPLIANCE_REPAIR
CLEANER
HVAC_TECH
SMOKE_ALARM_CERTIFIER
In CSVs, trades are a semicolon-separated list: PLUMBER;GAS_FITTER.
In the UI, multi-select chips.
Getting contractors in
Three ways:
- CSV import — Settings → Import → Contractors. Bulk-load your existing directory in 30 seconds. See CSV Wizard.
- UI form — Contractors → New contractor.
- API —
POST /api/v1/contractors.
Ranking
When you dispatch a work order, the Ranked Picker shows the top 8 contractors ordered by match score. Rules:
+40trade match (contractor covers the work-order's trade)+20preferred+15insurance current+5insurance expiring within 30 days-50insurance expired
Each chip shows the score's top reason in plain English: "trade match + preferred + insurance current (expires 2026-06-30)".
Insurance expiry automation
The daily scanner flags any contractor whose insurance expires within 30
days with a CONTRACTOR_INSURANCE_EXPIRING notification. Once expired,
the ranked picker penalises them heavily — they'll appear at the bottom,
greyed.
Pages in this section
- Ranked Picker — how the sort order works
- Magic-Link Dispatch — passwordless tradie UX