Sonoma Partners Microsoft CRM and Salesforce Blog

Troubleshooting Currency Rollup Fields

Today's blog post was written by Ian Moore, Senior Developer at Sonoma Partners.

Rollup fields are an excellent feature in Microsoft Dynamics that allow you to compute aggregate data for an entity across child records. They work great with currency fields - but if you run into trouble, you must be aware of some native fields that help control currency values.

We recently encountered an issue where currency rollup fields were not calculating for a particular account – other accounts in the system were fine, but one record would give warnings when it was opened.

Ian moore 1

The warning seems to point to the exact issue; one that can be common if you are loading data from external sources. Any record that has currency fields will automatically have a Currency (transactioncurrencyid) field added to it in order to have the correct value.

Trying to refresh the rollup field through the UI caused the following error pop-up with the same message:

Ian moore 2

The log file from this error also pointed to missing a missing currency somewhere in the rollup calculation:

Ian moore 3

The logical next step is to use Advanced Find to locate any records in this rollup that do not contain data for the Currency field, as well as verifying that the account itself had a Currency set.

In our case, everything looked in order. Both the account and all child entities in the rollup field contained “US Dollar” as their currency.

So, why the error?

It turns out there is a second native field involved for any currency data in Dynamics CRM: Exchange Rate

Adding Exchange Rate to our account form, we could see it was blank:

Ian moore 4

How do we set this field? Any effort to populate it through the API were fruitless – the value was simply ignored. What worked? Update one of the currency fields on your record to any value, save, and the system will automatically set the Exchange Rate for you.

Ian moore 5

With this value in place, our roll up fields calculated as expected!

Ian moore 6

If you’re having trouble with currency rollup fields, just remember to check two pieces of data:

  1. Currency field on the parent record and all child records
  2. Exchange Rate field on the parent record and all child records

Thanks for reading! If you run into further problems with this or otherwise, feel free to reach out.

Topics: Microsoft Dynamics 365

Quick and Easy Trello to CRM Integration

Today's blog post was written by Angel Shishkov, Principal Developer at Sonoma Partners.

At Sonoma Partners, we use CRM to track our internal work tasks, among many other things. Some of our clients and projects use their own systems for work and defect tracking, like Jira, Trello, or Excel, so we often have to consolidate data between the systems.

Today, I am going to talk about a quick and easy integration we built to bring Trello cards into CRM tasks.


First of all, I will assume you know what Trello is and how it is used. In this particular case, we used the cards as the equivalent of defect reports, along with comments, image attachments, and moving the card between different lists to indicate a status change. The manual process was to have our QA open the card in Trello, review the comments, create a record in CRM, and manually copy the card contents into it. The goal was to automate this process and eliminate the manual copying of the card contents into CRM.


I’d like to qualify what I mean by “quick” and “easy,” since both of those are relative terms. As far as integrations go, this one is quick because you could set it up in less than a couple of hours, and it is easy because it does not require you to learn the intricacies of either system being integrated (Trello and CRM in this case). There is some code involved, and your mileage will vary based on your development experience.

We need a way to create a CRM Task from a Trello Card, so we are going to need a way for the user to trigger this action while they have the Trello card open. For this example, we are going to use a Chrome Extension to put a button in the Chrome toolbar for the user to click. The actual logic we will write to read the Trello card and create the CRM Task, however, is not specific to Chrome Extensions.

The way we are going to connect the two systems is where the “easy” part comes in – we will not use either the Trello, CRM API, or SDK to do this, so you do not need to learn either. We are going to pull the Trello card’s contents through the Trello JSON feed, which is a feature that allows you to get a card’s contents in JSON format simply by adding “.json” to the end of the card’s URL. Since the user already has the card open in their browser, this should be easy. As for creating a Task in CRM, we are going to cheat a bit and not actually create the Task, but rather open a new Task form and pre-populate the subject and description fields with data from the Trello card. The user can then review the Task, make any changes, and hit Save to create it in CRM.


We need to set up our Chrome Extension first, however, I will not go in-depth about Chrome Extensions since that isn’t the focus of this article. I will lay out the basic steps, and know that there is much more detail online for those interested.

  1. If you have Visual Studio or you have done this before, you can use the Chrome Extension project template available here.
  2. If you are setting up the extension folder manually, create the following folder structure:
    1. app
    2. app\img
    3. app\lib
  3. In the img folder, put a 19x19 pixel image file called, "icon.png." This will be the icon of the extension in Chrome.
  4. In the lib folder, put a copy of the minified jQuery library. You can download it here. In this example, we will use jquery-3.1.0.min.js
  5. In the app folder, create the following three files. We will add content to them later.
    1. json
    2. html
    3. js

Now you should have your three folders set up with some files in them. Let’s add some content.

Open manifest.json in a text editor.

  1. manifest.json is the file that tells the Chrome Extension what components are included, what permissions are required, etc. Paste the following and save the file. If you did not use the file names above, make sure to change them below as well.

