External scheduling in Project Operations

Project Operations Lite version

One of the controversial pieces in Dynamics 365 Project Operations has always been the infused Project for the web experience for managing projects. While P4W works for the accidental project managers it’s built to serve, its capabilities are often times light for organizations investing in a project management ERP like Project Operations. This is not really news anymore since P4W has been a controversial product since its general availability.

Having other options than Project for the web has been an ask for Project Operations for as long as I can remember. The Product Group has also heard the ask, and the October 2022 update finally introduces the option for external scheduling. The feature bypasses P4W and allows us to create, update, and delete data in tables that are related to WBSs. As always, this blog post is something to get you moving in the right direction and is a write-up that complements Learn’s docs article on external scheduling with images. I don’t have a 3rd party scheduling engine at hand to do a deep dive into the feature, but we can at least see how the feature works when entering data manually.

External scheduling

External scheduling is used for WBS-related tables in Project Operations. These tables are:

  • Project
  • Project Bucket
  • Project Task
  • Project Task Dependency
  • Project Checklist
  • Project Team Member
  • Resource Assignment

Image 1 below shows the data model of these tables, courtesy of Microsoft.

Image 1. Project planning data model. Source: Microsoft, 2022.


To get started, the first thing we need to do is to unhide a column on the project main form that lets us choose if a project is externally scheduled or not. The column in question is the Scheduling Engine / msdyn_scheduler column. When it’s visible on the project main form, we can create a new project that bypasses P4W and allows us to use an external scheduling engine. Once external scheduling is chosen for a new project row, it’s not possible to change back to P4W or from PW4 to external scheduling. The nice thing is that this is project row specific, so it’s possible to POC external scheduling possibilities by using both P4W and an external scheduler in the same test environment. Image 2 shows the Summary tab of a project that uses external scheduling.

Image 2. A project that uses external scheduling.

Using external scheduling

The first thing we have to understand are the limitations that are listed on Learn’s docs. I won’t list all of them in this blog post, so you have to read the article on Learn to understand them. For now, let’s look at what happens when we create a couple of tasks and dependencies. Our starting point is a blank project, as seen in image 3.

Image 3. Blank project for external scheduling.

Before we look at creating data in WBS tables manually, there is something annoying that I need to mention: the command bar for the project task table doesn’t have the create and delete buttons visible. Because I didn’t feel like playing with the ribbon, I simply used a quick create form to create project tasks. The scheduling columns are also locked on the project task table, so Level up’s God Mode is needed to edit the locked columns.

Now that we know that simply because external scheduling is possible, it doesn’t mean that we don’t have to customize the model-driven app we’re using to create data in WBS tables. What I’ve done is I’ve created a new area in my MDA for WBS tables. This way, I can easily create rows in the WBS tables when doing my testing.

Image 4. A new, custom area for external scheduling in a model-driven app.

Creating data in WBS tables for external scheduling

Let’s create data in WBS tables to test external scheduling. First, a project bucket is created, followed by two project tasks. While the column tooltip for a new task suggests that duration should be in hours, this doesn’t seem to be the case. Punching in 16, as seen in image 5, results in a duration of 16 days. I had to go to the project task form and use Level up’s God Mode to change the duration back to 2, which was my original intent in days.

Image 5. Creating a new project task for external scheduling.

The OOTB forms for WBS tables only include a few of the OOTB scheduling columns. This means that nearly all of the OOTB forms need to be customized to include scheduling columns so that testing external scheduling manually is possible. With Dataverse APIs it’s naturally different, and adding missing columns to forms might not be necessary. However, as we’re testing external scheduling manually, a small amount of customization work is needed. An example can be seen in image 6, where I’ve added scheduling columns to the project task dependency main form. Now that we have a bucket and a couple of tasks ready, a project task dependency can be created.

Image 6. Creating a new project task dependency for external scheduling.

Tracking task created by external scheduling

Tasks created by external scheduling can be viewed by using the Tracking tab on a project row. The Display Sequence / msdyn_displaysequence column drives the task order in the grid, so that has to be accounted for when creating a task for external scheduling. The nice thing about external scheduling is that we can now freely edit data in WBS tables, where manual edits to scheduling tables in P4W are blocked. An example of this is % complete, which I changed on task 3 seen in the tracking grid image below.

Image 7. Tracking grid used for external scheduling.
A small hiccup with the tracking grid – to be fixed in February 2023*

One strange issue that I wasn’t able to tackle was related to start dates and end dates. The values I punched in the UI didn’t match the ones the tracking grid displayed. Time zone related? Maybe. Maybe not. Hard to tell with these purpose-built, hard-coded grids. The table below illustrates the discrepancies I witnessed.

Start Date in Project Task formEnd Date in Project Task formStart Date in Tracking gridEnd Date in Tracking gridStart Date database valueEnd Date database value
Table 1. Start/end date discrepancies.

*This issue was confirmed as a bug right after I posted this blog post. A fix for the issue is scheduled for February 2023. In the meantime, the database values for start and end date are the sources of truth.

Closing thoughts

While a quick look into external scheduling shows promise, there is a lot to test and configure when using an external engine to schedule tasks and resource assignments. It’s important to understand the limitations mentioned on Learn and to understand that creating a custom scheduling logic isn’t a small feat. Things like the recalculation of a schedule based on an updated work hour template and the creation of resource assignment contours in resource assignments are just a few examples of the complexity that external scheduling brings.

External scheduling is in no way a simple plug-and-play feature. It has quite a few moving parts that need to be considered. It adds to the total effort of an implementation project. What we can use in P4W now has to be customized to work according to a 3rd party system. Sounds a bit heavy! Maybe some of these days I’ll prove myself right or wrong!

All my blog posts reflect my personal opinions and findings unless otherwise stated.