Sonoma Partners Microsoft CRM and Blog

How to Use Microsoft Dynamics CRM Business Process Flows: The Checklist Strategy

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

Usability is “king” when it comes to CRM because the biggest killer of CRM is lack of user adoption. 

It is a self-perpetuating reality.  If it becomes difficult to enter data, then data will not be entered properly, if at all.  If good data does not exist or is incomplete, then your CRM can no longer be trusted, thus having no value.  It is vitally important to take “ease of use” seriously as you design your CRM solution.

So, how does this relate to Microsoft Dynamics CRM's business process flows?  There are a few usability concepts I would like to call out that are potentially affected by BPFs.

Concept #1 - User-guided Process

One might argue that the BPF concept’s main goal was to assist/guide users through the input or absorption of data as part of a business process for a particular record.  If the business has a defined process, then this can be a big benefit.  The use of BPFs breaks down in the case where an organization does NOT have a well-defined process around the particular data.  This one is somewhat obvious.

Concept #2 - Good Form Design

Most of us know the importance of “good” form design, where we try to strike the right balance between having an ample amount of fields on a form to be valuable while not over-cluttering it or creating a data-entry chore.  The BPF concept can be a great tool to assist with this idea by allowing you to get creative with the placement/usage of fields either in the BPF bar or in the body of the form…or both.

Strategy – The Checklist

While this is not the “end all, be all” answer, one strategy to consider that incorporates the concepts listed above is to simplify the user experience by only placing “checklist” type fields in the BPF bar.  This means all fields with real data values would be placed in the body of the form.  For example, instead of having a “Key Strategy” long description field in the BPF bar, place that field in the body of the form and create a new “Yes/No” field called “Key Strategy Determined?” that will go into the BPF bar.  The basic idea is to create “checklist” type fields for the key milestones or key data captures relevant to the ideal process you want your users to follow.  While it requires the creation of extra fields in the entity, the consistency and predictability that this approach provides to the BPF bar and body of the form can create clarity for the end user.

One strategy for how to use Microsoft Dynamics CRM Business Process Flows

A few pros and cons that come to mind with this strategy include the following:


  • BPF bar has consistent and predictable entry/feedback
  • “Data completion” status within a record is easily determined
  • Reporting is more simple (advanced finds can be done eliminating left outer-join issue)
  • Form body for data entry is more traditional


  • Creation of extra fields (checklist fields) to be managed
  • Need space to place all data entry fields in the form body (could be an issue if many fields exist)

I want to make it clear that I am NOT advocating for this to be the one and only approach to configure BPFs, but I do believe it can be an effective strategy for some situations.  Some key factors that may make your organization a candidate for this approach are:

  1. You have defined processes
  2. You need to report on your users’ data entry practices
  3. You want to highlight key data milestones

When business process flows were first introduced, I loved the idea of bringing certain fields up from the body of the form into the process bar, allowing attention to be focused on key fields.  The BPF feature also provided the opportunity to decrease form length.  With that said, I've seen users get confused or reluctant to embrace the BPF concept like I expected.  My hunch as to why this is has to do with mixing data entry and checklist type fields within the BPF bar and form body.  While it seems intuitive enough, I have found that this specific inconsistency can throw off some users.  While this “checklist” strategy may not work for everyone, I do believe it to be an effective and viable approach.


How to get executives to pay attention to CRM


Topics: Microsoft Dynamics CRM

Need to export more records to Excel? We’ve got you covered with the OrgDBOrgSettings Editor!

With Dynamics, the default maximum record count to export to Excel is 10,000.  While this may work for a lot smaller business without a lot of data, it won’t work for most organizations.  An instance of this came up recently where a client of ours kept hitting the 10,000 record limit though they had many more records to export.

Typically in the past, if the customer was CRM OnPremise, you would be able to access this setting (along with the other OrgDBOrgSettings) using direct SQL.  Updating these values with SQL definitely wasn’t supported, but at least you could have conversations of updating the settings if you had individuals that knew what they were doing, or you created a support ticket with Microsoft to help you out.

However, if you had CRM Online, these settings weren’t available to you through the UI or even through SQL since with Online, you don’t have direct SQL access to your database.  What can you do?

