Project Service Automation (PSA), an add-on solution sitting on top of Dynamics 365 Customer Engagement, is a great solution. If properly configured, it can deliver a lot of value for organisations frequently delivering projects, with a desire to integrate their sales cycle alongside this more tightly. A key challenge I find, though, concerning its adoption, is that a lot of PSA’s available functionality is not understood or documented very well. Although there is an entire Microsoft Docs website for PSA, it can be challenging joining the dots together. Also, some of the referenced functionality will refer to earlier versions of the product and, subsequently, deprecated features. This state of affairs can make it challenging determining what the “correct” steps are in achieving a particular task or whether it is safe to use a documented feature at all! Nevertheless, with this barrier overcome, I can see the solution delivering numerous benefits if implemented and utilised correctly.
An example of an area where it can be challenging to figure out the correct way forward is when working with mark-ups and discount values. Most organisations, from a sales perspective, will typically operate these on a percentage basis, derived from a fixed cost value, which may be subject to fluctuation. Fortunately, PSA provides the ability for organisations to apply discount/mark-ups in several ways. Firstly, particular role categories can have this defined. Extending this further, you can also set the same properties for specific resources and entire organisational units as well. However, achieving all of this is easier said than done. Several steps are required to get this working as intended within the application, to the extent to which some backend customisation will also be required. This post will aim to provide instructions on how to achieve all of this, from start to finish.
First things first, you will need to follow the instructions outlined in this article to create a separate solution, which will act as a container for the customisation steps that follow. Whether you do this using the “classic” interface or via the new PowerApps portal is entirely up to you. All that matters is that you add on the following component to the solution, from the Role Price Markup entity:
Once added, navigate to the form in question. You will need to look at adding one or more fields, depending on your particular needs:
- If you would like to specify mark-ups/discounts for specific resources, add on the Resource (msdyn_bookableresource) field.
- If instead, you wish to apply this for a role, the Role (msdyn_resourcecategory) field will need adding on instead.
- Finally, to work with mark-ups/discounts tied to a specific organisational unit, then the Resourcing Unit (msdyn_organizationalunit) field will be the one you need to select.
For this example, we will look at working with Roles only and so, therefore, apply the following form customisations:
Now we can look at making some configuration changes to PSA’s project parameter record. This modification is a requirement to ensure any information captured within the Role Price Markup entity is factored adequately into any calculations. Navigate first to the Markup Based Pricing Dimensions tab on your Project Parameter record and create a new record within the sub-grid. Then, populate it with the following values:
- Dimension Name: msdyn_bookableresource
- This will indicate to PSA the entity to apply the mark-up pricing to.
- Type: Markup-based
- Applicable to Cost: Set this to either Yes or No, based on your intended usage scenario.
- Applicable to Sales: Set this to either Yes or No, based on your intended usage scenario.
- Cost Priority & Sales Priority: These fields will only be enabled if you selected Yes to any of the previous two options. Set the priority based on your preferred preference in which the mark-up evaluates against others defined within the application.
The record should resemble the below if configured correctly:
An additional step will be required to avoid some potentially nasty errors further down the line – specifically, the following one when working with the Project entity:
Because of the myriad of relationships within PSA, and the differently named lookup fields involved, the application can not always figure out which field name to use when “grabbing” any mark-up percentages. In this example, because the lookup field on the Project Team Member entity to the Resource entity has a logical name of msdyn_bookableresourceid, PSA needs informing of this fact to get everything working as expected. Fortunately, it is pretty straightforward to get this configured. Press the Related tab on your Pricing Dimension record, select the Pricing Dimension Field Name entity and define this new record with the following properties:
With all necessary configuration steps completed, all that’s left is to set up all Role Price Markup records on each price list. We can then test to confirm everything is calculating correctly. For example, let’s assume we have a sell price list that defines a price for a Dynamics 365 Functional Consultant at £85 per hour. We want to look at applying a mark-up of 50% to this as part of any calculations. We would, therefore, navigate to the Role price markups tab on our Price List and define a new Role Price Markup record, like so:
Now, whenever a Line Detail record involving this role calculates (using the Import from Project Estimates button), the relevant Unit Price values have the appropriate mark-up specified:
An additional, bonus feature with this functionality is the ability to specify discounts as well via the same mechanism. All you would do is define a minus percentage instead for this to take effect. So, by altering our original Role Price Markup record like so:
We can observe the following, reverse behaviour on the same Quote Line Detail record from earlier, after refreshing this from our Project record:
I don’t know about you, but I always like little easter eggs like this. 😂 And with that, we can see how it is possible to start working with mark-ups and discounts successfully within PSA!
Conclusions or Wot I Think
This type of functionality can be useful for several different business scenarios, particularly when it comes to building out your sales price lists. Rather than performing manual price calculations, you can instead duplicate an existing cost price list and then define any appropriate mark-ups within there. As someone who is utterly hopeless at maths, I breathe a sigh of relief at that thought. 🙂 Other potential usage scenarios for this feature may include:
- Being able to define different mark-up/discount percentages for resources spread across different organisational units.
- At Project Contract stage, you can look to apply additional mark-ups/discounts, based on any changing circumstances during the project, such as a promotional offer or an adjustment based on inflation.
- By tying mark-up percentages to a specific resource, you can ensure this always remains adjustable, as the resource becomes more experienced or capable. For example, it may be desirable to charge more for a software developer with decades of experience and certifications, as opposed to a developer who has just completed their apprenticeship. Mark-up percentages provide a potential route for factoring this in, while still ensuring that your base unit price for each resource remains the same.
As this example potentially illustrates, the key benefits of using an “off the shelf” solution like PSA is that you can quickly utilise a lot of functionality that would take ages to recreate. However, it is essential to remember that there will still be some work required to get your system working for your needs. This feature, in particular, is one that requires some time to understand fully and to configure correctly, with definitely some trial and error involved. Hopefully, after reading this post, you will have everything you need to go away and start playing about with it yourself.