new

improved

fixed

Timefold Platform

Employee Shift Scheduling

Field Service Routing

Pickup & Delivery Routing

Redesigned visualizations and improved service time limits in FSR, improved replanning in ESS replanning, and more

Today, we're announcing version v1.15 of the Timefold Platform and updates to the Timefold models.
This new version of the Timefold Platform comes with these platform improvements:
  • A tidier token list, with expired and revoked tokens removed after 30 days
    : The platform now deletes personal access tokens 30 days after they expire or are revoked. Active tokens are never deleted. Tokens you revoked before this release are deleted 30 days after this release. See personal access tokens for more details.
  • Log in to Timefold's Feature Requests Board from the United States region
    : You can now log in to Timefold's Feature Requests Board with a Timefold Platform user account from the United States region. When you log in, you first choose your region, Europe or United States, and then log in with your user account for that region. See Timefold's Feature Requests Board for more details.
  • Get tenant notifications in a Microsoft Teams channel
    : The Email channel section now explains how to get notifications in a Microsoft Teams channel: forward a tenant member's notification emails to the Teams channel's email address. See Email channel for more details.
  • Your self-hosted license covers the platform's Timefold Solver (self-hosted only)
    : The License section now explains that your self-hosted Timefold Platform license also covers the Timefold Solver instance running within the platform, so you don't need a separate Timefold Solver Enterprise Edition license (self-hosted only). See License for more details.
  • Toggle every optional model parameter in configuration profiles
    : In a configuration profile, every optional parameter a model declares now has a toggle to turn it on or off. Turn a parameter off to let the model use its own default value for it. The platform reads which parameters are optional from the model itself, instead of from a fixed list, so the toggle works for every model, including your own custom models. The
    Import profile
    dialog also shows its file drop area at full width. See configuration profile and Export and import profiles for more details.
Next to that, this new version of the Timefold Platform comes with updates to these Timefold Models:
  • Minimize employee disruption during replanning with kept shift tags (preview)
    : When replanning takes a shift away from an employee, some replacement shifts disrupt them less than others. For example, an employee who loses a shift at Location 1 would rather get another shift at Location 1 than one at Location 2, so their commute stays the same. Contract disruptionRules now support a keptShiftTags field. It rewards replacement shifts that have the same tags as the shift the employee lost. You set which tags count, whether a shift must match any or all of them, and a weight.
    keptShiftTags
    is a preview feature and subject to change. See Reward disruptions that keep shift tags for more details.
  • Catch missing or misspelled tags with a tag type validation warning
    : A tag type in the top-level
    tagTypes
    collection is only useful if at least one tag in the top-level
    tags
    collection belongs to it. If none does, every employee group and rule that references the tag type never matches. For example, the members of an employee group with that tag type as
    commonTagType
    can never share a tag of that type, so the employee group can never be satisfied. Validation now reports this as a warning that names the tag type, so you catch a missing or misspelled tag at validation time. The warning does not block solving, so existing schedules keep running unchanged. See Tags and tag types for more details.
  • Clearer, faster visualization
    : The ESS visualization is easier to read and work with. Hover cards now stay open, so you can select and copy their text, and shift cards show the shift’s priority and have a button to copy the shift ID. A new date control shows up to seven days per timeline, and the view opens on the first day that has a shift. Each filter value shows how many items match it, the Filter button shows how many values you selected, and Reset filter keeps your selected dates. The By employee timeline responds faster to filter changes and shows each employee’s worked hours as a bar in the row header. The timelines now follow the model’s own rules for skill validity, preferences, permitted overlaps and availability, and they use the model’s terms. A time zone readout shows the UTC offset, overtime is no longer drawn in red, and durations read as “7h 30m”. See Visualization for more details.
  • New lesson: set limits over rolling time windows
    : Some limits don't follow calendar periods, for example at most five days worked in any ten-day period, or an average of four days worked per week over any four-week period. Lesson 5: Rules over different periods continues the lesson series and shows how to set these limits with rolling window rules in contracts. It explains how a rolling window moves across the schedule, how to add a limit and satisfiability to a rolling window rule, and when a rolling window rule is equivalent to a period rule, followed by a practical example. See Lesson 5: Rules over different periods for more details.
