A skipped visit is one that the tech could not complete for a specific reason — not "I decided not to go" but "I went and could not do the work." Common causes: locked gate, dog in yard without prior disclosure, pool equipment failure, weather.
Skipping a visit (as the tech)
On the tech visit screen, the "Skip visit" action shows next to "Complete." Tapping it opens a short form:
- Reason (required): dropdown with common options — "Gate locked", "Weather", "No access", "Equipment failure", "Client requested", "Other."
- Note (optional): free text for detail.
- Reschedule? Yes / No. If yes, the system creates a new scheduled visit 3 days out by default; the owner can change the date.
What the system does
- Marks the current visit
status=skipped, records reason, skipped_at, skipped_by_user_id. - Closes the tech's time entry (so they get credit for the trip even though no service happened).
- If reschedule=yes, creates a new scheduled Visit row.
- Fires the
visit.skippedtemplate to the client in their preferred language with the reason.
The owner view
Skipped visits appear on the dispatcher with a gray/muted treatment. They do not count in the tech's capacity meter for the day. They show on the client's history timeline with the reason visible.
The Reports page has a "skip rate by reason" breakdown — useful for identifying systemic issues (e.g., if 14% of skips are "gate locked," your access-notes system needs work).
Owner-initiated reschedules
If a client asks to move a visit, the owner can reschedule directly from the dispatcher or visit detail page. This is different from skipping — no skip reason is recorded, and the original visit is modified (not marked skipped-plus-new-row).