Requests & Violations
Work orders
Dispatch maintenance to vendors via email - no portal, no logins. AI triages text + photos, vendor replies thread back automatically, mark paid creates the expense record.
Last updated May 1, 2026
Work orders are how you dispatch maintenance to vendors entirely through email. There’s no vendor portal, no vendor logins, no app for them to install. You write what’s broken, AI triages it, the system emails the vendor, and their replies thread back into the work order automatically. When the job is paid, an expense record is created and linked back to the work order.
Prerequisites
Two things must be configured before work orders will work:
- Email Agent (IMAP) must be set up under Settings. Work orders depend on the inbox listener to thread vendor replies back to the right work order. If IMAP isn’t connected, dispatch emails go out fine but vendor replies won’t auto-attach. See Email Agent setup before using this feature.
- At least one vendor must exist with a valid email address. You can’t dispatch a work order to a vendor that doesn’t exist.
Add a vendor
Go to Admin Panel → Work Orders, then click Settings in the top right. Click Add Vendor and fill in:
- Name, email, phone - email is required for dispatch
- Trades - multi-select. These are the categories AI uses to match jobs to vendors: HVAC, plumbing, electrical, roofing, landscaping, pool/amenities, appliance repair, painting, pest control, general
- Preferred - when on, AI prioritizes this vendor when multiple vendors handle the same trade
- Visible to residents - controls whether the vendor appears in the resident-facing directory
- Certificate of Insurance (COI) - upload a PDF or image and set the expiration date. The data is captured today; automatic renewal alerts are on the roadmap
- Status - Active or Archived
Create a work order
Go to Admin Panel → Work Orders and click New Work Order.
- Type a description. Be specific. Example: “Kitchen sink leaking in unit 142B, water collecting under cabinet.”
- Optionally attach a photo. It helps AI categorize the issue and gives the vendor a visual before they arrive.
- Submit to AI triage. The system reads the description and photo and returns a trade category (e.g., Plumbing), the affected property, an urgency level (Routine, Urgent, or Emergency), a 2-3 sentence summary written for the vendor, and a vendor suggestion from your existing list (or null if no vendor on file handles that trade).
- Answer clarifying questions if AI is uncertain. Up to 3 multiple-choice questions appear as clickable chips. Common cases: which of two similar properties, which trade if it spans categories, urgency if the description is ambiguous.
- Review and dispatch. Click Submit. The system saves the work order with a unique ID like
WO-CRD2K3and emails the vendor via Resend.
What the vendor receives
The dispatch email subject is [WO-CRD2K3] Title of work order. The body includes the pre-approved spend limit (if set), the trade, the urgency, contact and access notes, and the AI summary. The vendor replies normally to that email - from their phone, their inbox, no app required.
The bracketed token (e.g., [WO-CRD2K3]) is the routing key. As long as it stays in the subject line of any reply, the system threads the reply back to the right work order. Most email clients preserve the subject automatically.
Vendor replies thread back automatically
An hourly inbox scan reads incoming email, matches the work-order token in the subject, and attaches the reply to the original work order. The email is marked Handled so it doesn’t appear in the regular inbox triage queue. The threaded conversation appears in the work order detail modal.
If a vendor strips the token from the subject (rare, but it happens), the reply falls back to sender-email + recent-dispatch matching - best-effort. If a reply seems missing, always check the Inbox tab.
Status lifecycle
| Status | Meaning |
|---|---|
| DRAFT | Created but not yet dispatched |
| REQUESTED | Dispatch email sent; awaiting vendor’s first response |
| ESTIMATED | Vendor sent a cost estimate |
| APPROVED | Admin confirmed the estimate |
| SCHEDULED | Work date/time set |
| IN_PROGRESS | Work underway |
| COMPLETED | Vendor marked finished |
| INVOICED | Invoice received |
| PAID | Expense record created |
| ON_HOLD / CANCELLED | Off the active flow |
The system parses each vendor reply for intent and auto-advances status: estimate → ESTIMATED, schedule confirmation → SCHEDULED, completion → COMPLETED, invoice → INVOICED. Admin can override any transition manually at any time from the work order detail modal.
Mark Paid creates the expense record
When a work order reaches PAID, the Mark Paid modal collects the payment amount, the date, and the method. The system creates an Expense record in the Transactions tab linked back to the work order via sourceWorkOrderId. Click the work order number from the transaction view to jump back to the conversation thread.
Editing and deleting
- Edit: open the detail modal and edit fields directly. Status changes log activity entries on the work order.
- Delete: only available before dispatch. Once a vendor has been emailed, archive instead of delete - the conversation history stays intact.
Troubleshooting
- Vendor reply isn’t threading back to the work order. Check the subject line. If the token
[WO-XXXXXX]was stripped, the email lands in the regular inbox. You can manually attach it from there. - Dispatch email never arrived. Check the email address on the vendor record first. Then check Email Agent (IMAP) status - if the connection is down, outbound email may queue.
- AI suggested the wrong vendor. Override before dispatch. The vendor dropdown shows all vendors with a matching trade.
- AI suggested no vendor. No vendor in your community handles that trade. Add a vendor under Settings, then re-trigger triage.