That’s where the OrgDBOrgSettings editor comes in to play.  You can download the managed solution from this link.  The process to get it installed and use it is pretty simple.  Download the managed solution from that link, import it in as a normal solution into your environment, and then open up the solution.

From the configuration page of the solution, you’ll see the different settings that you have access to, what the default value is, what the current value is, and what the maximum value is (there are some limitations – you cannot update the MaxRecordsForExportToExcel to 500,000,000).


To edit a value, either double click on a row, or click the Edit link in the row for that setting.  When you do so, you have the option to set a custom value, or revert back to the default.  A checkbox at the bottom of the configuration page can be set or unset which will display a prompt to confirm the change upon making an update.



If you try to set a value over the maximum, you’ll get a message stating the requested change wasn’t saved, and the value will remain as it currently is.


This is a great utility to make supported updates to the OrgDBOrgSettings without having to reach out to Microsoft Support.  For a full list of all the settings that can be updated and a description of what the setting drives, navigate to this link.  Also, for more explanation on how to use the tool and what it can be used for, see this post from Sean McNellis who created the solution.  While this solution has been available for some time now, we’re hoping this is a great refresher to let you know what tools are available for free to help you make changes on your own.

Topics: CRM Best Practices Microsoft Dynamics CRM Microsoft Dynamics CRM 2013 Microsoft Dynamics CRM 2015 Microsoft Dynamics CRM 2016 Microsoft Dynamics CRM Online

Marketo Triggering MSCRM's Duplicate Detection

Today's post was written by Matt Dearing, Development Principal at Sonoma Partners.

For those that may be unfamiliar, Marketo’s solution offers marketing automation, email, and many other services. 

We recently ran into an error while working on a Marketo integration with one of our clients, where the solution wasn’t obvious at first.  We saw the following error logged when certain updates were pushed to MSCRM contacts:

“A record was not created or updated because a duplicate of the current record already exists.”

It seemed odd that updates from Marketo were triggering MSCRM duplicate detection, as we only allowed Marketo to update a couple of fields that were not a part of any criteria for duplicate detection rules in the CRM organization.

In general, making create/update calls against the MSCRM API will not trigger duplicate detection unless explicitly specified through the use of the SuppressDuplicateDetection parameter.

What's interesting about SuppressDuplicateDetection is that if you explicitly specify it as false while updating a record, even when the fields that are being set in the update are not a part of the duplicate criteria, MSCRM will still throw a duplicate error if the existing record already matches another in the system.

For example, if you have 2 contacts (ContactA and ContactB) in MSCRM with the same email address, and a duplicate detection rule that matches on email address, updating any field on the contact (job title, for instance) will still trigger the duplicate detection exception. 

The following code demonstrates this:

In this example, the duplicate detection error will be thrown because ContactB is already a duplicate of ContactA, due to them both having the same email address, even though email address is not altered in this update request.

We discovered that Marketo has a few internal flags, not exposed to end users, for suppressing MSCRM duplicate detection errors when creating/updating lead records or when updating contact records from Marketo to MSCRM.

My assumption is that Marketo explicitly sets SuppressDuplicateDetection to false when making MSCRM API calls. The internal Marketo flags are then used to dictate the value of SuppressDuplicateDetection passed to MSCRM. We worked with Marketo support to get this flag updated for our customer's Marketo instances and now all our changes in Marketo are flowing back to CRM as expected.

Contemplating your own Marketo Integration?  Let’s work together!

Topics: Microsoft Dynamics CRM

CRM Upgrade with SQL AlwaysOn

Today's post was written by Neil Erickson, Development Principal at Sonoma Partners.

As a firm that specializes in CRM consulting, we are proponents of using the technology we sell in our own processes. 

When upgrading to Dynamics CRM 2015 we went through the effort of moving to new hardware for both the CRM servers and SQL server. We decided that it was time to implement SQL AlwaysOn for redundancy.  A year later when it was time to upgrade one of our systems to CRM 2016, we elected for an in-place upgrade since both Windows and SQL remained up to date.

The upgrade process was going along without issue until the following error occurred:

