Field-Service Site Visits (Dynamics 365 CE)
A light, PSI-owned build on Dynamics 365 Customer Service that schedules on-site machine work straight from a customer Case — replacing how Monday.com was used to track scheduled site visits. Runs on Universal Resource Scheduling, not the heavyweight Field Service product.
Overview
When a machine needs field work, a CSR logs a Case, the work is quoted and approved in Business Central, and a scheduler drops it onto a technician’s calendar as a booking on a visual Schedule Board. The technician opens a dedicated app — PSI Service — and sees their own visits, each showing the exact machine being serviced, the customer site, and travel details, then performs the scoped work on-site.
It is built on Dynamics 365 Universal Resource Scheduling (URS) + Core Service Scheduling. PSI deliberately does not use the full Field Service product — it is well beyond PSI’s requirements (no work orders, no offline mobile app). Visits are typically multi-day / multi-week and on-site with laptop/wifi coverage, so the standard web app is the technician surface.
Case → Service Activity → Booking → Technician
(incident) (serviceappointment) (bookableresourcebooking) (bookableresource)
│ │ │ │
machine set here machine flows here placed on Schedule Board opens PSI Service app,
(skps_assetinvolved) (psi_machine) + assigned to a tech sees "My Site Visits"
Environment: Sandbox Progressive Surface (PSI’s own tenant). No production CE instance exists yet. See ERP Migration for the parallel Business Central work.
Background
PSI’s service partner (Sikich) prototyped a “visual scheduling” customization in the sandbox, pitched as a replacement for Monday.com site-visit tracking (engineer, date, purpose). PSI owns that work product per the MSA, so the first step was to capture the complete partner build — as editable unmanaged source and a managed package — into PSI’s version control (d365-ce-migration), independent of any single live environment.
With the work secured, PSI decided to finish it internally. The prototype scheduled work but stopped at the dispatcher’s board — it never carried the one thing that matters most to PSI, which machine a visit services, through to the technician. Closing that gap and building the technician-facing experience is what this effort delivered.
What was added
All net-new PSI work lives in the PSIExtensions solution (publisher prefix psi), leaving the captured Sikich Customer Service build untouched as a baseline.
| Component | Type | What it does |
|---|---|---|
psi_machine | Lookup | Machine (msdyn_customerasset) on the Service Activity, so the technician’s work record names the exact serial. |
| Machine autofill | Form script | Sets psi_machine automatically from the regarding Case (skps_assetinvolved); a one-time backfill filled existing records. |
| Travel & logistics | Fields | Flight details, lodging, rental car, per-diem estimate, notes — for multi-week trips. |
| My Site Visits | View | Per-technician list (owner = me, by date) with a Machine column. |
| Site Visit form | Form | A “Site Visit” section on the Service Activity form: machine + travel/logistics in one place. |
| PSI Service | Model-driven app | A dedicated, PSI-owned single-session app (psi_PSISiteVisits, originally “PSI Site Visits”) so the service team opens one clean app rather than Microsoft’s broad multisession Customer Service workspace. Broadened in August 2026 from technician-only site visits to Service / Customers / Machines navigation. |
| Machine project number search | Fields + Quick Find | psi_projectnumber on the machine (stored short + full, e.g. 1173 001173) added to the Customer Asset Quick Find, so searching a project number (e.g. 1173) finds the machine. |
| Explorer Link | URL field | psi_explorerurl → explorer.progressivesurface.com/#asset/{serial or project#} — one click to PSI Explorer (drawings, BOM, history, photo gallery). |
| Machine photo | Record image | The machine’s Explorer photo, transcoded TIFF→JPEG and set as the record image (thumbnail on form/views). Point-in-time; the Explorer link shows the live full gallery. |
How people use it
Scheduler — setting up & dispatching
- Log the case — create a Case for the customer; the machine goes on Asset Involved. The Case opens on the single locked-down Progressive Surface Case form.
- Quote & approve — work is scoped and quoted in Business Central; the customer approves before scheduling.
- Create the site visit — a Service Activity is created against the Case; the machine fills in automatically.
- Book it — drag it onto a technician’s calendar on the Schedule Board, setting start time and duration (single or multi-week).
Technician — on the job
- Open PSI Service — one dedicated, single-session app.
- See “My Site Visits” — your own visits by date, each showing the machine and customer site.
- Open the Site Visit — scope of work, the machine and its details, site address & contacts, and travel/logistics all on one screen.
- Perform the scoped work — do the job on-site, updating the booking status as you go.
Where it lives
| Repository | d365-ce-migration (GitHub Enterprise) — scripts, docs, both solutions as unpacked source |
| PSI solution | PSIExtensions — unmanaged source + managed build (all net-new PSI work) |
| Partner baseline | Captured Sikich CE build (SikichProgressiveSurfaceBaseConfigurations2026) — source + managed package, held untouched |
| Config data | Scheduling reference data (services, skills, booking statuses, board settings) snapshotted as JSON |
| Docs | docs/CE-Visual-Scheduling-Solution.md, docs/CE-Solution-Completion-Plan.md in the repo |
Build scripts are idempotent and replay into a new environment: build_sitevisit_schema.py, build_sitevisit_form.py, build_sitevisit_autofill.py, backfill_sitevisit_machine.py, export_scheduling_config.py.
Status & what’s next
The field-service capability is complete and verified end-to-end in the sandbox: a technician can open the app, see their own site visits with the machine populated, and open a visit showing scope, machine, site, and travel.
- Done — machine lookup, autofill & backfill · travel fields · My Site Visits view · Site Visit form · single-session PSI Service app mapped to the real CSR + Scheduler roles · Case locked to one form · machine photo (full-res) + Explorer link · cleanup of demo artifacts (duplicate booking status, demo bot) · managed build.
- Deliberately removed (2026-08-06) — the New Case command-bar button and the asset-level retrofit columns. Retrofits are modelled natively instead: Sikich adds a Project Type to
skps_projectand imports retrofits as projects, so the machine’s full build-and-retrofit history lives in the Projects subgrid. - Next — a small automation for Service Activities created outside the form (belt-and-suspenders; the interactive path is covered by the form script, existing records by the backfill).
- Deploy — stand up a dedicated DEV environment, then production: install URS + Core Service Scheduling, import the managed build, migrate reference data, recreate resources, and re-couple Business Central (match on the 6-digit customer number before enabling sync).
Related
- ERP Migration Tool — the parallel AFTEC → Business Central migration; billing flows there.
- Customer Service Manager — the UniData-era service-ticket web app.