I’ve recently had the experience of working with the Opportunity Close functionality within Dynamics 365, and given what occurred, thought it would be useful to document this so that others are able to see this as well. There are many scenarios in which we’d use this, and being able to give a comprehensive solution to clients does make all of the difference!
There are three areas that I’d like to cover:
- Working with Opportunity Close table
- Challenges with data
- Power Automate to the rescue!
- Caveats
So let’s get started then!
Thanks to various members of the community such as Matt Collins-Jones, Andrew Bibby & others, who helped me along the way
Working with Opportunity Close
The Opportunity Close functionality within Dynamics 365 (& yes, I’m going to refer to it as this, rather than Power Platform) is used to provide information around why an opportunity is being closed. This is regardless of whether the opportunity has been won, or it’s been lost. It’s still quite important to track the information around it, so that companies can understand better how the market views the products it offers, how it stacks up against others, etc.
The default path in the system is to create a lead, and then qualify it. Qualifying a lead then automatically creates an opportunity record, which further information (quotes, etc) can be entered against. An account record (if company information is specified) is also created:
On the opportunity record, users are able to show if it’s been won or lost by clicking an appropriate button on the toolbar:
Doing this brings up the Opportunity Close pane on the right hand side of the screen:
Now it’s possible to customise this screen. In fact, the screenshot above shows 3 custom columns that have been added to it already in the system I was in.
To do this, we go to customise the solution (in the Maker Experience), and add the column/s that we’re wanting to:
Next, we need to remember to add it to the form! Otherwise it’s not going to show up. If we’re wanting it to appear on the side bar, then it’s important to customise the ‘Quick Create’ form version, to make our customisations show up.
Note: We’re able to put conditional visibility of the column/s if we want to, based on whether the opportunity is won or lost, using Business Rules. I haven’t done so in this scenario, but you’re obviously able to do so if you want to
Remember to save & publish the form, and then it’ll display within the system for users. Brilliant!
Challenges with data
So we’ve gone ahead & created the custom columns, and users are actually using them to record data. Wonderful – that’s exactly what we’ve been wanting to achieve.
OK – let’s now review the data so that we can see overall what’s happened with our opportunities. Of course we’re wanting to do this simply & easily, so we’ll open an Advanced Find window, go to the Opportunity Close table, add columns from the associated Opportunity, and….hold on. Opportunity Close ISN’T displaying in the Advanced Find????
It’s just NOT there. In case you’re wondering if you saved/published things correctly, or forgot some system setting, stop worrying. It’s not you – it’s the system.
See, Opportunity Close, though a table in its own right, is a SPECIAL sort of table. It doesn’t show up, and can’t be directly queried. I know – frustrating. I felt exactly the same way.
On digging deeper into things, I found out that there’s actually an activity record saved. It’s possible to query against this:
However, and this is the BIG catch, it’s NOT possible to return custom columns when carrying out this query. The search will ONLY return the (system) columns that are present for activities. So this leaves us with a problem.
Essentially, though we can set up custom columns to track the data that we’re needing to, it’s not possible (through the front end) to query it. This sort of negates what we’re trying to achieve here overall, and is a pain.
So what’s the way round it? Well, it’s actually going to be Power Automate!
Power Automate to the rescue
In order to handle our issue, what we need to do is the following:
- Add custom columns to the Opportunity table (these should mimic the custom columns that we’ve added to the Opportunity Close table)
- Use Power Automate for automation purposes!
The first step is easy. We need to go & create custom columns on the Opportunity table. These WILL show up in the Advanced Find search. They obviously need to be the same as the custom columns on the Opportunity Close table. If we’ve used Choice or Choices there, point the Opportunity column to the same source (it’s a good argument for using Global, rather than Local, choice/s).
We then can go and create a Power Automate. This should trigger when an Opportunity Close record is created.
Note: For this, I’ve made it so that it runs under the user triggering the action, rather than a system account. This is to keep in line with licensing limits etc
You’ll then need to add a ‘Get Dataverse row’ step, and get the Opportunity Close record that has just been created. This is annoying, but for some strange reason the trigger doesn’t present the custom columns/values in the JSON that it returns. Hopefully Microsoft fixes this at some point, but for the moment, we need to work around it.
The last step is to add a ‘Update Dataverse row’. This should point to the Opportunity table, & we can simply map the values across (from the SECOND step, NOT the first one – VERY IMPORTANT).
Once this is all done, save & test it, and you should see it working. I generally don’t add the Opportunity custom columns to the form, but rather leave them for querying against.
Caveats
It’s important to keep in mind that when an opportunity is marked as either won or lost, it’s then closed, and changed to a read-only state. That’s how the system is designed to be, and makes sense.
However it’s ALSO possible to re-activate a closed opportunity, and then close it again. Ie a single Opportunity record could have multiple Opportunity Close records against it. This solution won’t handle this (it would need to be built out further – the Opportunity record itself will only show the values from the latest Opportunity Close action, so please do keep this in mind!
Have you ever come up against something like this? How have you handled it? I’d love to hear – please drop a comment!
Dear CRM Ninja,
Thanks for this useful article. I have this exact same problem, however I’m working in Dynamics CRM 365 v8.2 on-premises (CRM 2016 in other words). This means that I don’t have access to PowerAutomate to copy the data from the OpportunityClose activity record to fields on Opportunity. I thought I could just create a workflow to do this, but OpportunityClose is hidden from the entity list available for workflows (as well as Advanced Find!). I can see other activity types such as Phone Call or Task, but not Opportunity Close. This is super annoying lol. The data user is prompted to record data into a hidden entity that is effectively useful for all purposes. I suspect it might be possible to write a C# plug-in to do this, but that’s beyond my skills. Do you have any other suggestions for how to fix this same problem on older CRM versions?
Best wishes,
Tony
Hi Tony
Unfortunately I haven’t worked with on-prem for a while, so wouldn’t know if/what could be suggested for this. Possibly it may be able to write a plug-in, but this of course would require professional development.