Open popup.html in a text editor.

  1. popup.html is the little web page that will open when you click on your extension icon in the Chrome toolbar. We don’t strictly need a web page for a simple extension like this, but we will add one for future enhancements anyway. Our web page has a title and a button for the user to click. Paste the following and save the file.

Open popup.js in a text editor.

  1. popup.js is the JavaScript “code behind” for the HTML page we set up above. It will handle the button click, read the Trello card, and open the CRM Task form. We are going to paste the whole code in there, and I will explain the functions individually. There is one part that you will need to edit in this code. The part marked with a //TODO comment has the URL to the CRM org. Replace yourorgurl with your CRM org URL. Paste the following and save the file.
  2. We will begin at the bottom first. The part that start with “document.addEventListener” just tells the page to call our init() function when it has loaded (that is, whenever the user clicks the extension icon in Chrome, which causes the page to display).
  3. Back up at the top, “TrelloToCRMController” is just a nice way to encapsulate all our logic into one “namespace.” All our methods are inside this namespace.
  4. Taking the methods from the bottom again – the init() function is what is called when our Chrome Extension webpage opens. It finds the Create Task button on the page and attaches a click handler function to it. This function will get called when the user clicks the Create Task button and it is called btnCreateTask_Clicked.
  5. The btnCreateTask_Clicked() function is called when the user clicks the Create Task button. It uses the Chrome Extension API to get the currently active tab in the browser and pass it to the createTaskFromTab function.
  6. The createTaskFromTab(tab) function takes a Chrome tab as a parameter and is the main function that reads the Trello card and opens the CRM task. It goes through several steps:
    1. Append “.json” to the end of the URL of the current tab (which we assume to be an opened Trello card). You can try this in your browser – open a card in Trello, then edit the URL in your browser to add “.json” to the end. This will take you to a page that has a JSON representation of the card. JSON is a format that is easily read by JavaScript into an object we can use in code. There is a comment in the code that shows the basic JSON format for a Trello card, or you can use a JSON visualizer online to check it out yourself.
    2. Call getJSON to retrieve the JSON contents of the Trello card. We are using jQuery, which was included in the extension during setup, so we have access to the $.getJSON method. It is an asynchronous method, so the rest of the code is inside the callback function.
    3. We are going to set two fields on the CRM Task – the title and description. The title will be the card name, but we want the description to be a list of all the actions on the card – comments, attachments and moves from one list to another. These actions are stored in the card.actions collection, so we loop through all of those to construct a description string.
    4. There are different types of Trello card actions, such as “commentCard”, “updateCard”, etc. They have slightly different properties, so we have a case statement to process each. For “createCard” we just log who created it. For “commentCard” we record the comment text. “updateCard” is a move from one list to another, so we record the previous list and new list in the string. And for “addAttachmentToCard” we just record the URL of the attachment.
    5. Once the description string is prepared, the last piece left is to open the Task form in CRM. Forms in CRM can pre-populate their fields with data based on parameters passed in the URL. Specifically, there is a parameter called “extraqs” that can contain a list of name/value pairs of field names and their values. We are going to use this feature to open the Task form with a pre-populated subject and description. Finally, the newTaskUrl variable is the URL to a new Task form in CRM and we use the Chrome API to open a new tab to that URL.


This is the last step (besides all the bug fixing and enhancement requests that will come) in the example. Since we used a Chrome Extension to host our solution, we will need to install it in Chrome to test it out.

  1. Open Chrome, click the ellipsis on the top-right for the menu and open the Settings page. Select Extensions on the left.
  2. Check the Developer Mode checkbox on the top. This will display a couple of extra buttons. We are going to use Developer mode to quickly deploy our extension, so we don’t have to bother with deploying it to the Chrome app store.
  3. Click the Load Unpacked Extension button on the top. If you don’t see it, make sure Developer Mode is checked.
  4. Browse to your “app” folder and select it, click OK.
  5. You should see your extension appear in the list on the Chrome Extensions page. Make sure Enabled is checked and there are no errors. If you make any changes to the code, you can come back here and click Reload to update the extension with your latest changes.
  6. You should now see the extension icon you added during Setup show up in the top right of the Chrome browser.
  7. Open Trello, browse to a board and open a card to test with. With the card open in the Chrome tab, click the extension icon. A small webpage will drop down with a Create Task button. When you click it, a new Chrome tab will open with your CRM task. Congratulations!


This is a relatively simple and bare-bones integration. It is not very configurable, has no error handling and doesn’t look great, but it gets the job done. If you are looking to expand on this or build something much more complex and you need some help, give us a call. Thanks for reading!

Ease into the cloud with Microsoft Dynamics Lifecycle Services

Topics: Microsoft Dynamics 365

Migrating and Integrating Dates to Microsoft Dynamics

Today's blog post was written by Rob Jasinski, Principal Developer at Sonoma Partners.

