Control who receives SMS alerts when trouble tickets arrive. Check specific states to filter alerts, or check "All States" to receive alerts for every state.
Download a JSON backup of the selected state's technicians and locations.
Export all locations across every state as a multi-tab Excel workbook β one tab per state, matching TJ's format plus primary/fallback tech assignments.
Upload a backup JSON file. The file's state must match the selected state.
Compare current default technician assignments against the distance matrix. Flags locations where a closer tech exists and fills in any missing defaults. Requires the distance matrix to be built for this state.
Step 1 β Geocode addresses (first-time setup or after adding new locations/techs). Skips records that already have coordinates unless Force is checked.
Step 2 β Build the distance matrix. Haversine is free and instant. Drive-time uses Google Maps API (~$5β6 per GA+FL refresh).
Step 3 (optional) β Build real driving distances between every pair of sites in this state, for stop-order routing (2-opt currently uses straight-line distance for this). One-time per state β costs scale with site count squared, not tech count, so this is priced separately from Step 2. Requires Step 1 (geocoding) already done. Adds to the same matrix Step 2 builds; doesn't overwrite it.
Import the "Completed Service Appointments" report from Salesforce. Same file restock tracker uses β nothing here changes that, this is a separate import into the dispatch app's own history.
Found 2026-07-23: a real bug where sites with "Co"/"County" phrasing differences between Salesforce's Account Name and the real site name could get silently matched to the wrong site instead of correctly flagged for review. Fixed for future imports -- this re-checks every already-imported row against the corrected logic and fixes any that were mismatched.
Flags sites with 3+ trouble tickets for the same issue category within a rolling window β standard practice is to replace the hardware on the 3rd return trip for the same complaint. Pulled from parsed trouble ticket emails (issue_category field), not closing notes.
Closed-ticket import rows where the site name couldn't be matched confidently enough to auto-link. Grouped by raw name, since the same unmatched name usually covers many rows β fix it once here and every row sharing that name gets updated together.
Same cycle-detection logic as restock tracker, running live against Supabase instead of a manually re-uploaded report. Average cycle length filters out outlier gaps; a site is marked overdue (visited) instead of flat overdue if a trouble-ticket visit happened after its last real restock, since consumables may have been informally topped off then.