Vacation Holds
Per-customer vacation holds that pause service for a date range, with automatic cascade to draft routes.
Vacation Holds
A vacation hold pauses service for a specific customer over a date range. While a hold is active, the customer's stops are excluded from route generation and removed from existing draft routes.
How Vacation Holds Work
When a vacation hold is created:
- The hold is recorded with
start_dateandend_date - Cascade to draft routes: Any pending stops for this customer on draft routes within the hold range are soft-deleted
- Generation exclusion: The route generation engine skips this customer for dates within the hold range
When a vacation hold is removed:
- The record is deleted
- Regeneration: If the hold range includes future dates, the system triggers route generation for those dates to restore the customer's stops
Vacation Hold Fields
| Field | Description |
|---|---|
customer_id | The customer on vacation |
start_date | First day of the hold (inclusive) |
end_date | Last day of the hold (inclusive) |
notes | Optional notes (e.g., "Family vacation to Florida") |
Creating a Vacation Hold
From the Dashboard
- Navigate to the customer's detail page
- Click Vacation Holds tab
- Click Add Hold
- Select the start and end dates
- Optionally add notes
- Save
From the API
POST https://api.nextroute.app/api/customers/:customerId/vacation-holds
Authorization: Bearer <token>
Content-Type: application/json
{
"start_date": "2026-06-15",
"end_date": "2026-06-29",
"notes": "Family vacation"
}Validation:
start_datemust be before or equal toend_date- Date ranges cannot overlap with existing holds for the same customer (returns
400)
Response:
{
"id": "hold_123",
"tenant_id": "tenant_456",
"customer_id": "cust_789",
"start_date": "2026-06-15",
"end_date": "2026-06-29",
"notes": "Family vacation"
}Listing Vacation Holds
GET https://api.nextroute.app/api/customers/:customerId/vacation-holds
Authorization: Bearer <token>Returns all vacation holds for the customer, sorted by start_date ascending.
Removing a Vacation Hold
DELETE https://api.nextroute.app/api/vacation-holds/:id
Authorization: Bearer <token>If the hold includes future dates, removing it triggers regeneration to restore the customer's stops on routes.
Cascade Behavior
When a Hold is Created
For each draft route within the hold's date range:
- Find stops belonging to the customer
- Soft-delete those stops (
deleted_atis set) - Recount the route's
planned_stops_count
When a Hold is Removed
- Determine the effective date range (start date or today, whichever is later, through end date)
- Trigger
generateRoutesForDateRangefor the range - The generation engine re-evaluates the customer's template stops and adds them back to routes
Billing Impact
Vacation holds do not automatically adjust invoices. If a customer's service count is reduced because of a hold, the missed-service credit system may apply a credit based on the missed_service_credit_threshold setting.
Alternatively, you can manually pause the customer's billing_status to paused during extended vacations to skip invoice generation entirely.
Related
- Blackout Dates — tenant-wide date exclusions
- Skip & Reschedule — stop-level skips
- Route Generation — how holds affect generation