Field Service Settings
Module configuration — most knobs are API-only today; the settings UI ships in the next release.
The FSM settings UI is queued for the next release (Phase 4.8 — see the implementation plan). Today the page at /fsm/settings is a stub that lists what's configurable via the v1 API. This doc describes what's actually configurable now, and what's coming.
Configurable today (via v1 API)
| Setting | API surface | Notes |
|---|---|---|
| Service-type → required-skill mapping | Workspace-scoped config — pass to dispatchOptimalTech({ service_type_skill_map }) per call today; persistent storage ships with the UI | Drives the 0.4-weight skill match in AI dispatch |
| SLA defaults per service contract | Set sla_response_minutes + sla_resolution_minutes on the contract row itself | Inherited onto any work order linked to the contract |
| Webhook subscribers | POST /api/v1/fsm/webhooks — pattern from lib/services/webhook-delivery-service | Substrate live; delivery cron is queued for Phase 4.10 |
| Intake email alias | service@… is built-in today; per-workspace override + service+slug@… patterns work out of the box | See Email Intake |
| Numbering prefixes | REQ, EST, WO, SC are hard-coded today; per-workspace overrides ship with the UI | All numbers carry the year (e.g. WO-2026-0001) |
Cron schedules
Two daily Vercel crons run today — no UI to change them (Hobby tier is daily-only):
| Cron | Schedule | What it does |
|---|---|---|
fsm-service-contract-due-renewals | 13:30 UTC | Generates fsm_service_contract_visits rows for active contracts past their next due date |
fsm-sla-breach-check | 14:30 UTC | Logs work orders past their response or resolution SLA deadline |
What ships with the Settings UI (Phase 4.8)
The settings page will live under /fsm/settings/* with the ModuleSettingsLayout wrapper used by every other module. Planned sub-pages:
| Page | Purpose |
|---|---|
| General | Default currency, numbering prefixes, default SLA minutes |
| Intake | Configure the intake email alias, default routing rule for non-email channels |
| Templates | Estimate templates, service-report header/footer, signature legal disclaimer |
| Dispatch | Default dispatcher view (board / calendar / map), working-hours overlay, map tile provider, GPS opt-in default |
| Service types | Service-type names + required-skill mapping |
| Skills | View the workspace skill taxonomy (read-only — actual CRUD lives in the People / Planning module today) |
| Service areas | Move from /fsm/service-areas (current standalone page) into the settings tree |
| Webhooks | Subscribe/unsubscribe webhook URLs per FSM event (appointment.scheduled, appointment.completed, estimate.approved, service_report.signed, etc.) |
| Numbering | Customize REQ / EST / WO / SC prefixes |
| Notifications | Per-event templates (in-app, email, Slack, Teams) — wires to notificationService (Phase 4.10) |
| Permissions | Territory-based permissions: assign users to service areas with a role (dispatcher / technician / viewer) — Phase 4.10 |
What ships with the Finance bridge (Phase 4.8)
Auto-invoice on completion will live in _bridges/finance_fsm and add:
- A
fsm_settings.auto_invoice_on_completiontoggle - A
fsm_work_orders.invoice_idback-link column - A service
createInvoiceFromWorkOrder(workOrderId)that materializes a draftfinance_invoicesrow + lines fromfsm_work_order_lines+fsm_parts_pulls - Auto-trigger: when a WO transitions to
completed, if the toggle is on, enqueue an invoice draft for review
The bridge folder exists today (_bridges/finance_fsm/) but only wraps the shared PDF renderer — the invoice path is the next addition.
Maintenance plan templates (Phase 4.10)
Today's fsm_service_contracts cadence generates planned visits. Phase 4.10 adds:
- Templates — pre-fill new visits with line items, parts list, required skills, duration
- RRULE support — replaces the enum cadence with RFC-5545 recurrence (every 6 weeks, first Tuesday quarterly, etc.)
- Skip / advance actions per visit
API access today
Everything the future UI will manage is reachable today through /api/v1/fsm/.... The v1 routes use getWorkspaceId middleware — authenticate with your workspace API key, then PATCH the relevant entity. Auth pattern documented under API.
Related
- Email Intake —
service@…alias - Dispatch — service-type → skill mapping context
- Work Orders — SLA fields