03-28-2024 10:55 AM - last edited 03-28-2024 11:33 AM
Want to create one source of truth for an entire project or initiative of projects using only standard Power Platform applications?
This template set-up combines a project log, kanban board, GANTT chart, RACI (role & workload tracking), and project update notifications system into one SharePoint list that is also embedded in a Teams channel.
It does not require the hassle of provisioning premium or other additional services like MS Project.
It is a mobile-device accessible set-up.
It is very Agile project management friendly.
Teams Tab Kanban View Example
Teams Tab GANTT Example
Automatic Notifications Example
Teams Tab RACI PBI Report Example
Set-Up
Pre-requisite: You will want to be an Owner of the SharePoint/Teams site where you want to set up this project tracker. Design or Edit permissions may be sufficient for many things, but you will probably have the easiest set-up experience with an Owner role.
Import The Template List & Channel
Download the Project Tracker Files zip at the bottom of the post. Extract the zip file.
Navigate to Power Automate (https://make.powerautomate.com/) in the environment you want to set up this project tracker. Then select the import option. Select the TemplateProjectTrackerList zip to import.
An import screen should eventually load where you will need to replace the flow connections with your own authorized connection credentials. You may need to create new connections for some pieces. For those new connections you'll click Create new, then New connection, then search for the connector from the import list in the top right search-bar & create the connection. Then hit the refresh button on the import pop-up menu for that connector.
Once all the connections are replaced & it is done loading, you can follow the link that appears to get to the actual flow.
Once in the flow, you can follow the notes to replace the default values in Settings to match your desired ListName, SiteURL, & Teams Channel name. To get the SiteURL you can visit the homepage of the site you want to import the tracker to and copy the URL. It is usually something like (https://<Org Name>.sharepoint.com/sites/<Site Name>/). But pay attention to the example site, you may need to add an extra forward slash to the url you got for your site. You will also need to replace the default value in the Get a team action to match the associated Teams site where you want to import the Tracker list. Save the flow.
After saving the flow, you will want to navigate out to the front page of the flow, make sure it is turned on, navigate back to the edit menu, click Test, & keep following the menu prompts until you can initiate the flow run so it can set up the template list & channel for you.
And that should generate the initial template SharePoint list & Teams channel!
Additional List & Teams Configurations
-Add Kanban View to Teams Channel
Navigate to the site where you imported the list. You should now have the list in your content and a navigation pane option should have been created for the list. Navigate to the list and go to the Kanban view. Copy the url for the webpage with the Kanban view.
Go to the Teams channel created for the project tracker, add a tab, select website, fill in the url field with the url from the Kanban view webpage.
That will make an easy-access tab available for the project Kanban board in Teams.
-Adjust fields & add filters
Navigate to the site where you imported the list. You should now have the list in your content and a navigation pane option should have been created for the list. Navigate to the list and go to the All Items view.
Go to the Notes column, open the edit menu, & save. This refreshed that column with the rich text settings so users can add hyperlinks & other formatting to their notes.
Next go to any columns you would like to filter on and pin them to the filter pane. I suggest pinning at least the following columns:
GoalLevel
ProjectAreas (Optional, better for larger initiatives / multi-area projects)
ParentGoals
Predecessors
Accountable
Responsible
-Better configure the default form layout
Next we can better organize the default form view using Configure layout options in an item menu of the Kanban view. Create a dummy item & open the edit menu on that dummy item. Navigate to the Configure layout menu, then copy the contents of the ConfigureLayoutBodyJSON txt file into the Body of the menu's field.
(If you later change the name of a column or want to add new columns to the form sections, then you will need to adjust & add the field names in this Configure layout menu.)
ConfigureLayoutBodyJSON:
{
"sections": [
{
"displayname": "General",
"fields": [
"Title",
"Status",
"Priority",
"GoalLevel",
"ParentGoals",
"Predecessors",
"ProjectAreas",
"StartDate",
"DueDate",
"EstimatedDuration",
"CompletedDate",
"ActualDuration"
]
},
{
"displayname": "Deliverable Info",
"fields": [
"As_a",
"I_want",
"So"
]
},
{
"displayname": "Assigned People",
"fields": [
"Accountable",
"Responsible",
"Consulted",
"Informed"
]
},
{
"displayname": "",
"fields": [
"Notes",
"Attachments"
]
}
]
}
-Customize Card fields
To adjust the fields displayed on the Kanban cards, navigate to the views menu, then to the Customize Card menu. I suggest using something like the following fields on the display cards...
GoalLevel
Title
Priority
ProjectAreas (Optional, better for larger initiatives / multi-area projects)
Accountable
Refresh the Kanban page url to reset the view formatting with the new settings.
-Add mobile experience options
To set the Kanban for mobile experiences, go to List settings, then Kanban (In the views section at the bottom of the page), then select the Enable for mobile & Make default for mobile options (bottom of the page) & select OK.
The Kanban view will then be accessible from the SharePoint app & mobile browsers:
Apple App Store SharePoint App:
https://apps.apple.com/us/app/microsoft-sharepoint/id1091505266
Google App Store SharePoint App:
https://play.google.com/store/apps/details?id=com.microsoft.sharepoint
-Adding a GANTT view
There is a built-in GANTT view for SharePoint lists, but it takes a little work to make it more accessible on modern sites & Teams.
Go to List settings > Create view > Start from existing > GANTT-Template then scroll to the end of the url on the create view page to add &Gantt=True to the end of the url. Then refresh & fill in the View Title, Title, Start Date, Due Date, & Predecessors fields. Then select OK to save the view.
If you were not directed to a classic SharePoint type of GANTT view, then go back to the List settings, go to the new GANTT view you just created, & click OK again.
Now from the classic SharePoint GANTT view page, copy the page URL.
Go to the Teams channel created for the project tracker, add a tab, select website, fill in the url field with the classic SharePoint GANTT chart url.
That should give you a relatively easy way to get to a GANTT view of your data based on the StartDate & DueDates anyone enters for the items. These GANTT views could also be grouped by other fields like Accountable.
Automatic project item update notifications
To give everyone involved in the project a type of routine digest of all the items involving them that were recently updated, we can use the Project Tracker Notifications flow provided.
Go back to Power Automate (https://make.powerautomate.com/) and import the ProjectTrackerNotifications flow zip file just like the List Template flow zip file. Change out all the connections. And once it is done loading, follow the same pop-up link to the imported flow.
Change out the Site address & List name to match your chosen site & project tracker list name. Save the flow. Then make sure the flow is turned on.
(Optional) If you want to further customize the recipients, subject, message body, reply-to, etc, then go into the last Apply to each loop and open all the sections, then the last action should be an Email action where you can make those changes:
Now by default anyone added to any of the assigned roles will receive a daily digest email with all the items involving them that were updated in the past 24 hours.
Note: If you will be listing many stakeholders or people in the project assignment roles who do not usually have access to this site, then I highly recommend adding some All Users type of group as a visitor / read-access member of this list. Then someone doesn’t have to manually approve each person to view items from these update notifications.
RACI Workload Tracking in Power BI
To get a better view of everyone's roles & workloads on a project, we can use the pbix file included & integrate it into another Teams tab.
Open the pbix file in the Project Tracker Files folder.
Go to Transform data, then double click the Source step to get the SP datasource menu. Go to the site home page where you imported the Project Tracker list, copy the site url usually something like https://<Org Name>.sharepoint.com/sites/<Site Name>/, and paste that into the Site url field of the PBI menu, click OK.
Click Refresh Preview to make sure the new list shows in the options. Double click the Navigation step, then double click the list name you used, like ProjectTracker, & hit the enter key.
Select Close & Apply. Click Publish. Publish to a workspace all the project members have permission to see and/or follow the link to the report on the Publish pop-up menu to (https://app.powerbi.com/). Find the datasource for the ProjectTracker-RACI, click the 3 dots on the datasource & go to Manage permissions, click add user & add an Office365 user group with all the project members in it.
After adding everyone's permissions, go back to the datasource menu & select the Schedule refresh option. You may need to refresh your credentials on this new automatic refresh menu for it to work. Then turn on automatic refresh and adjust the settings to auto-update the report from the list at least every day.
Now go back to the project Teams channel and add another tab. Select the Power BI tile, find & select the report you just set-up. Click save.
Now people will begin to appear in the report as they are added to project item roles. And you can hover over each block in their bar chart to see each item they are assigned to:
If anyone has trouble importing the Power Automate flows using the standard legacy flow import, the Project Tracker Files zip now includes a Power Apps solution package that once can import & then find the flows in the solution Flows section.
Or see this other method: https://powerusers.microsoft.com/t5/Power-Automate-Cookbook/Project-Tracker-SharePoint-and-Teams/m-p...
Microsoft deprecated the Groups connector that was used to automatically add the Kanban view tab to the Teams channel. I have removed the deprecated action from the list set-up flow & above I have included instructions on how to manually add the Kanban view to the Teams channel.
Thanks for any feedback,
Please subscribe to my YouTube channel (https://youtube.com/@tylerkolota?si=uEGKko1U8D29CJ86).
And reach out on LinkedIn (https://www.linkedin.com/in/kolota/) if you want to hire me to consult or build more custom Microsoft solutions for you.
watch?v=yPVSNxpLeKQ
@D-Harr Thanks. Sounds morel like a problem with SharePoint, but could you clarify what part(s) of the list don't match the set color scheme?
The list view of all the rows? The item editor menu? The cards?
You should have some options to manually set the color of things like cards in the JSON formatting code or set the color of rows in the conditional formatting.
Cards:
"-Conditional formatting of columns resets Customize Card settings
If you apply a conditional formatting rule, like making all Epics yellow highlighted & all User Stories green highlighted, then it will often revert to the original Customize Card settings & not show the card fields you selected on the Kanban view. I recommend not using the built-in conditional formatting rules.
Instead I edit the actual JSON code formatting to change the color of the entire cards in the Kanban view based on a formula like here: https://techcommunity.microsoft.com/t5/sharepoint/configure-conditional-formatting-for-sharepoint-li...
This both avoids the glitches & looks much cooler. But it does require manually changing code, creating a conditional formula within the code, & finding the correct HTML color codes you want to use in that formula."
Rows:
https://techcommunity.microsoft.com/t5/sharepoint/conditional-formating-rows-in-sharepoint-list-base...
@takolota Thanks, this actually guided me into the correct area to look for. Hub site seemed to be stuck, re-enabling and disabling this setting again seemed to have fixed it.
Another question/thought... I can build this within PowerApps, but wish to keep the format you have built and spent some time on. This is a great option for a PM to have as a tool to use for all of their projects within one location, but everyone whom has access to this SP list can see all projects the PM has. The option to secure this more to the "ProjectAreas" has been presented and hopefully you can guide me in the right direction.
Basically, if you have a choice option within the "ProjectArea" field called "ChikFillet" and another field choice of "BeefFillet", we do not want "BeefFillet" assigned staff to see what projects or tasks are assigned to "ChikFillet", and vice versa. Does this make sense and do you have any ideas on how to complete this piece?
This tracker is really awesome and can tell you spent some time on it. For the most part, depending on Global administrator settings, this is an easy setup and your tutorial is spot on.
You can definitely set up list views so they filter to only one or to only a few project areas & share those views with the relevant people.
But I’m not sure there is a great way to set up Row Level Security (RLS) based on a choice column.
You could try setting up folders for each project area & setting security on the folders.
Or you could whenever an item is created / updated have a flow set row level security for the item, removing & adding active directory security groups to item permissions based on the choice column.
https://sharepointmaven.com/2-ways-to-manage-row-level-security-in-a-sharepoint-list/
Hi @takolota , thank you so much for the wonderful piece of work that you shared. Everything seems to work well except for project tracker notifications. I looked all the comments posted here but can't find anything that described my problem.
I followed you instruction and renamed the expression using the new column names that I've changed, and switched the 'join' function for single-select fields to item.
I'd appreciate your help to troubleshoot the problem, as I can't work out what causes the problem.
Thank you very much.
best wishes,
SMW
@SMW1
Could you please go to the Get items Recently modified from tracker action & share the outputs of that action and share some of your join expressions?
I suspect the back-end SP names for the columns may be different from your new names, so when you try to reference them in your expression it doesn't find anything to reference / returns a null instead of an array.
Thank you for getting back to me so quickly. Here are the outputs and join expression...
Outputs of Get Items Recently modified from tracker action are:
{
"statusCode": 200,
"headers": {
"Cache-Control": "max-age=0, private",
"Transfer-Encoding": "chunked",
"Vary": "Origin,Accept-Encoding",
"request-id": "38d59da0-1868-287b-ea28-d3b64576c690",
"Alt-Svc": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
"X-BackEndHttpStatus": "200",
"X-NetworkStatistics": "4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295",
"X-SharePointHealthScore": "0",
"X-MS-SPConnector": "1",
"X-SP-SERVERSTATE": "ReadOnly=0",
"DATASERVICEVERSION": "3.0",
"SPClientServiceRequestDuration": "139",
"SPRequestDuration": "140",
"X-DataBoundary": "EU",
"X-1DSCollectorUrl": "https://eu-mobile.events.data.microsoft.com/OneCollector/1.0/",
"X-AriaCollectorURL": "https://eu-mobile.events.data.microsoft.com/Collector/3.0",
"SPRequestGuid": "0cc95a03-9c8d-407f-a0d0-27696d563dba",
"MS-CV": "A1rJDI2cf0Cg0CdpbVY9ug.0",
"Strict-Transport-Security": "max-age=31536000",
"X-Frame-Options": "SAMEORIGIN",
"Content-Security-Policy": "frame-ancestors 'self' teams.microsoft.com *.teams.microsoft.com *.skype.com *.teams.microsoft.us local.teams.office.com *.office365.com *.powerapps.com *.yammer.com engage.cloud.microsoft *.officeapps.live.com *.office.com *.microsoft365.com *.stream.azure-test.net *.microsoftstream.com *.dynamics.com *.microsoft.com onedrive.live.com *.onedrive.live.com securebroker.sharepointonline.com;",
"MicrosoftSharePointTeamServices": "16.0.0.24810",
"X-Content-Type-Options": "nosniff",
"X-MS-InvokeApp": "1; RequireReadOnly",
"X-Proxy-RoutingCorrectness": "1",
"X-MSEdge-Ref": "MIRA: 38d59da0-1868-287b-ea28-d3b64576c690 LO4P123CA0549 2024-04-30T11:00:02.686Z",
"X-Proxy-BackendServerStatus": "200",
"X-FirstHopCafeEFZ": "LHR",
"X-FEProxyInfo": "LO4P123CA0549.GBRP123.PROD.OUTLOOK.COM",
"X-FEEFZInfo": "LHR",
"X-FEServer": "LO4P123CA0549",
"P3P": "CP=\"ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI\"",
"X-AspNet-Version": "4.0.30319",
"X-Powered-By": "ASP.NET",
"Timing-Allow-Origin": "*",
"x-ms-apihub-cached-response": "false",
"x-ms-apihub-obo": "false",
"Date": "Tue, 30 Apr 2024 11:00:03 GMT",
"Content-Type": "application/json; charset=utf-8",
"Content-Length": "6505",
"Expires": "Mon, 15 Apr 2024 11:00:02 GMT",
"Last-Modified": "Tue, 30 Apr 2024 11:00:02 GMT"
},
"body": {
"value": [
{
"@odata.etag": "\"32\"",
"ItemInternalId": "3",
"ID": 3,
"Title": "Testing 2",
"Priority": 5,
"Status": {
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
"Id": 1,
"Value": "In-Progress"
},
"Status#Id": 1,
"GoalLevel": [
{
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
"Id": 1,
"Value": "MUS"
}
],
"GoalLevel@odata.type": "#Collection(Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference)",
"GoalLevel#Id": [
1
],
"GoalLevel#Id@odata.type": "#Collection(Int64)",
"ParentGoals": [],
"ParentGoals@odata.type": "#Collection(Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference)",
"ParentGoals#Id": [],
"ParentGoals#Id@odata.type": "#Collection(Int64)",
"Predecessors": [],
"Predecessors@odata.type": "#Collection(Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference)",
"Predecessors#Id": [],
"Predecessors#Id@odata.type": "#Collection(Int64)",
"StartDate": "2024-01-22",
"DueDate": "2025-01-01",
"EstimatedDuration": "345.000000000000",
"ActualDuration": "-1.00000000000000",
"As_a": "patient",
"I_want": "get well soon",
"So": "carry on with life",
"Accountable": {
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
"Claims": "i:0#.f|membership|.com",
"DisplayName": " ",
"Email": ".net",
"Picture": ""
},
"Accountable#Claims": "i:0#.f|membership| corb1.com",
"Responsible": {
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
"Claims": "i:0#.f|membership|.uk",
"DisplayName": " ",
"Email": " ",
"Picture": " ",
"Department": " ",
"JobTitle": " "
},
"Responsible#Claims": "i:0#.f|membership| ",
"Consulted": [
{
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
"Claims": "i:0#.f|membership|",
"DisplayName": " ",
"Email": " ",
"Picture": " ",
"Department": " ",
"JobTitle": " "
}
],
"Consulted@odata.type": "#Collection(Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser)",
"Consulted#Claims": [
"i:0#.f|membership|.uk"
],
"Consulted#Claims@odata.type": "#Collection(String)",
"Informed": [
{
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
"Claims": "i:0#.f|membership|corb1.com",
"DisplayName": " ”,
"Email": " ",
"Picture": " ",
"Department": null,
"JobTitle": null
}
],
"Informed@odata.type": "#Collection(Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser)",
"Informed#Claims": [
"i:0#.f|membership| com"
],
"Informed#Claims@odata.type": "#Collection(String)",
"Collaborators": [
{
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
"Claims": "i:0#.f|membership|",
"DisplayName": " ",
"Email": " ",
"Picture": " ",
"Department": " ",
"JobTitle": " "
}
],
"Collaborators@odata.type": "#Collection(Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser)",
"Collaborators#Claims": [
"i:0#.f|membership|"
],
"Collaborators#Claims@odata.type": "#Collection(String)",
"Progress": 1,
"TaskStart": "2024-01-22",
"TaskDue": "2025-01-01",
"TaskType": {
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
"Id": 0,
"Value": "Task"
},
"TaskType#Id": 0,
"Asa_x0028_2nduserstory_x0029_": "doctor",
"Iwant_x0028_2nduserstory_x0029_": "my patient to get well soon",
"So_x0028_2nduserstory_x0029_": "I can discharge the patient and see more new patients",
"Itsdonewhen_x002e__x002e__x002e_": "my medicines work",
"Itsdonewhen_x002e__x002e__x002e_0": "my patient demonstrates clinical improvement",
"Modified": "2024-04-30T10:08:14Z",
"Created": "2024-04-27T12:13:20Z",
"Author": {
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
"Claims": "i:0#.f|membership|",
"DisplayName": " ",
"Email": " ",
"Picture": " ",
"Department": " ",
"JobTitle": " "
},
"Author#Claims": "i:0#.f|membership| ",
"Editor": {
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
"Claims": "i:0#.f|membership| ",
"DisplayName": " ",
"Email": " ",
"Picture": " ",
"Department": " ",
"JobTitle": " "
},
"Editor#Claims": "i:0#.f|membership| ",
"{Identifier}": "Lists%252fProjectTracker%252f3_.000",
"{IsFolder}": false,
"{Thumbnail}": {
"Large": null,
"Medium": null,
"Small": null
},
"{Link}": "https://.sharepoint.com/sites/",
"{Name}": "Testing 2",
"{FilenameWithExtension}": "Testing 2",
"{Path}": "Lists/ProjectTracker/",
"{FullPath}": "Lists/ProjectTracker/3_.000",
"{HasAttachments}": false,
"{VersionNumber}": "32.0"
}
]
}
}
My join expressions include:
Hi @takolota, thank you for great guideline. Is it any way to syn that one with ToDo list or with planner.
Planner is nice tool, but you cannot rack any updates in the task itself. In SharePoint list it is possible. However, Planner give you opportunity to automate tracking of due date when someone is assigned to task in Todo, whereas SharePoint not. I am looking for solution where I can track updates inn task and at the same time have new review of daily notification
I have yet to work with ToDo connectors, but there are several Power Automate actions for adding/updating them https://learn.microsoft.com/en-us/connectors/todo/
And I’m not sure specifically what you want to do with “track due date when someone is assigned a task in ToDo”. You can add who is assigned & any due dates listed for SharePoint items alongside their item links in the HTML table of the daily reminder emails.
thank you for feedback. I will rephrase my question. How to syn SharePoint list with Todo app and vice versa?
To sync To-Do to SP you may have to do some hacky work-around like have a Planner Plan auto-synced to To-Do & then more explicitly sync the SP list to that Planner Plan by setting a flow to save an array of Planner item IDs for each SP assigned person to a multiline-text field in each SharePoint item so those IDs could be used to update the Planner items whenever the SP list is updated.
Then I don’t see a way to trigger a flow when a Planner item or To-Do is updated. You could maybe do another hacky workaround like on a recurrence flow running some actions that uses the List tasks action to list all the tasks’ relevant fields to sync & save them to a JSON file so the following flow run could compare the preceding flow’s JSON file to the new flow’s JSON file & list any updates.
I don’t think it is worth it.
You may have more luck trying to figure out how to track tasks/sub-tasks in Planner
https://youtu.be/q7bkWpVczz0?si=A659gL_x8i2LwkXH
Or figuring out a way to replicate what you want from To-Do in the daily reminder emails or daily reminder Teams messages.