System.Exception: Action Microsoft.Crm.Tools.Admin.SetReadCommittedSnapshotIsolation failed. ---> System.Data.SqlClient.SqlException: The operation cannot be performed on database "Grapevine_MSCRM" because it is involved in a database mirroring session or an availability group. Some operations are not allowed on a database that is participating in a database mirroring session or in an availability group.

Microsoft Dynamics CRM with SQL AlwaysOn

Upon reading the exception, my first thought was that we would need to completely undo the availability group and then rebuild it once the upgrade was complete.  Due to the size of the database, I expected that this could add an additional two hours to the upgrade process. 

Luckily, this process was not as lengthy as I imagined.  It was possible to go in and remove it from the Availability Group and have the upgrade process retry the action.

Remove Datasbase from Availability Group

This leaves the database running on what was the Primary Replica, and in the restoring state on the secondary.





Once the upgrade finishes you can add the database back to the availability group. Because the secondary is still in restoring mode, it will simply catch up the changes. This takes considerably less time than a full backup and restore cycle, and it can be accomplished by selecting “Join Only” for your initial data synchronization preference.

Topics: CRM Upgrade Microsoft Dynamics CRM

Microsoft Announces Dynamics 365 Integrated Cloud Platform

Today's post was written by Kayla Silverstein, Marketing Specialist at Sonoma Partners.

A rivalry well-known in the CRM space: Microsoft Dynamics vs. Salesforce

Microsoft took a significant step to improve its CRM solution and upstage its cloud-based competitor with the announcement of a new application: Microsoft Dynamics 365.

Available this fall, Microsoft Dynamics 365 combines Microsoft Dynamics CRM and ERP cloud solutions into a single cloud service. New purpose-built applications within the tool help manage specific business functions, including Financials, Field Service, Sales, Operations, Marketing, Project Service Automation, and Customer Service.

Microsoft addressed the launch of their new solution with the following:

“Business processes are at the core of every business. Across all industries our customers are looking to adapt their customer engagement and business operations processes to the digital era, to secure and expand their businesses. This ‘digital transformation’ requires a degree of business process agility – and a unification across the business – not supported by the traditional ‘siloed’ ERP and CRM approach of the past.”

The unveiling of Dynamics 365 provokes interest within the CRM world for a variety of reasons:

  • It demonstrates the increasing demand for CRM within a cloud environment.
  • It represents the need for an integrated business solution and the desire to simplify the massive amount of tools businesses are expected to utilize.
  • It shows that Microsoft understands the need to be nimble in the CRM world to compete with other market leaders.

Microsoft also recently announced their intention to acquire LinkedIn. The ability to combine CRM, ERP, Office 365, and LinkedIn is a useful one, and it could stand to give Microsoft a bit of an edge over industry rivals Salesforce and Oracle.

One thing is for sure: the real winner is the consumer. As these companies compete fiercely for market share, the consumer will benefit from ongoing innovation and acquisitions.

Topics: Microsoft Dynamics CRM

How to Build Interactive Dashboards in Dynamics CRM

Today's post was written by Nick Costanzo, Principal Consultant at Sonoma Partners.

By now, most organizations using Dynamics CRM for service management have become familiar with the Interactive Service Hub which includes built in dashboards for Tier 1 &  Tier 2 support, as well as Knowledge Managers.

However, if you’re in a different roll, such as an account manager, there are no pre-built dashboards at your disposal.  Fortunately, CRM allows the creation of additional interactive dashboards to meet the needs of all CRM users, and provide them with actionable data. Some common requests we hear include:

  1. Show me critical cases for my account
  2. Highlight the last date me or someone from my team contacted my account
  3. I need to categorize my accounts by priority