Whether migrating data into CRM from a legacy system or from an other external source or handling an ongoing integration sync into your CRM environment, handling dates can pose unique challenges. In CRM, dates are actually stored as date and time, even though there may be no time portion to the date. If no time is entered or supplied, it is defaulted to 00:00 (midnight). Also, the time portion is stored as UTC in CRM. When migrating data into CRM, the time zone of the user that is migrating (or integrating) the data is used.

So, for example, if the user is in the Central time zone, and a date of “10/15/2016” is passed into a field called birthdate, first “00:00” time is added to the date, then CRM converts the date and time to UTC. So it finally is stored as “10/15/2016 06:00” (+6 hours for CST) in CRM. Even though the time portion may never be displayed to the user, CRM is still always converting this date and time to the user viewing the data’s native time zone. Now if a user in the Mountain time zone is displayed this date, they will actually see “10/14/2016” in CRM. The reason for this is the date was migrated with no time, so it defaulted to midnight CST (since the user used to migrate the data was in the Central time zone). Internally, CRM then converts this to “10/14/2016 11:00pm” for the users in the Mountain time zone and since time may not be displayed, the user may only see the date portion, “10/14/2016”. This can be confusing and ultimately, the wrong date is displayed to the user.

There a couple of workarounds for this. First, instead of using a date field, use a text field in CRM and store the date as text. The problem with this is the date cannot be used in any date calculations or native CRM date filtering logic. The other workaround is to take the time portion and change it to 12:00 (noon). So in the example above, modify the date to “10/15/2016 12:00” before passing it into CRM. Once CRM converts this date to UTC, it will still allow for a 12-hour leeway, in either direction, for time zone conversions. So, in the example from earlier, a date of “10/15/2016 12:00” would be stored as “10/15/2016 18:00” in CRM. This date, displayed to a user in the Mountain time zone, would convert to “10/15/2016 11:00” thereby preserving the actual correct date once displayed.

If the time portion is required (i.e. for appointments, transactions, auditing, etc.) or if your CRM implementation is global, then this work around will not be the right solution. But if the time data is needed, then this is usually not an issue since the time portion would most likely be displayed to the user anyway.

Ease into the cloud with Microsoft Dynamics Lifecycle Services

Topics: Microsoft Dynamics 365

CRM and Yammer, Together Forever

Today's blog post was written by Ross Talbot, Principal Developer at Sonoma Partners.

Never underestimate the value of collaboration within your organization and Microsoft Dynamics.

In our previous post, we covered Activity Feeds as one option for promoting collaboration at your organization through CRM. Whether it is visibility regarding sales within your organization across functional areas in your organization or alerts within your team to provide status updates on deals in progress, both manual and automated options allow you to leverage Activity Feeds within your Dynamics 365 instance to enhance your team’s ability to collaborate. 

Going through collaboration options in Dynamics (hereafter also referred to as "CRM"), we will be looking at Yammer in this post. Connecting Yammer to your CRM instance replaces Activity Feeds; the two cannot co-exist. It is important to note that there is not a native way to remove Yammer once it has been configured in your CRM instance, but more on that later. For now, consider testing this in an instance you can reset if you find Yammer just isn’t the right fit for your organization.

To get things started, we need a Yammer network to use. For this example, we have a new Yammer network and will link it to a CRM Online instance. Detailed configuration information from Microsoft can be found here. Yammer configuration is found in CRM under the Settings > Configuration section. You need an appropriate security role (we are using a System Administrator account) to continue.

Rt 1

Give your consent to link Dynamics CRM Online and Yammer in the configuration page, and now we are really ready to go. This approval will replace the Activity Feeds in CRM, commandeer the social pane on records, take over as the centerpiece on the out-of-the-box social dashboard, and become the behind-the-scenes target for your system and user posts going forward (so this is important if you are using Activity Feeds already).

Rt 2

You will want to consider your options for the next two choices, so we want to explore the downstream effects of your options. I recommend using a specific Yammer group. The default is blank, which will direct posts to the “All Company” group in Yammer. This group is not configurable on the Yammer side and all users (regardless of their user status within CRM) will see posts in this area. The decision point here should be focused on cutting down noise for non-CRM Yammer users since All Company is a group everyone sees. One of the benefits is that you may want all users to see those posts, but a group named after your CRM Production instance also helps categorize these posts so even if everyone joins the CRM group, it makes the posts more meaningful. You also may want all users to see posts regardless of their CRM Access, so you want to choose the option that fits your needs best. The goal is to give the posts focus when needed and ensure that people won’t miss something that is valuable to them.

Up in Yammer, we will create a group called “CRM Production Blog” for this example. The reason we denote it as production is that we likely have at least one sandbox/lower lifecycle instance of CRM and when we test auto-posting options, we will want to ensure it is clear which instance of CRM the posts belong to (again more categorization/noise reduction for your production users than anything else). This will be the default group, but that can be changed when posting to target a different parent group. Note that if you copy a production instance to a sandbox for testing purposes, this configuration will need to be updated to match the Sandbox group in Yammer at that time.

