Sonoma Partners Microsoft CRM and Blog

Offload Processing with Azure Functions

Earlier this year, Microsoft announced Azure Functions which provide the ability to run code that can be triggered by events from within Azure or from third party systems or even scheduled at certain intervals.  There are many ways Azure Functions can be used to benefit your CRM system.  In this article, I will walk through how an Azure Function can be built and triggered from a plugin in CRM for asynchronous processing outside of the native CRM async service.

Note: Azure Functions are still in preview state and therefore provided “as-is” and may not be covered by customer support.

First, head to your Azure org and add a new resource.  Search for “Function App” in the filter.


Select Function App and click Create and then specify a unique name for your Function App and which resource group and plan to add it to.

In our scenario, we are going to trigger the function from a CRM plugin so we want to choose the “Webhook + API” scenario and I’ll be using C# for this example but JavaScript could be used as well if desired.


Now the Function App is created and a sample function is already setup with a Url that can be used to trigger the Function.  The sample Function looks for a “name” property in the request and returns a message back to the client application using the “name” property that was passed in.


With this basic sample, you could be good-to-go already, if you don’t need to interact back to CRM.  You could have your CRM plugin pass in the necessary data and let your Function do with what it needs, such as processing that data and then sending it off to a third-party system.

But what if you need to query CRM for more data or make some updates within CRM?  In order to do so, we need to do a little bit more work.