Here are a few simple steps to satisfy these requests:

  1. Create a new interactive account dashboard.


  2. Select a multi-stream dashboard with 3 column layout.

    3 column layout

  3. For this example, I’ve also added 2 new fields on accounts:

    a. Open Priority Cases – A rollup field to update the number of open cases with a priority of Critical or High at any given time.
    b. Last Contacted Date – A date field updated via workflow or plugin when new activities created for the account.

  4. Next I created 3 new account charts:

    a. Priority Cases by Account
    b. Account Last Contacted Date
    c. Accounts by Priority

    3 charts

  5. Finally, added 4 data streams to the dashboard:

    a. My Active Accounts which will actively filter based on what the I select on the charts above.
    b. Open Priority Cases to view and drill into the case details.
    c. My Active Contacts to view individuals I can reach out to at these accounts.
    d. My Appointments to view which appointments I have scheduled and plan my meetings based on priority.

    4 data streams

  6. Once these are completed, I can publish all customizations and begin using the dashboard.

    Full Dashboard

Now any account manager can log in to view the accounts they own and interact with the data in CRM.  For example, I can click on the 1 priority case for A. Datum, see that I’ve just contacted them last week, then decide on the appropriate time to follow up with the customer:

A. Datum

Similarly I can drill into my top accounts and the other charts will filter based on my selection so I can take action on the data presented to me. 

A few limitations to note, the dashboards are limited to the standard entities posted here, along with custom entities.  Hopefully in the future additional standard entities such as opportunities will be included to further extend this interactive experience. Additionally, these dashboards need to be accessed via the interactive service hub, so it would be nice to see them extended to the core CRM areas in the future. In the meantime, happy interacting with CRM!

Topics: Microsoft Dynamics CRM

Where are my Voice of the Customer Survey Responses?

I previously wrote a post about the basics of the new Dynamics CRM 2016 Voice of the Customer feature (also known as surveys for the common ear).

However, in my testing I’ve seen instances where my Survey Responses weren’t being created in Dynamics CRM. Remember, this feature is using Azure Web Services so that the Survey and Response Data are synchronized between Dynamics CRM and Azure to take the heavy survey workload off of your transactional Dynamics CRM database.  Therefore a delay in responses getting created is expected, but not a delay of hours or days like I had seen.

In order to see if your VoC jobs are running correctly, go to to Settings –> System –> System Jobs.  Perform a quick search for v* to pull back jobs that begin with the letter v.   What I saw were that there didn’t appear to be a system job running for the past month.

If you do come across this scenario, below are a few things you can do to get your Survey Responses to appear in CRM.


Retrigger Response Processing from the Solution

The simplest fix is to navigate to the Voice of the Customer Solution (Settings –> Customization –> Solutions –> VoiceOfTheCustomer).  From the Configuration Page, you should see a link to “Retrigger response processing if responses are not received within 15 minutes of being completed” – click that and you should initiate a pull from Azure to pull this data back into Dynamics CRM.


Look at the System Jobs

Another thing you can do is open up your most recent Voice of the Customer System Jobs to see why they stopped.  In my example below it appeared as if a record in the system that was needed for the workflow was deleted.  In this example the check statement is checking the Voice of the Customer Configuration record so it appears as if that record may have been deleted at some point which caused the workflow to fail and stop processing.  This leads me to the next resolution step.


Delete and Recreate the Configuration Record

The Voice of the Customer Configuration record may have been deleted / manually recreated.  However, the only supported way for the Voice of the Customer solution to successfully process and return survey results to Dynamics CRM is to have the configuration record created from the Voice of the Customer Solution. 

Therefore if you have a Configuration record currently (which may had been manually created by someone), you need to first off delete this Configuration record. 

Note:  Before you do so, make note that when you delete this record and recreate it, you’ll need to recreate your surveys as the existing surveys will no longer work.  They’ll work in a sense that users will be able to hit them and fill them out, but results will no longer ever be returned to them.  This probably isn’t a big deal because the reason you’re going through this troubleshooting is because the records weren’t being returned in the first place.

Navigate to the solution in Settings –> Solutions –> Voice of the Customer.  On the Configuration tab of the solution, go through the same process you did when you initially setup Voice of the Customer which is check off the agreement to the terms and conditions, and then click on Enable Voice of the Customer. 


If you navigate to System Jobs once again, and filter on those that start with v*, you should see the workflows running successfully periodically and your survey responses should start to flow in for your new survey.  Remember, your old survey and workflows you created with the old survey email snippet will need to be recreated so new survey responses can start to be processed.


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