Rt 3

Rt 4

Never overlook the next setting option or assume its meaning, as public versus private posting is next on our list to review. Since the group is configured for all of CRM, or All Company if you choose to leave the default as is, this privacy setting may also be useful in cutting down the posts in CRM that may not apply to all of your CRM users. This setting only applies to Yammer in CRM though, as posts will be available in Yammer itself under the CRM Production Blog group in our example and all members of that group can see the contents. This is more of an obscurity setting than a security setting, so you want to choose the option that makes sense for your setup. Security itself is not shared between CRM and Yammer, so you will want to ensure that information you need truly private is stored in a place like CRM with more granular record security. Yammer does have private groups, but the default group linked to CRM would then need to include all CRM users for collaboration purposes which would defeat it. 

Going back to the configuration, I recommend using public unless you have a need to switch this setting. Collaboration works best when more people are involved and if the content will be relevant, you want your team to see it. For this example, however, I will show what setting this option to private looks like so it gives you a better look at the CRM and Yammer possibilities.

Rt 5

To configure Yammer and CRM with the private setting, we just switch the setting in the configuration panel. Unlike so many places in CRM, there is no OK or Save button, and these options auto-save. I usually verify by navigating away and then back to the Yammer configuration page to ensure my changes stay in the system.

Rt 6

Let us now head to a CRM record to review what private configuration looks like to the user. The social pane will show Yammer posts on a record only if the current user is following that record. If a user is not following the record, they will see the message below. They will see a gap for the “missing post” on the Social Dashboard instead of this message.

Rt 7

You now want to follow the record in CRM to make the posts visible in both places. We can now see posts related to the record made by other users and can reply with additional posts or comments of our own. The social activity dashboard will show posts in the CRM group for records you follow or posts made in the group itself unrelated to records.

Rt 8

Down in the record’s Yammer feed, we can change the target group of our post in addition to adding our post text to ensure we get the visibility we need. We now add our post to the record’s feed. It is now visible on the record wall, social dashboard, and in Yammer for those who have access to each location. This will get eyes on the post that are not members of the CRM Yammer group.

Rt 10

Never miss an automation opportunity, either. Configuration posts can target Yammer as well, so the automated posts from Activity Feeds can be updated to post to Yammer from CRM. We navigate to Settings and choose Activity Feeds Rules. Opening the rule for a New Account, we note that the checkbox is checked for “Post to Yammer Activity Stream” on the form. This shows in CRM as a system post in a record feed and in Yammer under the Recent Activity section on the right side. The automatic posts work the same as Activity Feeds, and if you want to customize the content of these posts, you will need a workflow assembly or plugin to do so. This can give awareness to users in different areas of your business about new customers that different business segments should be looking to target or opportunities with customers shared across segments.

Rt 11

Going into more detail on the CRM and Yammer record links, this is built on Open Graph objects. The link contains a few actions and whether you are looking at this in CRM or Yammer, these functions pertain to Yammer. We will start with the options shown as you hover over this link as shown below.

Rt 12

To start, you will see a “Follow” link which is similar to a concept in CRM, but they are not related. The Yammer Follow shown here will follow the thread in Yammer only. If posts are made in a record’s thread and your integration option is set to Private, you would still need to follow the record in CRM to view the record’s wall. The Yammer follow affects posts and comments you see when you filter your Yammer feed to Following as opposed to All or Discovery.

Rt 13

Run back to the link options, and let’s look at share next. Again, this is a similar concept to CRM but unrelated. Sharing in this Yammer context allows you to send the link as a private message to a Yammer user or to share a copy of this link in another Yammer group. Share is only a visible option when viewing this link in Yammer and not in CRM.

Rt 14

Around the right side of this list, we see a “Go to Page” option. Clicking this launches the full thread for the graph object. The name of the record, the type, creation timestamp, and link to the record in CRM appear at the top of the thread. Posts and comments regarding this record are shown in this thread with new posting options similar to posting in a Yammer group. You also will see additional posting and commenting options that are not available with the Yammer feeds embedded in CRM (for example attaching a file) when viewing threads and groups in Yammer itself.

Rt 15

And there are more options just below the link as well, although most are only visible in Yammer so I will list them at a high level. Like, Bookmark, and Email Me should be self-explanatory, and reply will just add a comment to the thread. Share functions the same as the link, but with the post’s thread instead of the graph link. Stop Following will remove your follow from this post. View conversation will open the thread in its own window, but unlike the page this is for the post’s thread not the graph object’s which can contain multiple posts and their replies. Adding topics will add hashtag topics to the post for increased search ability. Delete will only show if you have permission to delete the post, otherwise there will be a “Hide Conversation” option instead to remove it from view. Note: Only the Like, Reply, and View Conversation options are visible from CRM.

Rt 16

