new
improved
fixed
Timefold Platform
Employee Shift Scheduling
Field Service Routing
Pickup & Delivery Routing
Disrupted employees KPI in ESS, all-or-nothing co-located visits in FSR, notifications as the one place for webhooks, and more
Today, we're announcing version v1.16 of the Timefold Platform and updates to the Timefold models.
This new version of the Timefold Platform comes with these platform improvements:

- Set up webhooks and read their logs in one place: Notifications: Notifications is now the only place to set up webhooks, with a webhook channel, and to read their logs. The retention period for the logs of the old webhooks has ended, so we removed the read-onlyWebhookspages fromManage tenant. See webhook channel and logs for more details.
- Email when someone declines your tenant invite: You now get an email when someone declines your invite to join a tenant. See Invite a new member to a tenant for more details.
- Failed notification emails include the error and tenant name: When a notification channel fails after all its retries, the email to the tenant administrators now includes the error and the tenant name. See Retry strategy for more details.
- Ask Claude or ChatGPT about any documentation page: Every documentation page now hasAsk ClaudeandAsk ChatGPTbuttons above the table of contents. Each opens that assistant in a new tab with a prompt to summarize the page.
- The secrets list shows all your secrets: The secrets list now shows every secret, 50 per page, instead of only the first 100. Search and the secret pickers in the notification settings cover every secret too. If loading fails, the list shows an error instead of appearing empty.
- Patch plan works without overrides: ThePatch plandialog no longer fails with "$.config: must have at least 1 properties" when you patch a plan without overrides.
- Configuration profiles save after changing a parameter without a constraint weight: A configuration profile no longer fails to save after you change a model parameter that has no constraint weight.
- Dates and times always show in your time zone: Dates and times, for example in the plans list and the configuration profiles list, now always show in your time zone, including after you reload a page.
Next to that, this new version of the Timefold Platform comes with updates to these Timefold Models:
- See how many employees replanning disrupts: ThedisruptionPercentageKPI shows how many shifts replanning changes. Managers also need to know how many people replanning affects. Thekpisobject now includes thedisruptedEmployeesPercentageKPI, with the title "Disrupted employees", to show this. An employee is disrupted when they lose a shift that was originally assigned to them. An employee is also disrupted when they get a shift that was originally assigned to someone else, or that was not assigned. The KPI is the percentage of disrupted employees among the employees with at least one shift in either the existing schedule or in the new schedule. The "Disrupted employees" KPI replaces the "Disruption percentage" KPI in the default KPI view. The "Disruption percentage" KPI is still available underShow all. See Key performance indicators and Real-time planning for more details.
- New lessons: apply rules to some shifts and plan around absences: Some rules don't apply to every shift, for example at most five night shifts worked in four weeks. Lesson 6: Treating shifts differently continues the lesson series and shows how to use tags and tag types to apply rules to a subset of shifts withincludeShiftTagsandexcludeShiftTags, followed by a practical example. Employees aren't always available to work, for example during a vacation or parental leave. Lesson 7: Planning around absences shows how to plan around required absences with unavailable or available time spans, and how to combine them with shift tags, followed by a practical example. See Lesson 6: Treating shifts differently and Lesson 7: Planning around absences for more details.
- Visualization keeps your view while the model solves: You can now inspect part of a schedule while the model solves, without the view jumping back each time a new solution arrives. This release also includes smaller visualization improvements, for example employees with a shift in the selected dates now appear first in theBy employeeview, and pinned shifts show the pin icon even when the shift block is narrow. See Visualization for more details.
- Consistent matching for empty tag lists in daily shift pairings and rotation groups: In daily shift pairings and shift rotation groups, an empty tag list withshiftTagMatchesset toANYmatched no shifts. It now matches every shift, the same as withALL. This can change the score of existing schedules. AWEEKLYrotation group withANYand noincludeShiftTagsthat the model accepted before can now fail validation withSHIFT_MATCHES_MULTIPLE_ROTATION_GROUPS. See daily shift pairings and shift rotation groups for more details.
- Incomplete or duplicate cost details no longer stop the dataset from solving: In costs rules, anemployeeShiftCostDetailsitem withoutemployeeCostGroupor withoutcostcaused an error before solving started. Two items with the sameemployeeCostGroupandshiftCostGroupcaused the same error. The model now ignores items withoutemployeeCostGrouporcost, and uses only the first item for a repeated pair of cost groups. Validation reports each case with a warning:COSTS_RULE_COST_DETAIL_MISSING_EMPLOYEE_COST_GROUP,COSTS_RULE_COST_DETAIL_MISSING_COST, andCOSTS_RULE_COST_DETAIL_DUPLICATE_COST_GROUP_PAIR. See costs rules for more details.
- Global period and costs limits now respect shifts already worked: GlobalminimumMaximumShiftsPerPeriodrules and globalcostsRulesnow take into account the shifts already worked earlier in the same period, so the plan no longer exceeds limits such as a maximum number of shifts per week or a maximum cost per pay period. TheshiftsWorkedMin,shiftsWorkedMax, anduniqueTagsLimitfields of global rules, and thetotalCostsMinandtotalCostsMaxfields of globalcostsRules, now count every assigned shift in each period that overlaps the planning window, including when the shift ends before the planning windowstart(a historic shift) or starts after itsend. This matches how contract period rules already count these shifts. See Historic shifts and the upgrade guide for more details.
- Stricter checks for overlapping shifts of a vehicle: A vehicle can work only one shift at a time. Validation now gives the warningVEHICLE_SHIFTS_OVERLAP_ISSUEwhen two shifts of the same vehicle overlap. The issue detail gives the vehicle ID, the IDs of the two shifts, the end time of the first shift, and the start time of the second shift. Previously, the model checked overlaps only for shifts in the same linked shift, and only when both shifts setmaxEndTimeandminStartTime. Other overlaps were accepted without a warning, so the model could plan the same vehicle in two places at the same time. A shift starts atminStartTime(orminFirstVisitArrivalTime) and ends atmaxEndTime(ormaxLastVisitDepartureTime). If it sets no end time, it ends at midnight at the end of its start day, the same default the model uses when solving. TheLINKED_SHIFTS_OVERLAP_ISSUEcheck for shifts in a linked shift now uses the same rules and stays an error. Input with linked shifts that the model accepted before can now fail validation. For example, two shifts in the same linked shift on the same day with no end time now fail, because the first shift ends at midnight, after the second shift starts. To fix this, setmaxEndTimeormaxLastVisitDepartureTimeon each shift so that it ends before the next shift of the vehicle starts. See Upgrade from 1.38.0 to 1.39.0 and Input validation for more details.
- Assign co-located visits all together or not at all (preview): When several visits at the same location must be completed in a single trip, partially serving the location isn't helpful. Previously, you had to link such co-located visits with visit dependencies yourself, usingSAME_SHIFT_ENFORCEcoordination and a restricted pooling type. The newmodelInput.allOrNothingScopesetting, set toCOLOCATED_VISITS, now makes the model create these visit dependencies for you. Visits at the same location, or withinpreferGroupingColocatedVisitsRadiusMetersof each other, are then either all assigned to the same vehicle shift, one right after another, or none of them is assigned. A visit can be excluded withexcludeFromAllOrNothing. This feature is in an early preview state and may have limitations or be subject to change. See All-or-nothing for co-located visits (preview) for more details.
Please let us know if you have feedback.