Turbo Forms: The Time is Nigh

Today's post is written by Mike Dearing, Development Principal at Sonoma Partners.

Released with CRM 2015 Online Update 1, and CRM 2016 on-prem, Turbo Forms was introduced to significantly increase form load times

And with the recent announcement that the legacy form rendering option will be deprecated, our clients that had yet to take the plunge have begun to express concern.  While it is true that for more heavily customized environments the switch to Turbo Forms can be quite intimidating, hopefully some of the issues that I recently faced will help you on your journey.

Accessing a Form’s Xrm Context From Within an Iframe

Prior to turbo forms, web resources could reliably access their host form's Xrm context by calling parent.Xrm.  However, with Turbo Forms enabled we have found that setting the parent’s Xrm context onto an exposed variable within the resource works well as an alternative.  The parent form can supportedly retrieve the context of the iframe and attach an on load event to it.  The on load event can then be used to reference the parent’s Xrm context, as per the following:

Asynchronous Script Loading

It has always been best practice to ensure that scripts dependent on one another are fully loaded before invoking each other.  The new script engine enforces this as well.  The easiest way to safeguard from falling victim to race conditions is to refrain from calling into separate scripts immediately upon load of a script.  Instead, defer these calls to an on load event handler through the form's properties.  The script engine will load all scripts before calling your load handlers, ensuring that you won’t end up calling a script that hasn’t fully loaded yet.

GetFormType() Returning the Wrong Form Type

One bug that we noticed during our upgrade is that turbo form's implementation of Xrm.Page.ui.getFormType() method doesn't return the proper type for a disabled form, despite showing the correct form type in the footer.  Instead, it will return a form type of 'update'.  This bug is still present as of 2016 SP1/Update 1.  Our workaround for the time being is to do an organization service call to get the access rights of the current user to determine if the form is disabled or not.  This is unfortunately much more inefficient with the overhead of the service call, but is edge case enough that hopefully it won't affect too many implementations.  Microsoft support stated that a fix has been slated for 2016’s fall release (tentatively Update 2).

Thinking of making the switch soon?  You don’t have to upgrade alone… we’re here to help!

Topics: Microsoft Dynamics CRM Microsoft Dynamics CRM 2015 Microsoft Dynamics CRM 2016

Get ready, Dynamics is about to get “Linked” in

Today's post is written by Aaron Robinson, an Engagement Manager at Sonoma Partners.

It’s true. Microsoft dropped a cool $26.2B to purchase LinkedIn.

Unless you have been on vacation for the last month in Vinh Hy Bay or just living in a cave, you probably already know this. At Sonoma Partners, this has been quite the buzz, filled with hope and speculation for what this means to the CRM world. It’s also personally interesting because the LinkedIn corporate offices sit in the floors directly underneath us in our Chicago office, giving us a unique perspective to their corporate culture.

These days there are a lot of things to get excited about in the world of CRM. Both Microsoft and Salesforce are continually adding to their product stack through their own product development cycles. Salesforce just launched their Spring ’16 release with enhancements to the Lightning Experience, Mobile Apps, Chatter, Analytics and more.  Microsoft’s Dynamics CRM 2016 Spring Wave for online customers added Learning Path, enhanced Office 365 group collaboration, multi-entity search, a new field service module, and the first release of CRM Online Portals.

In addition to development of their stacks, both companies are always on the hunt for best of breed solutions to add to their product arsenal. Salesforce most recently acquired several companies such as SteelBrick for quote-to-cash functionality, Implisit for predictive analytics, and Demandware for enterprise cloud commerce. Microsoft has also been on the buying spree with targets such as FieldOne for field service functionality and ADXstudio for portals.  Frankly, I think all of this pales in comparison to the LinkedIn acquisition. 

Why LinkedIn?

Do you have a LinkedIn account?  Do you have many colleagues that have LinkedIn accounts? Have you benefited in some way from having access to the largest self-updated business database in the world?  I’m sure you answered yes to at least one of these questions, if not all three.  Don’t worry, you’re in a small group of 433 million people who also subscribe to the site.

