WorkestraDocs
ModulesField Service

Service Areas

Geographic zones used as a soft constraint by AI dispatch and as a filter in work-order lists.

A service area is a named geographic zone — a city, a region, a postal-code cluster — that your techs cover. Service areas are workspace-wide and lightweight: a few fields per zone, no PostGIS required.

Why service areas matter

Two places:

  1. AI dispatch scoring — if a work order's service_area_id matches a technician's home_service_area_id, that pair scores 0.9 on proximity (the highest signal in the 0.3-weighted proximity factor). Same-area-as-home is the single most useful proximity cue today.
  2. List filtering — appointment lists, dispatcher board, work-order list all filter by service area.

You can run FSM without service areas — proximity scoring falls back to coordinate distance decay, which works fine if every WO + tech has coordinates set. But for SMB workflows where "the Boston team handles Boston" is the model, service areas are simpler.

Creating a service area

Go to /fsm/service-areasNew service area.

FieldNotes
Name"Brussels Metro", "Greater London", "Northern California", whatever your dispatcher recognizes
DescriptionFree text — e.g. exclusions, special instructions
Bounding box (min/max lat + min/max lng)Rough rectangle for the zone — used by future map view; not enforced today
CitiesArray of city names — useful for cities @> '{Brussels}' style filters
Postal codesArray of postal codes the zone covers
ActiveInactive areas don't appear in pickers but historical assignments remain valid
ColorUI hint for the dispatcher board (any CSS color value)

The bounding box, cities, and postal codes are metadata today — the dispatcher uses the service_area_id link directly. When the map dispatch view ships, the bounding box and city/postal lists will drive auto-fit and visual zone overlays.

Assigning a service area

ToHow
A technicianOn the tech detail page, set Home service area
A work orderOn the WO detail page, set Service area (or inherit from the customer's address)
An appointmentInherits from the work order by default; override on the appointment for visits that happen in a different zone (e.g. tech meets the customer at their second office)

Updating zones

Service-area edits apply going forward — past appointments and work orders keep their service_area_id pointer regardless of subsequent edits to the area itself. To rename or rescope a zone, edit it in place; to "split" or "merge" zones, create the new zone(s), update technicians + open work orders, deactivate the old zone.

Deactivating vs deleting

ActionEffect
DeactivateHide from pickers; historical references preserved
DeleteHard delete the row; FK on fsm_work_orders.service_area_id and fsm_service_appointments.service_area_id is set to NULL via ON DELETE SET NULL

Deactivate by default — deletion is fine pre-launch but losing the labeled history later can hurt analytics.

Service-type → required-skills mapping

A related (but distinct) workspace-wide configuration is the service-type → required-skill map — e.g. "hvac" → ["skill-refrigerant", "skill-electrical"]. This drives the skill-match factor of AI dispatch. Today it's API-only; UI in Phase 4.8 alongside the rest of the Settings work.

  • Technicians — set a home service area per tech
  • Dispatch — how service_area_id matching feeds scoring
  • Settings — where the rest of dispatch config lives (Phase 4.8 UI)