Ranked Contractor Picker
When you open the Dispatch drawer on a work order, the contractor picker isn't a plain dropdown. It's a ranked shortlist with explanations.
What you see
Suggested contractors for WO-4420 (trade: PLUMBER)
[✓] Harbour Plumbing — trade match + preferred + insurance current
[ ] Acorn Pipes & Gas — trade match + insurance current (expires 2026-06-30)
[ ] Southside Mechanical — trade match + insurance expiring in 18 days
Show all contractors…
The top candidate is pre-selected. You can override with one click or click Show all to reveal the full directory.
How the score is computed
score = 0
if contractor.trades contains workOrder.trade: score += 40
if contractor.preferred: score += 20
if insurance_current: score += 15
elif insurance_expires_within_30d: score += 5
elif insurance_expired: score -= 50
Score range: -50 to +75. A contractor without a trade match usually doesn't appear at all unless the picker has fewer than 8 trade-matching results, in which case the picker falls back to partial matches to give you something.
The weights are deliberately simple and rules-based, not AI. Three reasons:
- Explainability — a PM should be able to look at the chip and understand why it's first.
- No LLM dependency for a dispatch-critical surface.
- Weight tuning from feedback is trivial when it's four
ifstatements.
AI-driven contractor matching (incorporating historical completion rate, PM satisfaction, on-time %) is on the roadmap.
API
GET /api/v1/work-orders/{id}/suggested-contractors
Returns up to 8:
{
"suggestions": [
{
"contractorId": "C-harbour-plumbing",
"businessName": "Harbour Plumbing",
"score": 75,
"reasons": ["trade match", "preferred", "insurance current"],
"insuranceExpiresOn": "2027-06-30"
}
]
}
See also
- Contractors Overview
- Magic-Link Dispatch — the next step
- AI Contractor Matching (roadmap)