I think the most compelling part of LinkedIn is the self-updating component. I, like many users regularly update the content associated with my account – both on my own and from the occasional prod from LinkedIn to do so. LinkedIn provides other value for its member base. It updates my profile for me and notifies my network about content that I’m producing, such as this blog post. Additionally, it is pretty much the defacto tool used by recruiters (judging based on our use at Sonoma and the number of out reaches I receive each week). Their communication platform generates significant content and membership views.  With such significant value as a stand-alone app, there are many possibilities for use in CRM.

Linking In CRM

Many organizations we work with have inquired, requested, and sometime even demanded LinkedIn integration to their CRM system. In most recent years (2014 on), LinkedIn closed access to their API to all outside parties except Salesforce and Microsoft. LinkedIn currently supports integration with both platforms through the use of their Sales Navigator app, however many of our clients have complained about the price of the solution (top-level team edition) on top of their CRM platform cost. 

With this acquisition, the Dynamics CRM product team has to be salivating over the potential use cases of LinkedIn data in CRM.  This could take the form of the current integration Dynamics online customers have with the InsideView add-on, which is available for no cost to those subscribers.  This add-on enables the use and sync of InsideView data into CRM.  With a similar approach to methodology and pricing, Dynamics CRM could have the same capability with contact data, which is more relevant and available in real time, than the data sourced from InsideView.  As my colleague Bryson Engelen pointed out in his post, having accurate contact information and understanding the relationships between them is extremely important, especially as individuals in your network change companies and/or roles. It will be interesting to see if Microsoft even continues the relationship with InsideView, but don’t expect it to go anywhere in the immediate future. Of course we at Sonoma would like to see this applied to Salesforce as well in the interest of fairness to our customers, but I can appreciate that Microsoft may play this close to the vest as a competitive advantage. After all, I think I can say with a pretty good degree of certainly, had Salesforce been the buyer, they wouldn’t be in a sharing mood either.

The Future

It is going to be very exciting to see what comes of this acquisition, although don’t expect to see major headline shifts in the next 4-6 months. As we have seen with other Microsoft deals, it takes closer to 12-18 months for things to shake out a bit and a strategic direction and product roadmap to be determined. But with possibilities such as native contact enrichment and sync and deep relationship mapping, I can’t wait to see CRM linked in!

Topics: Microsoft Dynamics CRM

Microsoft Text Analysis and CRM–Tracking Client Sentiment

Microsoft has released a set of intelligence APIs known as Cognitive Services which cover a wide range of categories such as vision, speech, language, knowledge and search.  The APIs can analyze images, detect emotions, spell check and even translate text, recommend products and more.  In this post I will cover how the Text Analysis API can be used to determine the sentiment of your client based on the emails they send.

The idea is that any time a client (Contact in this case) sends an email that is tracked in CRM, then we will pass it to the Text Analysis API to see if the sentiment is positive or negative.  In order to do this, we will want to register a plugin on create of email.  We will make the plugin asynchronous since we’re using a third party API and do not want to slow down the performance of the email creation if the API is executing slowly.  We will also make the plugin generic and utilize the secure or unsecure configuration when registering the plugin to pass in the API Key as well as the schema name of the sentiment field that will be used.

Below is the constructor of the plugin to take in either a secure or unsecure configuration expecting the format of “<API_KEY>|<SENTIMENT_FIELD>”.

Next is the Execute method of the Plugin which will retrieve the email description from the email record and pass it to the AnalyzeText method.  The AnalyzeText method will return the sentiment value which we will then use the populate the sentiment field on the email record.

Then we have the AnalyzeText method which will pass the email body to the Text Analysis API which then returns the sentiment value.

And finally the classes used as input and output parameters for the Text Analysis API.

Now register the plugin on post-Create of Email with the Text Analysis API Key and the schema name of the sentiment field either in the secure or unsecure configuration


Now when an email is created in CRM, once the asynchronous job is complete, the email record will have a Sentiment value set from a range of 0 (negative) to 1 (positive).


The sentiment field on the email record can then be used as a calculated field on the contact to average the sentiment values of all the email records where the contact is the sender to track the sentiment of your clients based on the emails they send you.

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