Desert Yammer if you feel this is not the right fit for your organization. CRM does not actually give you the option to remove Yammer from your CRM instance (and that is the reason for the title of this post), however the OrgDBOrgSettings tool found here can accomplish this with a button found just under the list of settings. Just install the managed solution from Codeplex, and you can switch your organization to another method of collaborating if Yammer isn’t a fit for you.

Rt 17

You want to select the right collaboration tool for your organization and in summary, Yammer provides a bit more than Activity Feeds as far as options are concerned. Yammer gives you the ability to include users outside of CRM in your collaboration. It gives users the ability (if desired) to see posts about records they may not have access to so they are aware of high level information, such as an opportunity from another department for a shared customer. Yammer provides the ability to have non-CRM related conversations as well for interests other than work (sports, movies, music, you name it). Yammer also provides similar functionality to Activity Feeds, so if you have non-CRM users that you want involved in your collaboration, Yammer might be for you. You also may have heard about some upcoming changes with Yammer, and you may be aware of other collaboration options within Dynamics, so stay tuned for more updates here!

Topics: Microsoft Dynamics 365

Dynamics 365 & Flow – 3 Simple Steps to Email Sentiment Tracking

If you’re not familiar with Microsoft Flow yet, it is definitely worth checking out.  It allows you to easily connect many different applications, one of which is Dynamics 365, to each other.  Earlier this year, the ability to connect to Microsoft’s Text Analysis API was added which takes in a string of text and returns a sentiment score from 0 to 1 with 0 being negative and 1 being positive.  This means we can painlessly connect Dynamics 365 to the Text Analysis API which I will walk through in this post in the form of Email sentiment tracking.

The first thing we need to do is create a custom decimal attribute on the Email entity to track sentiment.


Once that attribute is created, navigate to Microsoft Flow and create a new blank Flow.  In the “search for more triggers” box, type “create a record” and choose the Dynamics 365 option.  You will need to authenticate to your Dynamics 365 environment and then select your Organization Name from the list.  Once that is done, select Email Messages from the Entity list as well.


Next, click “+ New step” and select “Add an action” and in the “Search for more actions” box, type “sentiment” and select the “Cognitive Services Text Analytics” option.  You will then need to sign up for Cognitive Services and provide your API Key to Flow.  It is free to try for up to 5,000 API calls per month.

Once you provided your Cognitive Services details, put your mouse cursor in the “Text to analyze” box and a sidebar should show up with a list of options like so:


Find “Description” in the list and select it.

Next, click “+ New step” and “Add an action” again.  Search for “update a record” and choose the Dynamics 365 option.  Again select your Organization and Email Messages.  Highlight the “Record identifier” box and choose Email Message from the sidebar list of options.


Then click the “Show advanced options” at the bottom of the Update a record section.  This will expand the section with a big list of Email attributes.  You should be able to find the custom Sentiment attribute that we created in the beginning of this post. 

Highlight the Sentiment text box and select Score from the sidebar list of options.


That’s it!  The Flow is complete so you can give it a name at the top of the page and then click “Create flow”.

In the list of Flows, make sure the toggle control is set to On.


Now in your Dynamics 365 environment, create a new Email record and save it.

Back in Flow, click the circle icon with an ‘i’ in the middle.


This will show a history of runs for the Flow.


Once you see that your Flow was successfully ran, go back to your Email record in Dynamics 365 and you should see the Sentiment field populated.


Now all emails created in Dynamics 365 will have a sentiment value populated.  You could even extend it further and add a native Rollup field to Contact to store the average Sentiment across all emails that were sent by the Contact.

There is a caveat that the Text Analysis API is only free for 5,000 calls per month.  Below is the pricing chart taken from the Cognitive Services pricing page:


Topics: Microsoft Dynamics 365 Microsoft Dynamics CRM Online

PowerApps with Dynamics 365 Update

Back in October 2016 I posted a step by step instruction for creating a basic contact application using the PowerApps preview designer with the new Dynamics 365 connector.

Today, I provided an encore presentation for the CRMUG. So, in preparation for the webinar, I went back through the steps using the new production version of the PowerApps studio. As I guessed, some fantastic updates to application were deployed, which prompted changes and new screenshots for our original application. Our original post was updated reflecting the changes as of today.

I am sure there is a more comprehensive list somewhere, but listed below are a few the differences & improvements I found useful for updating my contact application.

  • The default Dynamics 365 contact app now includes a refresh icon/functionality.
  • The 'Theme' functionality is no longer on its own Design tab. It is on the Main tab, but isn't readily discoverable if your window is too small.
  • The PowerApps team added support for multi-environments. Learn more at
  • You can now search for advanced properties. Super nice!
  • More properties are exposed in the ribbon, making it easier to change them without having to go and search in the Advanced tab.
  • Added an application description field. Doesn't sound like much, but when you start creating a lot of applications, it is nice to have more context about them. Smile
  • The default icon size appears to be larger than the preview. We still recommend using the search icon and sizing it the same as the text box height, but added some padding to make it look better.
  • Overall performance of the client was improved. I am sure they are still making further improvements, but the latest version was noticeably faster than the preview.