5680dae2afaabc4e8392abea96d2b6fd30194afdce0becf21ea86959e567dd25
  • Redesigned visualizations for improved filtering
    : We have redesigned the visualizations to make filtering easier for quicker access to subsets of the data. The Map, By vehicle, and By visit views are now tabs of one Visualization page, and Timefold Platform shows that page in its sidebar. Every view now supports filtering: click
    Filter
    to drill down into a subset of the data, for example by vehicle, skill, or tag. A date control after the tabs sets the dates to show: one day on the map, and up to seven days on the timelines. The dates open on the first day with a planned visit. The
    Map
    tab shows the
    By vehicle
    timeline under the map, and hovering a row highlights its route. The map shows its stops right away, even on large datasets, and it stays responsive when you switch days or tabs. While the model solves, the map and the timelines keep your zoom and selected page, so you can follow the solve without losing your place. The new Efficiency X-Ray page shows how your fleet uses its time, distance, and overtime across the whole dataset. Use it to find vehicles with much more or much less work than the rest of the fleet, and to compare groups of vehicles by skill or tag. Efficiency X-Ray is a preview feature and subject to change. To request early access, contact us. See Map, By vehicle, and By visit and Efficiency X-Ray for more details.
  • Fewer unnecessary overnight stays with linked shifts
    : A technician's local area is the area they can travel to and return from within their working day, based on their start and end locations. Previously, Timefold could use a linked shift for visits in technicians' local areas. The technician then stayed away overnight only to get more working time, and did not return to the local area at the end of the day. Now, Timefold uses a linked shift to reach visits that are far from the shift's start or end location. A visit is far from the technician's local area if the technician cannot travel to it, complete the visit, and travel back in one shift. A new medium constraint
    Avoid overnight stay in local area
    penalizes each night of a linked shift between two visits in technicians' local areas. One such night has the same penalty as ten unassigned mandatory visits with the highest priority. The constraint is enabled by default when any linked shifts are defined. If a linked shift has no visits far from the local area, Timefold removes it before it starts to solve. The output still shows the linked shift, with no visits in its itinerary. See Avoid overnight stays in technicians' local areas for more details.
  • Routes can start furthest from the end location
    : A new soft constraint
    Prefer moving towards end location
    lets technicians drive to the visit furthest from their end location first and then work their way back. The long drive happens at the start of the shift, and the technician finishes the day close to the end location, for example, their home. The constraint penalizes every visit that is further from the shift's
    endLocation
    than the previous visit. By default, this constraint is disabled. To enable it, set
    preferMovingTowardsEndLocationWeight
    in the model configuration. See Prefer moving towards end location for more details.
  • Limit the total service time per shift
    : You can now limit the total time a technician spends working on visits during a vehicle shift or a linked shift, for example, to comply with labor law limits. The service duration of a shift is the effective service duration of all visits assigned to the shift. Travel time, waiting time, and breaks don't count toward the service duration. Set
    maxServiceDuration
    on a shift for a hard limit. The new
    Max shift service duration (hard)
    constraint leaves visits unassigned rather than exceed max service duration. Set
    maxSoftServiceDuration
    on a shift for a preferred limit. The new
    Max shift service duration (soft)
    constraint penalizes each second above the specified duration. To change the constraint weight, set
    maxSoftShiftServiceDurationWeight
    in the model configuration. If the soft limit is higher than the hard limit, the model returns the
    VEHICLE_SHIFT_MAX_SOFT_SERVICE_DURATION_GREATER_THAN_MAX_SERVICE_DURATION
    validation warning. See labor law limits, Required maximum service duration per shift, and Preferred maximum service duration per shift for more details.
  • Visits no longer wait for temporary skills or tags they don't need
    : When a vehicle shift had temporary skills or temporary tags, a visit that did not need them could start later than necessary. The visit waited until the first temporary skill set or temporary tag set started. This happened when the visit had no required skills or tags, or when the shift's static skills or tags already covered them. Now, such a visit no longer waits for temporary skills or tags, which removes the idle time before it starts. Visits that need temporary skills or tags still wait until those skills or tags are available. See Temporary skills and Temporary tags for more details.
  • Floating breaks can have a location
    : A floating break can now have a
    location
    , for example, a restaurant or a canteen where the technician must take their lunch break. Previously, the model ignored the
    location
    of a floating break and always scheduled the break wherever the technician was on their route. When a floating break has a location, the technician travels to that location, takes the break there, and then travels to their next visit. The travel time to and from the break location is included in the schedule, and the break still starts no earlier than its
    minStartTime
    . A floating break without a location works as before. See Floating breaks with a location for more details.
  • Floating breaks fit between fixed breaks and no longer end later than necessary
    : Timefold can now schedule a floating break between two fixed breaks when the floating break fits in the time between them. Previously, a floating break was always scheduled after all fixed breaks that occurred in the same gap between visits, which could push the floating break past its
    maxEndTime
    than necessary. The
    BREAK
    items in the itinerary now also report
    travelTimeFromPreviousStandstill
    and
    travelDistanceMetersFromPreviousStandstill
    for floating breaks. When a technician travels to their next visit before they take a floating break there, this travel is now reported on the break, and the visit after the break reports no travel. See Upgrade from 1.37.0 to 1.38.0 for an example. See Lunch breaks and personal appointments for more details.
  • New hard constraint stops fixed breaks from starting late
    : A fixed break can start later than its
    startTime
    , for example, when the technician cannot travel to the location of the break in time. The new
    Fixed break not delayed (hard)
    constraint penalizes each second that a fixed break starts after its
    startTime
    . The new
    RequireFixedBreakNotDelayedJustification
    justification shows the actual start time and the original start time of the break. The itinerary now shows the actual start and end times of a fixed break. If the break starts late, it keeps its full duration, so it also ends late. Previously, the itinerary always showed the
    startTime
    and
    endTime
    from the input, even if the technician could not start the break on time. See Personal appointments for more details.
  • Floating breaks no longer push visits past their time windows
    : Previously, Timefold could schedule a floating break before a visit even if the break pushed the end of the visit past the
    maxEndTime
    of its time window. Timefold now schedules the floating break after the visit instead, if the break can still end before its own
    maxEndTime
    . If both options break a time window, Timefold chooses the option with the smaller overrun. See Floating lunch breaks for more details.
  • Pinning requested for a visit that is not in an itinerary is rejected
    : The model now rejects input that sets
    pinningRequested
    to
    true
    on a visit that is not in the
    itinerary
    of any shift. Validation fails with the error
    PINNING_REQUESTED_VISIT_NOT_IN_ITINERARY
    . Previously, the model ignored
    pinningRequested
    on such a visit. When you sent the output back as the input of the next dataset, the model could then reject it, because a pinned visit cannot come after an unpinned visit. Validation now gives the same result for the first dataset and for every dataset after it.
    Important:
    Input that the model accepted before can now fail validation. See Upgrade from 1.37.0 to 1.38.0 for how to migrate. See Real-time planning: pinning visits for more details.
  • Shifts without visits are penalized when their breaks make them end late
    : A vehicle shift without visits still takes its fixed and floating breaks. These breaks can make the shift end late, for example when the technician cannot travel to a fixed break with a location before the break starts, or when a floating break must wait for its
    minStartTime
    . Previously, the
    Max shift end time (hard)
    and
    Max shift end time (soft)
    constraints did not penalize such a shift. The penalty appeared only when the first visit was assigned to the shift. That made the first visit look much more expensive than it was, so Timefold often left those shifts empty even when using them would improve the plan. Both constraints now also penalize shifts without visits when their breaks make them arrive at the end location after
    maxEndTime
    or
    maxSoftEndTime
    . The metrics of shifts without visits do not change. See Breaks can make a shift end late for more details.
  • Faster bulk visit recommendations
    : Bulk visit recommendations are now returned faster. Previously, a request could take 10 to 30 seconds, and the recommendations often differed only in where the last few visits were placed. See Bulk visit recommendations for more details.
  • Performance improvements
    : The algorithm for the initial solving phase has been changed and finishes now in a fraction of the time it took before. Benchmarks show a runtime reduction of about 86% for a small dataset of up to 96% for large datasets. Apart from faster solves, this can lead to more time being available for later solving phases and thus improved solution quality.
  • Reduced driver idle time before time windows open
    : A driver can arrive at a stop before its time window opens and then has to wait before starting the service. The new soft constraint
    Minimize waiting time
    minimizes the total waiting time in the schedule. By default, this constraint is disabled. To enable it, set
    minimizeWaitingTimeWeight
    in the model configuration. See Minimize waiting time for more details.
Please let us know if you have feedback.