First, we’ll need to add some NuGet packages that our Function can reference to connect to the CRM API.  In order to do so, we need to add a project.json file to the Functions folder where it is hosted in Azure.

  • Click “Function app settings” at the bottom left of the Function app screen


  • Click “Go to App Service Settings” in the Advanced Settings at the very bottom of the screen


  • Under the “DEVELOPMENT TOOLS” section, click “App Service Editor”


  • Click “Go” on the next screen and it will open a new browser window
  • Expand your Function app node under the WWWROOT node then right-click and select “New File”


  • Type project.json for the file name
  • Update the project.json file with the following:

  "frameworks": {
      "dependencies": {
        "Microsoft.CrmSdk.CoreAssemblies": "",       
        "Microsoft.CrmSdk.XrmTooling.CoreAssembly": "",
        "Microsoft.IdentityModel": "6.1.7600.16394",
        "Microsoft.IdentityModel.Clients.ActiveDirectory": "2.18.00"

The necessary NuGet references for the CRM SDK are now added.  You can now either go back to the main Function app screen in Azure or just use the App Service Editor to edit the Function code in the run.csx file.  We will want to add the following namespaces to the top of the Function:

using System.Net;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Tooling.Connector;

Now we can utilize the CRM SDK to connect to our CRM environment with a connection string like so:

var orgUrl = "";
var username =;
var password = "password";
var authType = Microsoft.Xrm.Tooling.Connector.AuthenticationType.Office365;

var crmSvc = new CrmServiceClient($@"ServiceUri={orgUrl};AuthType={authType};UserName={username};Password={password}");

Now we can use the org service to do whatever we need within CRM.  For this basic sample, we’ll just do a simple WhoAmIRequest and log the result to the Function app console to make sure everything is working correctly.

var request = new WhoAmIRequest();
var response = (WhoAmIResponse)orgService.Execute(request);

The final Function should look like so:

using System.Net;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Tooling.Connector;

public static void Run(HttpRequestMessage req, TraceWriter log)
    var orgUrl = "";
    var username = "";
    var password = "password";
    var authType = Microsoft.Xrm.Tooling.Connector.AuthenticationType.Office365;

    var crmSvc = new CrmServiceClient($@"ServiceUri={orgUrl};AuthType={authType};UserName={username};Password={password}");

    var request = new WhoAmIRequest();
    var response = (WhoAmIResponse)crmSvc.Execute(request);


Now click Run and in the Logs section you should see a Guid of your System User ID in between the Function started and Function completed statements.


You can then use a simple app like Postman to test submitting a request to the unique Url that Azure gave you for your Function app.  Once you submit the request, check your Logs in the Function app and you should see your System User ID logged again.

The last step would then be to build a standard CRM Plugin on the desired event and have it submit a request to your Function app Url to kick off the process.  Microsoft Flow could also be used to trigger an event from CRM and call your Function app without building any custom code at all.

There you have it, we can now utilize Azure Functions to free up some CRM processing but of course there are some caveats.

  • If you are on the “Dynamic” service plan, Azure Functions will currently only run for 5 minutes before timing out.  This still gives us 3 more minutes than an asynchronous plugin in CRM but be cautious of long running processes.
  • If an error occurs, there won’t be any ability to reprocess like there is with an asynchronous plugin in CRM.  You will need to build that into your Azure Function.
  • Lastly, Azure Functions aren’t free (they are cheap however).  If you have long running, memory intensive processes that will trigger often then you should consider the pricing.  Pricing details can be found here.  Microsoft gives 400,000 GB-s for free each month so if you have 1GB of memory allocated to your Function, it can run for 400,000 seconds per month without having to pay a single dime!
Topics: Microsoft Dynamics CRM Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

CRMUG Summit 2016 Recap

Earlier this year, Microsoft announced that it’s Convergence conference would be replaced by Microsoft Envision.  Envision would be meant for business leaders looking for a more strategic vision, while  Microsoft Ignite would be intended to be the conference that provided more hands-on and deeper technical content.

CRMUG Summit, on the other hand, is a conference not run by Microsoft, and instead run by users for users.  However, what we’ve seen this year is that the Microsoft presence at the Summit was greatly increased from years past.  The Summit actually is meant for more than just Dynamics CRM as there are user groups for all of the Dynamics Products (AX, GP, NAV).

Image result for crmug summit

All In for Summit!

After attending both Ignite (in Atlanta) and CRMUG Summit (in Tampa) this year, it’s clear that Summit is getting more and more focus as the years go on, and seems to be the conference to attend if you’re a Dynamics CRM customer or prospect.  There were 1550 CRM attendees this year - triple the amount from last year.  At Ignite there weren’t as many Dynamics sessions, whereas CRMUG Summit was chock full of sessions led by end users, MVP’s, and Microsoft employees.  You could feel more than ever this year Microsoft’s increased presence and Tampa Florida skyline stock image for Tampa Uber promo code postcommitment to the event.  Jujhar Singh, Corporate Vice President at Microsoft, brought most of the product team along to the conference and was also a main presenter at the CRMUG Keynote.  Scott Guthrie, Executive Vice President at Microsoft, was also in attendance and led the overall Summit Keynote.  Scott’s keynote showed Microsoft’s large push for PowerApps, Flow, and their Azure framework.  He also talked about Dynamics 365, and the tighter and enhanced integration coming between Dynamics 365 and Office 365 such as Outlook.  Jujhar went deeper into discussions around Dynamics 365, and he also announced the integration between Dynamics 365 for Sales, and Predict by Versium (discussed in more details below).

It definitely seems like Microsoft is increasing their presence at Summit (as they did this year), and our hope is that this continues.  If so, we definitely recommend users attend Summit 2017 in Nashville.

Dynamics 365

Of course the big topic at CRMUG Summit 2016 was all around Dynamics 365, Microsoft’s suite of Dynamics products.  No more are the days of Dynamics CRM, but instead users will need to get used to the new moniker Dynamics 365 for Sales.  The different products that will be available with the upcoming release (slated to be released to the cloud in the next month) include:

  • Dynamics 365 for Sales
  • Dynamics 365 for Customer Service
  • Dynamics 365 for Field Service
  • Dynamics 365 for Project Service Automation
  • Dynamics 365 for Marketing
  • Dynamics 365 for Operations
  • Dynamics 365 for Financials
  • Dynamics 365 for Customer Insights

These products currently exist but are being entirely rebranded (e.g., “Dynamics CRM” becomes “Dynamics 365 for Sales” and “Dynamics AX” becomes “Dynamics 365 for Operations” and so on).  However, Dynamics 365 will allow users to quickly jump from one application to another within the same session, further unifying CRM and ERP capabilities.

Along with the new naming of the products and unification of Microsoft’s flagship CRM, ERP, and Office suites, the upcoming release also introduces other new features.  Stay tuned for future blog posts detailing more of these newly released features for Dynamics 365.  Until then, know that you can expect to see more around the user interface, configurability, built in intelligence, proactive insights, enhanced visualizations, enhanced Outlook integration, enhanced navigation, and much more.  Sounds pretty exciting, right?

Predict by Versium

During the conference, Microsoft announced a new integration with Versium Predict, an automated predictive analytics solution that brings lead scoring and lead matching directly to Dynamics 365 for Sales. 

With Predict, users can build a predictive model directly from CRM that will allow them to add insights to enrich current data in the system with thousands of new attributes (e.g., hobbies, SIC Code, revenue, social handles, number of employees, demographics, etc.) from Versium’s extensive data warehouse.  Versium has trillions of data points in their data set, and users will be able to build a customer-based model or a business-based model directly from Dynamics 365 for Sales.

After your predictive model is built, with Predict by Versium and Dynamics 365, users will also be able to build a new list of leads and add them to a new marketing list.  Note:  Microsoft strongly enforces the importance of having data already in Dynamics 365 (500 records for a business list model and 1000 for a customer list model) in order to build a successful predictive model.

Thanks Tampa – Hello Nashville!

Once again Tampa was a great host city for Summit (the 2013 Summit was also in Tampa).  The weather was great - even though the east coast had previously experienced some extreme weather the week before - and the conference content didn’t disappoint.  It would be an understatement to say all of us at Sonoma are excited about Dynamics 365 and the announcements from Summit, as well as new features that are coming with the latest release of the product.  We can’t wait.

Image result for nashville tennesseeIf you’ve never been to a CRMUG Summit, we definitely recommend you register for next year’s summit in Nashville.  If this year’s was any reflection of where the conference is headed, next year’s should be much bigger with more product announcements and roadmap discussions.  Each year, Summit has grown at exponential rates, and the involvement seen from Microsoft this year is certainly encouraging.  We’re hoping that they return in full force next year as well.

Stay tuned for more announcements about Dynamics 365 and the new features that will soon be released.

Topics: Microsoft Dynamics 365 Microsoft Dynamics CRM Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

Dynamics CRM Performance Considerations

Today's blog post was written by Argyris Anargyros, Development Principal at Sonoma Partners.

While working on a 2016 org upgrade from 2015, I was tasked with looking into a few performance issues that affected specific parts of the system, such as Connections and Activities. For Connections, the lookup to select the Connect To field took a very long time to load and would sometimes return a SQL time out error. For Activities, we were seeing long waits for quick find search results. While looking into these issues, we used both CRM and SQL Tracing, and we were able to identify a few problems that were easily fixed through native changes. These changes produced a dramatic improvement to the specific issue and the system as a whole. Some of these might seem obvious, but these can be good things to look for when you first come to an existing implementation.

Connections and Quick Find Views

First thing we noticed was that there were a bunch of Quick Find Query requests to pull in each entity listed as available to Connections. Microsoft does not provide a way to uncheck this availability, but we were able to identify a few unneeded custom entities, delete those entities, recreate them, and avoid the unneeded call to request for that data. The next piece we tackled was some of these Quick Find queries were taking a long time. After reviewing the Quick Find views, we found a lot of fields included as a part of the Quick Find. Each field that is selected can poetically create an index which should help searching, but what we found was that there were many fields of the same type being search on, like Owner, Regarding, and Modified By. This combination of fields to search on created a SQL statement that union 3 select statements to consolidate the results from the entity we were searching on, the users entity to cover the Modified By, Contact, and Accounts for the Regarding field. This union was not needed since we really did not need to have Modify By and Owner set to searchable by the Quick Find view. Once we removed all the unnecessary Quick Find fields, we had to wait a day or two for the indexes to clean themselves up, but we saw these long running queries go away. 

To edit the quick find view >>  

Permissions and Business Units

Next we found SQL statements that were joining to the POA table and looking at Business Units to identify whether the user querying this data has permission to the individual records. Once I saw this I found it odd since the client I was working with has a single Business Unit. After reviewing there custom roles, we found that a lot of their permissions were set to BU instead of Org level, but with the single BU they are in essence giving folks Org level access. Once we changed all the permissions from Business Unit to Org access, the union to the POA and BU tables were eliminated and the response time of those queries became very small. 

View security roles and privileges>>

New Call-to-action

Topics: Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

Creating a PowerApps Mobile Application with Dynamics CRM in 1 Hour

Today's blog post was co-written by Brad Bosak, Vice President of Development at Sonoma Partners.

I recently presented at the CRMUG Summit on how to use the new PowerApps Studio to quickly create mobile applications using the Dynamics CRM Online connector. As I prepped for this session, my colleague, Brad, and I discovered that native CRM connector can quickly get you to a working functional application in minutes. However, since the connector is still in early preview, some adjustments need to be made to use these applications in practice.

We are going to provide the steps we went through to create an application that will show active contacts in a list, allow you to drill into the contact record for additional details, and finally update the contact records. All of this will begin by using the default template provided by PowerApps through the Dynamics CRM Online connector. The application you will create is shown below:


You are also encouraged to download the completed application, but please review the install note after you extract the file.

Before you Begin

Before trying out this application, you will need to have some prerequisites completed.

  • A PowerApps account using your organization email address
  • A valid CRM Online instanced under the same organization
  • Download the Windows PowerApps Studio application & PowerApps mobile clients for the mobile devices you wish to distribute

Contact App Demo Setup

  • Open the PowerApps Studio and create a new connection to CRM Online
  • Note that this will take you to the PowerApps web page where you can configure a connection
  • Back in the PowerApps Studio, create a new Phone Application using that connection and by selecting the  contacts entity


You will see the application is created and ready for use (in theory at least Smile). The newly created app has a live copy of your contact data and 3 screens (a list screen, contact detail screen, and an edit contact screen). Unfortunately, the default list, detail, and edit screens do not provide the fields or format we desire. To address this, we'll use the rest of this article to simply “clean up” our app. 


Add Data Sources

Since we want to also display and edit company information in our application, we will also add the Accounts entity as a data source. This will be necessary as we demonstrate a work around for the lack of lookup support in the current Dynamics CRM Online connector.


Important: The current Dynamics CRM Online connector does not support lookup or option set data types. This application will need to use a lookup field (Company), so we'll demonstrate how we worked around the lookup limitation.

  • Add Accounts so we can display names in our lists and lookup fields

Change Theme

For variety, let's change the overall app theme. Select the theme of your choice. We went with Light.

Update Icon & App Name & Save Locally

We want to encourage you to save often as you work on your application. There are two save options, one saves to the cloud and the other locally. We prefer to save locally as we work on our application as it is a bit faster with how often we save. This approach also allows us to put our app file in source control. However, in order to distribute the application, you will eventually need to save to the cloud.

You can also change your application name, icon, icon background color, and screen orientation from the App Settings menu. Select File - App settings and then name your app, change the icon and icon background color. Finally click Save and save locally.



Browse Screen

Now that we have saved our progress, we'll update the Browse screen first, using the default screen/list layout provided.

Our first step updates the list filter to only show active contacts and search on the last name field. You accomplish this by selecting the list of records and replacing the Items property with the following line of text:

SortByColumns(Search(Filter(Contacts,statuscode=1), TextSearchBox1.Text, "lastname"), "lastname", If(SortDescending1, Descending, Ascending))

The Filter function trims the dataset based on the criteria entered, in this case only showing active contacts.


Next, we will remove the fields we don't wish to display.

Note: You need to select the first cell of the list to access the individual elements of the list.

  • Remove all fields by selecting each control and clicking delete, except the entity image. We'll add back the ones we want to display.
  • Make the entity image smaller, so it takes up less room in the cell
  • Insert a Text box control to show contact full name
    Note: The CRM connector doesn't return full name in the field list, so we'll need to manually concatenate it
    • Text = ThisItem.firstname & " " & ThisItem.lastname
    • Vertical align to top of image
  • Copy and paste the previous Text box control to to show the contact's job title
    • Text = ThisItem.jobtitle
  • Repeat this process for the Parent Customer (company) field.
    • Text = LookUp(Accounts,accountid = ThisItem._parentcustomerid_value).name
    • Note that lookup fields display the id (GUID), not the label. We'll fix that by using the LookUp function. The LookUp function takes our newly added Accounts collection and matches the parentcustomerid with the accountid. We then use the result to return the name field from the account.
  • Tighten up row height by selecting the bottom of the first cell and dragging to the desired height
  • Change font size as desired by updating the Size property to whatever value you wish


  • SAVE!

Detail Screen

Next, select the DetailScreen1 page from the screen list. We'll also make this screen more presentable to the user. Similar to the Browse screen, we'll remove the fields we don't wish to display and add the ones we do. But for this screen, we'll also take advantage of PowerApps custom card option.


  • Remove all fields but Company Name card
  • Add Custom card and move the card to top of screen by dragging the card to the top
  • Make sure you keep the the custom card cell selected and insert Image
    • Set Image property to ThisItem.entityimage
    • Drag the size to something that fits in the left corner
  • Insert Text box
    • Set Text property to ThisItem.firstname & " " & ThisItem.lastname
  • Insert Text box
    • Set Text property to ThisItem.jobtitle
    • Change font size. Select Size in the dropdown and set it to 16
  • Select the custom card and change card fill to a different color
    • Set Fill to RGBA(227, 233, 241, 1)
    • Note you can use a web converter tool such as to help with the correct RGB color


  • Select Company Name card and then select the Advanced Properties


    • Unlock the card, so we can edit the individual properties


    • Update Company Name to display name to LookUp(Accounts,accountid = ThisItem._parentcustomerid_value).name
    • Close the Advanced Properties dialog
  • Add EmailAddress1 and Telephone1 fields by simply enabling eyeball indicator
  • Select the EmailAddress1 field and change the display to launch the native email client with the email address prepopulated.
  • Similarly update the telephone1 field to display as a phone number. This will launch the native phone client when the application is used.
  • SAVE!

Account Lookup View

In order to work around the lookup field limitation on the edit form, we will create our own lookup dialog for Accounts. We'll create a new screen (page) and populate it with the active account list. This will allow us to call this page from our custom lookup field on the edit page.

  • Click the New Screen button in the upper left of the designer
  • Name this new screen Account Lookup
  • Click Layout in the right pane and select the 'Browse items, one line description' template
  • Rename header textbox to "AccountLookupTitle"
  • Select the text label control and change the text to "Accounts"
  • Update the Items property of the list by replacing the sample gallery text with the Accounts data source and change the search property
    • SortByColumns(Search(Filter(Accounts,statuscode=1), TextSearchBox2.Text, "name"), "name", If(SortDescending1, SortOrder.Descending, SortOrder.Ascending))
  • Click the first cell in the list. Select the text box control and update the Text property to show the account name.
  • Rename the list to "AccountList"
  • Update the Arrow icon's OnSelect property to  ClearCollect( SelectedAccount, { Account: AccountList.Selected } ); Back()
    • This clears previous values and creates (if not already created) an in-memory collection that we can reference from the other views, I haven't found another good way to have a 'global variable' in PowerApps
  • Let's hide the new accounts button, as we don't want to create new accounts. For simplicity, we'll just hide the field, by setting the Visible property to false.
  • SAVE!

Edit Screen

Finally, select the EditScreen1 page from the screen list. Using the native CRM connector for PowerApps, automatically wires up the edit page. We don't want to interrupt this process, but we'll need to use a workaround for the lack of lookup support. For the other fields, it is as simple as adding the fields to the form.

  • Remove all fields except the Company fields and Last Name
  • Add emailaddress1, firstname, jobtitle, telephone1 and order them as shown in the image below.

We will now show you our workaround for managing lookup fields. We are going to relabel and hide the existing type and id fields. Then we'll create our own lookup field that will talk to the Account list we previously created.

    • Update the parent customer field to show our lookup control instead of the GUID
      • Click the ellipsis on _parentcustomerid_type field in the right pane and select Advanced Options
      • Unlock the card to change properties 
        • Click more options in the Data section and change Default field to "accounts"
        • Click more options in the Design section and change Visibility field to false
      • Click the _parentcustomerid_value field and should see the Advanced pane change
      • Unlock the field by clicking the lock at the top of the options pane
        • Select the Text box in the parent customer card on the form
          • Rename the Text box to AccountGuid
          • Set the Visible property to false
        • Change Company Name card Default value
          • This is saying the if we have a selected account in our custom collection, use that value.  If nothing is in our custom collection, use whatever is currently set on the record from CRM
          • If( IsBlank( First( SelectedAccount ).Account.accountid ), ThisItem._parentcustomerid_value, First( SelectedAccount ).Account.accountid )


    • So we have now setup the card and original field bindings for the form to use. What is left is for us to create a field to select the account.

      • Insert a TextBox control to the card
        • Rename the TextBox to "AccountName"
        • Update the BorderStyle property to Solid
        • Update the BorderThickness property to 2
        • Update the X property to 30
        • Update the Y property to AccountGuid.Y
        • Update the Width property to Parent.Width - 60  (to match the other input fields)
        • Update the Height property to 52
        • Update the Text property to LookUp( Accounts, accountid = Parent.Default ).name
      • Insert a magnifying glass icon control to the card
        • Update the X property to Parent.Width - 82  (Note: 82 is the right padding of 30 between the textbox and the edge of the screen plus the width of the icon)
        • Update the Y property to AccountName.Y
        • Update the Height and Width properties of the icon to 52 
        • Update the OnSelect property to Navigate('Account Lookup', ScreenTransition.None)
    • Select the form and update the OnSuccess property to Clear( SelectedAccount );Back()
    • Select the Cancel button and update its OnSelect property to Clear(SelectedAccount);ResetForm(EditForm1);Back()

That's it! Click the Play icon in the top right menu and test your application. If everything is working as it should, save to the cloud to test on your mobile phone.

Topics: Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

Learning Path - Dynamics CRM 2016 Guided Help

With the Spring 2016 release of Dynamics CRM came a guided user experience that provides context-sensitive and interactive tasks for end users to more easily become familiar with Dynamics CRM.  Remember, you can always review the features on the roadmap from this link.

What is it?

Learning Path, adds a new icon to the main navigation bar of CRM.  This conversation bubble with a question mark icon will appear in the top right corner of the CRM window if you have Learning Path enabled (see below for more information about turning this feature on or off).

Clicking on this Learning Path icon will slide out a pane on the right side of the CRM window that will allow users to do the following:

  • Learning Paths:  These are content areas where videos, text, guided tasks, and more.
  • Guided Tasks: These are step by step instructions that guide users through specific CRM tasks (see below)
  • Videos:  Learning path has full support for inline video within the pane that appears on the right
  • Navigation:  There’s the ability to navigate between pages of the Learning Path module using left / right arrows.  The user can also navigate to the home page by clicking the icon of the home.  And they can also “Send a Smile” or “Send a Frown” on any particular page of the Learning Path module

As users progress through Guided Tasks, their progression is saved and they’re able to see this in the learning path pane with a checkmark next to that specific task.


Guided Tasks

Guided Tasks are a way for users to learn an aspect of the CRM system, by doing it as areas of CRM are pointed out along the way.  As a user completes a guided task, a checkmark appears next to the task.  However the user can complete the task as many times as they’d like in case they’d want a refresher on how to complete something in CRM.

For example, if you clicked on the “Let’s go! Sales basic tour” you’d see the following set of steps in your guided task as it takes you around the basic aspects of sales within Dynamics CRM.






Enable or Disable Learning Path

Each user has the ability to disable Learning Path for themselves by clicking on the Options icon, and selecting Opt out of Learning Path or Opt in for Learning Path.


Alternatively, your system administrator can turn Learning Path on or off at an organization level by going to Settings –> Administration –> System Settings.  On the General tab, Set custom Help URL section, you can toggle the setting for Enable Learning Path.



Since this is the first release of Learning Path, there are obviously some limitations.  First off, this is only available for CRM Online.  Like most features with Dynamics, features are released to the cloud first, and then as it makes sense, are released for CRM OnPremise.

Another limitation is that the usage metrics (who’s completed what guided task, when, and how many times) is currently not available.  This could be very useful for companies that are trying to gage user adoption, as well as training opportunities for loud users who complain they don’t know how to complete a specific task, but at the same time haven’t completed the guided task that shows them exactly how to do what they’re looking for.

Finally, Learning Path isn’t currently configurable.  This one probably hurts the most currently.  What you’ll get out of the box is predefined learning paths for onboarding, and for those who have spun up a CRM Trial instance, they’ll get learning paths around the trial and how to convert the trial into a purchase.  I see the first thing our clients will ask us as we show them this is how can we configure it, and unfortunately at the moment, the answer is you cannot.  Configuration and usage metrics are two areas that Microsoft will most likely be investing in as they build out this feature in the near future.

Topics: Microsoft Dynamics CRM Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

If You’re Not Using Partial Solutions, You’re Part of the Problem

Today's blog post was written by Mike Dearing, Principal Developer at Sonoma Partners.

Although I’ve yet to fiddle around with patch solutions, I’ve been leveraging Microsoft Dynamics CRM 2016’s solution segmentation for recent client work as more of our on-prem clients have been adopting the 2016 upgrade. There are definitely a plethora of solid blog posts out there describing solution segmentation at length, but I figured I’d add my experiences to the pool in case they differ from your own.

Ribbon Customizations

No matter if you're using Ribbon Workbench or kicking it old school with some direct ribbondiff xml edits, you can take advantage of solution segmentation. Prior to CRM 2016, you had to be extra careful to ensure that your future ribbon upload didn't end up wiping out someone's customization work, since there was no way to segment out just the ribbon from other entity metadata such as fields, views, forms, etc. With CRM 2016, you have the option to whittle down the entity metadata to essentially just the ribbondiff (there is a bit extra in there, but not much of significance). The key is to make sure that you uncheck both the ‘Add All Assets’ and ‘Include Entity Metadata’ checkboxes on the new ‘Add Subcomponents’ dialog that appears before the traditional ‘Add Required Components’ dialog.

Mdearing 1

If you inspect the resulting customization.xml within the solution zip, you’ll notice a much leaner version of the entity metadata.

Mdearing 2

Less Intrusive Deployments

As a side note, I very rarely deal with productized or ISV solution, so all of this information pertains to unmanaged solutions. It has always been good practice to stick with partial solutions for patches and updates to existing environments, while maintaining a core solution for new deployments. Now you can strip those partial solutions even further down to the individual customizations that you have made. How much you wish to refine your solutions is up to you, as there is always a balance between accidentally missing a customized component, especially in a situation where you have multiple system customizers working on the same solution, versus including all of an entity’s metadata. One thing to note though, is that while the new subcomponents dialog does add a lot more flexibility to which components to include, there is no way (as of the writing of this post) to remove the ribbondiff for an included entity. This is a pretty large oversight that I hope is addressed in a future release, but as of now you’ll need to ensure that you export the target environments ribbondiff first, and reimport applying the segmented solution, otherwise it will be overwritten.

Unfortunately every new feature is not without its quirks. There have been times when hand selecting customizations has timed out for more heavily customized entities, and the required components dialog seems to not always correctly add my dependencies. But all in all, this has been a great help in speeding up customization and deployments, in an area that has otherwise been neglected for quite some time.

Three Steps to CRM Success

Topics: Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

Updating Your Quote from Your Project Plan in PSA

Today's blog post was written by Trent Bell, Principal Consultant at Sonoma Partners.

In our previous blog post related to Microsoft's Project Service Automation, we touched on how the standard Opportunity, Quote and overall sales process capabilities have been extended by PSA to accommodate “service” organizations. In this post, we want to showcase a very useful function professional service organizations and the like might want to take advantage of if they use project plans to help estimate projects for prospects.

As eluded to above, the sales process may require some detailed estimating take place that may naturally come by way of a project plan. PSA has a very nice feature that allows for taking the detailed tasks from a Project (within PSA) and importing them back into an associated Quote Line as “Quote Line Details.” This can be a great time saver for those involved in the sales process.

From the Quote record, double-click on the Quote Line that is associated with the Project you have used to do your estimates. 

Trent psa 1

If you have not already associated your Project to your Quote, the “Project” field will be blank in your Quote Line. Double-clicking on this Quote Line will open the record and allow you to associate the Project as seen here.

Trent psa 2

Once you have your Project entered, click on the “Import from Project Estimation” button in the top menu.

Trent psa 3

A dialog box will pop up providing you with some options for how you want the tasks from your project plan to map to your Quote Line Details.

Trent psa 4

These summarization options can be super helpful because they allow you to decouple the granular details of the project plan from what you want on your quote detail. In other words, you can take a very detailed project plan and roll up that detail to an appropriate summary level for your prospect.

Once your summarization options have been chosen, clicking “Next” will take the content of the project plan and produce Quote Line Detail records as appropriate (see screenshots below). Also, the “Quote Amount” automatically gets updated with the sum of these quote line details.

Project record:

Trent psa 5

Quote Line record:

Trent psa 6

As you might imagine, this can be a great time saver for those involved in the sales process. Just remember, in order for this to provide any value, a Project with a built-out work breakdown structure must exist…which we will cover in more detail in an upcoming PSA post. Stay tuned!

New Call-to-action


Topics: Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

Ins and Outs of App Deployment Using Microsoft Intune

Today’s blog post was written by Marty Diamond, Senior System Administrator at Sonoma Partners.

Here at Sonoma, we promote a highly mobile workforce. Like other businesses, this means distributing internal apps to phones and tablets not owned by the company. Many mobile device management solutions have risen to assist with this challenge. We’ve used a handful of these with varying degrees of success. Recently, we have been piloting Microsoft’s Intune system, a part of Microsoft’s Enterprise Mobility Suite. Intune is interesting as a significant portion of it is dedicated not just to device management and compliance but application management, which offers many benefits to us.

Before delving too far into it, I should say that while Intune is a very flexible platform for managing a fleet of mobile devices, Sonoma’s use case is almost entirely dedicated to application distribution and updating. We have few company-owned mobile devices that are used by our QA team, and thee have very few requirements placed on them. This makes Intune very appealing: we can use it to simplify management of our mobile applications and scale up if needed.

We began testing with a simple task: log into the management portal and add a device. Getting there is simple enough. Once you’ve started the trial and assigned a license, Intune becomes another administrative portal launched from your Office365 portal. You are greeted with a set of startup prompts to help you navigate the portal from creating a policy to setting up your “Company Portal” to get devices into management. Once this is complete, the dashboard begins to fill with data about any devices it is managing.

Marty post 1 v2

The first real step within Intune is to define a policy. This is where we ran into our first “gotcha.” While the wizard takes you through defining a policy and creating other policies, it does not mention anything about deploying those policies. Nor does it mention that, by default, the existing Default Security Policy is not deployed. Missing this deployment step freezes the whole process: no device can be added unless a default policy is deployed.

Marty post 2 v2

Once we got past that, we continued testing with device onboarding. This process is critical as the easier we can make it for our staff to access apps they need, the less IT overhead we need. This where Intune scores some more victories—as a part of Office365, it works with our existing SSO. We simply needed to grant users licenses. From there, they are free to download the Company Portal app and sign in. The device add process is similar to other MDM solutions. It will ask the user for permissions to perform the functions it needs (management certificates for iOS, device administrator for Android, etc).

Notice that the Company portal app allows for easy app discovery and management. As long as they meet deployment criteria, users can find easily find apps by category. They can also see what other devices they have enrolled and if those devices are compliant. Each licensed Intune user is entitled to up to 5 devices (admins can limit this further).

For us, the star of the show was in app deployment. The Apps section does exactly what we need it to: deploy apps and keep them updated on our schedule.  The first step is to add an app. Much like policies, the process here is to add it and then deploy it. 

Marty post 4 v2

The Add App function launches a ClickOnce application that allows you to upload an app directly to Intune, hosted an external link, or—for iOS only—managed from the App Store. This same application is used to manage existing deployments. From this ClickOnce application you can change what types of devices can run the app (in the case of iOS universal apps), rename the apps, and keep apps updated. This was critical for us. Once a user has downloaded an app from Intune, they will then always have the latest version of that app on their device. The same is true for any apps we require the install for. One note here is that apps deployed to device groups that are required installs can take several hours after being upload to be deployed. The same is true with app updates. This delay does not appear to exist for apps deployed to users that are requested through the company portal.

In a lot of respects, Intune has more in common with System Center than other established MDM products. For example, when you want to deploy an app to groups of devices, you only have the options to Install or Uninstall. You can only make an app available to people via the portal by deploying to a group of users. While not immediately clear, this methodology makes a lot of sense: you might have groups for tablets and phones but deploying a universal app to a user allows someone with an iPhone and an iPad to get the app as needed without the need for two separate deployments.

Some other notes to keep in mind when considering Intune:

  • Intune supports direct connections to Exchange and SCCM. While we don’t employ these at Sonoma, leveraging them can give you more centralized control over devices.
  • Intune is smart about app deployments. For example, f you deploy an APK file to the “All Mobile Devices” group and mark it a required install, it won’t try and deploy to iOS devices or Windows machines. Keep this in mind when deciding how best to deploy your various mobile applications.
  • In our testing, sign-ins timed out very frequently, even in the Company Portal app (though the login itself is cached). This is a nice security measure but may cause confusion and you will want to communicate that to your users. 

Learn how to use Voice of the Customer in this guide

Topics: Enterprise Mobility Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

Microsoft PSA - The More You Know

Today's blog post was written by Principal Consultants Nick Costanzo and Jeff Meister.

For today's blog post, we return to our "The More You Know" series after having spent some time under the hood of Microsoft's new Project Service Automation (PSA) solution. In a previous post, we covered a lot of the high-level features available in the system. Now that the solution is publicly available, we want to take some time to explore some of the feature functionality a little more in-depth.

As stated in our previous post, Microsoft's PSA Solution is an end-to-end solution which covers the entire customer life-cycle for delivering professional engagement; today we will start at the beginning and focus on Opportunity Management within PSA.

Sales Process Overview

We'll start with a quick review of a sample Sales Process within a professional service organization and the associated tasks that come with each phase.

Psa more you know image 1

Now that the sales process has been defined, let's look at what Microsoft's PSA solution has to offer for implementing a Sales Process.

Struggling with user adoption of your Microsoft Dynamics CRM system? Learn about our free tool to get the data you need to measure and drastically improve end user adoption.


PSA takes the native Opportunity and extends it to support the ability to sell both Project and Product components. On the new Opportunity: Project Information form you can:

  • Itemize based on your organizations offerings (this includes not only a Services estimate, but also Expenses and Products).
  • Track probability to close and estimated close date as you would with native CRM.
  • Define Sales and Stakeholder team as you would with native CRM.

Psa more you know image 2


At this stage, the solution allows for high-level estimation based on a proposed delivery plan. Using the new Quote: Project Information form, you can view:

  • Profitability and Pricing measurements based on resource roles assigned as part of the delivery plan.

Psa more you know image 3

  • Billing methods and invoice schedules are also defined, including support for Fixed Price or Time and Material billing.

Psa more you know image 4

  • Comparison to customer budget is also displayed by Quote line, to ensure your project is rightly sized for your client.

Psa more you know image 5

Project Delivery Estimate

At this point of the Sales Process, a detailed project plan can be created and applied to the quote. With this plan, we are able to provide:

  • Resource mixing based on defined groups with the company.
  • Costing and Profitability calculations.
  • Validation across customer expectations.

Psa more you know image 6

Confirm Quote

Now that estimate has been completed by Delivery, we are able to:

  • Confirm the quote with a bottom-up estimate based on the detailed project plan.
  • Invoice scheduling based on billing method (Fixed Price or Time and Materials) for each quote line.

Psa more you know image 7

  • Generate a SOW based on the details validated throughout the Sales Process.

Psa more you know image 8

Now that the deal has been won, we are at a good stopping point. We have also transitioned very nicely into our next post which will be a more detailed look into the Project Estimation process…stay tuned!

Learn how to use Voice of the Customer in this guide

Topics: Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

Privilege Error, Administrative Mode, & Form Layout Reminders

Strange title…you probably wonder how this ties together. Well, let's start with a little [true] story.

Yesterday, one of my colleagues was unable to access any of her records in CRM, but was working fine the day before. It was an odd conundrum as nothing *should* have changed.

  • The first step was look to ensure she had valid security roles. Yup…roles still there. [hint: this should have been enough for us to deduce the problem, but we tried a few more things before we figured it out.]
  • We removed all of her roles and the re-added them, hoping maybe it would reset her account. No luck!
  • She tried to access CRM on another machine, same results.
  • We then removed her roles and sure enough, she got the expected can't access CRM at all.

That result finally tipped us to the problem…

She could get into CRM but not access any records meant it was a license problem. Sure enough, looking closer at her user record, her Access Mode was Administrative and she was set to restrictive access. We merely flipped back those fields to their appropriate values, and she was back in business.

Now, in hindsight, we should have checked the license first (or at least second), but it didn't jump out at us as nothing should have changed with it. So, if your user can get into CRM but not see any entity records, look at her license type immediately.

But, I was curious as to why/how it was changed. This lead me to check the audit logs and I discovered that the day before, another colleague changed her license type. After a quick chat, it turns out she was merely updating her employee referrer value, and must have accidentally changed those fields. Weird, but as shown in the screenshot below, it was pretty easy to see how that could have happened.


We have definitely seen that users can inadvertently change values as they tab or click through the form, and this exactly what happened here.

I have no idea how the Employee Referrer field ended up in the CAL section. Was probably an oversight during our upgrade. Note: we have already relocated that field. Smile

The other item to address is why users are able to update Access Mode, Restricted Access Mode, and License Type. That should really more of a System Administrator task. Unfortunately those fields are not eligible for Field Level Security. So, we used our Dynamic Forms tool to secure those fields from all users except system administrators. Download our free community version of Dynamic Forms if you would like to do this yourself. If you don't use code/tool to protect these fields, consider moving those fields to a section away from the main parts of the form.

This situation provides a great reminder to consider your form layout and ensure fields are in the best possible location for discoverability and access, but also in cases like this we should have done a better job of preventing accidental changes to critical fields.

Topics: Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online