Should you need to submit ideas or help with your apps, please use the following forum link:

There two forums for you, support and ideas.


The PowerApps team uses these sites for feedback and will forward any Dynamics 365 connector questions to the Dynamics team where appropriate.

Topics: Enterprise Mobility Microsoft Dynamics 365

Integrating MDR education and school data with your deployment

Sonoma Partners works with multiple customers in the education industry, and they frequently ask us about integrating MDR's school data with their CRM system. If you're not familiar with MDR, they provide the most comprehensive set of data about schools and school administrators throughout the United States. Most folks consider MDR data as the "gold standard" in the education industry. If your business works with schools, that means you have a fixed universe of customers to sell to. Consequently, having clean and accurate data about schools and their contacts becomes hyper-critical!

To help make sure that our education customers have clean school data in their CRM system, Sonoma Partners developed a process to update CRM with the latest and greatest MDR education industry data on a regular basis. The MDR data updates include detailed information about both schools (accounts in CRM lingo) and administrators (contacts). Some of the data points provided by MDR include:

School / Account Sample Data Points (this is not the full list, there are over 300+ MDR account fields and 85+ contact fields)

  • MDR District Enrollment
  • MDR District Classification
  • MDR District Grade Span
  • MDR District PC Computers
  • MDR DMA Code
  • MDR School Improvement
  • MDR School Type
  • MDR Technology Sophistication Index
  • MDR Student Enrollment
  • MDR Student to Computer Ratio
  • MDR Number of Classrooms
  • MDR Number of Schools
  • MDR Open Date
  • MDR Total Budget
  • MDR Total Number of Students
  • MDR Total Software Budget
  • MDR Total Technology Budget

Administrator / Contact Sample Data Points (this is not the full list, there are ~25 MDR contact fields)

  • MDR Status
  • MDR Title
  • MDR Last Name
  • MDR First Name
  • MDR Middle
  • MDR Name
  • MDR Preferred Title
  • MDR Gender
  • MDR Last Update Date
  • MDR Job 1
  • MDR Job 2
  • MDR Computer User
  • MDR Advanced Placement
  • MDR Years at School
  • MDR Years of Teaching Experience
  • MDR Highest Degree Level
  • MDR Email Address

 After integrating the MDR data with, the end users can view and access the data through the user interface and it will appear like the following:


MDR publishes refreshed and new data several times per year. Our integration updates all of the Account and Contact MDR data fields with each MDR refresh.  We recognized that our customers will be updating their Account and Contact data directly in Salesforce as well, and they may have more accurate information earlier than what MDR collects.  Therefore, we set up an exception process so if a user directly updated any of the MDR data fields, the integration will not update a manually modified data field with the MDR refresh for at least 6 months. Please keep in mind that we setup this exception process on a field-by-field basis.  For example, if a user updated the Phone number last month, but all of the other fields have not been updated in over 6 months, when the MDR refresh is run, all of the Account fields listed will be updated except for the Phone, which will not be overridden by the MDR integration.

We also recognized that you might NEVER want some fields overriden by the latest MDR data refresh (for example the email, Billing Address or Shipping Address).  To accommodate these scenarios we created a “Never Update from MDR” checkbox directly below each of these three data fields.  If you do not want your information overwritten, users can check this checkbox for the appropriate field.



Lastly (and maybe most importantly), MDR provides hierarchy data about how the schools rollup to districts, sub-districts, etc. This hierarchy data allows companies to perform rollup calculations of they well they perform within districts at an aggregate level. Consequently, companies could answer questions like "What's our total sales pipeline in District XYZ? How much of product X did we sell to sub-district ABC in the last 12 months?" This screenshot shows how we modeled the school hierarchy within


The MDR data integration with CRM provides our education industry customers with several benefits, including:

  • Accurate, cleansed account and contact data
  • Access to full universe of education customers based on standardized industry database
  • A repeatable data load process
  • Reduced need for manual record maintenance
  • Better information to make informed sales and marketing decisions

And yes, if you're curious, Sonoma Partners could help Microsoft Dynamics CRM customers setup a similar integration with MDR data!

Please contact us if you're interested in learning more about our experience integrating MDR data into your CRM system.

Topics: Microsoft Dynamics 365 Microsoft Dynamics CRM Salesforce

Dynamics 365 – Updates to Business Rules and Actions

Continuing with our posts regarding the recent release of Dynamics 365, next up are the changes Microsoft has added to Business Rules  Workflow Actions.  Additionally, head over to the CRM Roadmap site, or the CRM What’s New site to see more of the features that have recently gone live. 

Business Rules

Like Business Process Flows, Business Rule were introduced in CRM 2013, and have received some updates in the Dynamics 365 release.  First and foremost is the fact that Business Rules will utilize the new Visual Process Designer that was introduced with Dynamics 365.

For each component, as you’re building out the rule and adding in additional conditions and actions, you’ll see a text definition representation of your logic.  As your Business Rule is being built out, you can see the logic grow over time.

Also added with Dynamics 365, is a new “Show Recommendation” Action.  With this action, an icon will be added next to a field that will provide some information and show a message that the user can take action upon.  During definition of the Show Recommendation action, you provide the message to display along with the action that will occur if the user clicks on “Accept” on the recommendation. 

For example, if you have an Opportunity where the customer indicated the purchase timeframe is immediate, and their budget amount is > $50,000, then you may want to recommend having the salesperson update the Rating to Hot.

See below for how the Business Rules look in the new Visual Process Designer with the Recommendation action, and the text based representation of the rules.


When on an Opportunity that meets the criteria of the Business Rule conditions, the recommendation will be displayed and if the user clicks on Apply, then the Action defined in the Show Recommendation component will be executed.  In this case, we are setting Rating to Hot.


Additional Actions

Microsoft also added some new out of the box Actions that can be used in Processes (Workflows, Dialogs, and Actions). 

  • Add (Case) to Queue
  • Add user to Record Team
  • Apply Routing Rule (to Case)
  • Calculate Actual Value (of Opportunity)
  • Close Opportunity
  • Get Quote Products from Opportunity
  • Get Sales Order Products from Opportunity
  • Lock Invoice Pricing
  • Lock Sales Order Pricing
  • Qualify Lead
  • Remove User from Record Team
  • Resolve Incident
  • Resolve Quote
  • Revise Quote
  • Unlock Invoice Pricing
  • Unlock Sales Order Pricing

The following two Workflow Actions were existed before the release of Dynamics 365:

  • Set Process
  • Set Word Template


While Microsoft hasn’t included workflows in the new Visual Process Designer (yet), these new actions will go a long way to allowing business analysts to extend the system without code.  The stage is also set for Microsoft to extend the functionality of the Visual Process Designer in an upcoming release to include the ability to more visually create and edit workflows.

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

Introducing Multi-Select for Dynamics 365 for Sales

Today's blog post was written by William Dibbern, Principal Developer at Sonoma Partners.

One request that we receive a lot is to allow users the ability to select multiple values from a predefined list. Say your organization tracks contacts, and you would like to keep track of the interests of those contacts.

Natively, one way to accomplish this in Dynamics 365 for Sales, without custom code, is to create a many-to-many relationship with a custom "Interests" entity. This is all fine until you ask a user to enter in this data repeatedly and quickly, and there the user experience falls apart. A user must remember what all the predefined interests are in order to use the autocomplete functionality, or they must interact with a lookup dialog in order to search through the available options. This either means your user is enduring a heavy cognitive load or a bunch of clicks. Not as good of an experience as it could be.

To solve for this gap, we crafted a managed solution that recreates the most common user experiences for multi-select controls from across the web, with the goal of making the user experience a little bit easier.

Let's take a walk through some of the pre-built custom user interface options we have inside this new solution.


Using the Checklist control, users can select the records they desire simply by clicking on a checkbox. No typing, only one click needed. If desired however, users are also able to search through options using the provided search box and filter down to see only what has been selected using the All and Selected view toggles.

Checklist Control Example

Use this control when: saving space on a form is key; you have a smaller data set; users enter and edit data more often than they are referencing it.


Using the Listbox control, users can click Edit which will bring up a dialog that presents them with all of the available options. Within this dialog, the user can select multiple options by holding the [shift] key or by searching for a specific value. Once an option or multiple options are chosen, they can be moved to the Selected column by pressing the >> button.

Listbox Control Example

Use this control when: saving space on a form is key; you have a larger data set; users reference the data in question more often then they enter or modify it.

List View

This control is very similar to the Checklist control, but the formatting provides for a lot more information about each option to be displayed to the user. Using the List View control, users can select the options they desire by clicking on the checkbox next to the description and are able to search for specific items. No dialog to get in the way, so we keep the click count low. Users are also able to click on Selected to view only the selected items.

List View Control Example

Use this control when: space savings aren't necessary; you'd like to use a custom item template to display more information about an option; you have a smaller data set; users are entering or modifying data more than they are referencing it.


This version of the multi-select is based on a popular library called Selectize, thus the super clever name. Using the Selectize control, users can click into the field and select the records they desire by clicking on the option's description or by using the arrows and [enter] keys. Once items have been selected, they can view them within the field and remove them by clicking the small x or deleting them with their keyboard.

Selectize Control Example

Use this control when: saving space on a form is key; you have a smaller data set; users already know the data set they're selecting from.

Installation and Configuration

The multi-select solution is available as a Dynamics CRM 2015 managed solution which you can readily download from our website here. This same solution will work in Dynamics CRM 2016 and Dynamics 365 for Sales. Once downloaded and imported into your environment, you'll have some configuration to do depending on how your data is set up. We would recommend that you have prior knowledge of Dynamics 365 for Sales customizations before diving right in, as there is some limited technical knowledge required to configure this solution.

The mulit-select solution supports custom item templates (HTML) and many other options, but for the basics, you'll need to at least pick a method by which data is read from and stored in Dynamics 365 for Sales. The multi-select solution supports the following common backing data structures, noting there are pros and cons to each which must be evaluated on a case-by-case basis:

  1. Display data from a global option set and store selected values in text fields. Using this method, the options come from the global option set, and one or (optionally) two text fields are used to store the selected values.

    Pros: Storing data this way makes it a bit easier to search through when working with quick find views or advanced find.

    Cons: If you tell any database guru you're storing a list of values in a single column, they'll probably freak, and they wouldn't be entirely off-base to do so. Storing data this way can make things harder down the road like reporting, migrations, etc.

  2. Display and store data from a custom N:N relationship. Using this method, a custom intersect entity is created between two entities (three total entities involved), and these custom intersect records are created when options are selected.

    Pros: Your resident database guru won't argue as much with you on this route, you have the option to store more data on the intersect record if desired, you can control the state of your intersect records and capture who created/modified them and when.

    Cons: Searching through your data using advanced find and quick views becomes more difficult.

  3. Display and store data from a native N:N relationship. Using this method, records are associated and disassociated according to what is selected.

    Pros: Again your resident database guru won't argue with you as much, and you get to skip creating a custom intersect entity.

    Cons: Similar to the second option, searching through your data using advanced find and quick views becomes more difficult.

Once you've determined how your data is to be read and stored, you're ready to get things configured. If you're ready to proceed, head on over to our documentation for more detailed instructions on how to configure the solution appropriately, and of course feel free to drop us a line if you have any questions or encounter any issues. 

New Call-to-action

Topics: Microsoft Dynamics 365

Dynamics 365 – Updates to Business Process Flows

Continuing with our posts regarding the recent release of Dynamics 365, next up are the changes Microsoft has added to Business Process Flows.  Additionally, head over to the CRM Roadmap site, or the CRM What’s New site to see more of the features that have recently gone live. 

Business Process Flows

Business Process Flows were first introduced to Dynamics CRM back in the CRM 2013 release, and enhanced in 2015 and 2016.  Continuing the trend, there have been enhancements in the Dynamics 365 release.

Security Updates

First off, one major change is that for every Business Process flow you have, you’ll see these show up in native Security Roles in a Business Process Flow tab.  From this tab you’re able to provide Create/Read/Write/Delete/Append/Append To permissions to your BPF.    This is because going forward, every business process you create and activate becomes a table in the database just like any other entity. Every instance of that process (applied to a record) is a row in the table.

For example, you may want certain users to only see the Lead to Opportunity Sales Process, but other users you want to be able to not only see the process, but also move between stages of the process (Write permissions).  You’ll need to provide Append permissions if you want a user to be able switch processes and Append the process to the record they’re on.   The security on the BPF tab does not drive the ability to update the fields in the stage – that’s driven through normal field level security and security role permissions that have existed pre-Dynamics 365.

Note:  Your process will not show up in this tab until you Activate the process.  If you Deactivate it after updating security roles, the process will remain in the available in this tab so you will NOT need to go back and update your security roles again.  It’ll only be removed from the security role tab once you delete the process.


Additional Status Reasons

Business Process Flows that are active on record can now be abandoned.  This can be done via the Process dropdown, and business processes can be queried using Advanced Find (an entity will appear for each BPF you have) with status reasons of Active, Finished, and Aborted. Users can also mark a process as Finished if it’s in the last stage of the process.  Abandoned processes change the process color to gray while Finished processes remain green.  You can reactivate Abandoned and Finished processes.




Your abandoned processes will still be viewable via the Switch Process dialog, if you click on the Archived Processes link. You can then select the abandoned/archived process to view it.



Concurrent Processes

With Dynamics 365, you’re no longer confined to having a single Business Process flow active at a time for a record.  You can now have concurrent processes that run in parallel without conflict.  Different users or departments may be working multiple processes on the same record at the same time, and the state of the process is maintained. 

When you switch a process, you’ll be able to see what date/time each process  was started on for the record you’re on.



          Business Process flows now include additional actions that can be taken versus simply updating fields (steps) within as stage.  Stages can now execute workflows with a trigger of Stage Entry, or Stage Exit (you may want some workflows to send notifications when users enter a stage, and others to send notifications upon users existing a stage).

          Here’s a screenshot of the workflow component on the new Visual Process Designer (described in more detail here).  Note that for the workflow to show up to be selected in your Business Process, it has to be set to run On Demand, has to be the same entity as the Business Process stage, and has to be activated.

          A great use case of using workflow is to have it at the completion of a Business Process (therefore Stage Exit of the final stage), that will then use the Perform Action workflow step, to Set Process.  You can then automatically kick off the next Business Process as the current Business Process ends.  For example you can have the completion of a specific Business Process on an Opportunity kick off a workflow that creates a Case, and activates a Business Process on that newly created Case.


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