Sonoma Partners Microsoft CRM and Salesforce Blog

An Introduction to Change Management and CRM

Definitions for change management in relationship to CRM vary widely from person to person. Every vendor has a different explanation of what change management is, and each client has a different expectation of what change management can do for them.

First things first. Sonoma Partners defines change management as the moving of processes, teams, and organizations to an alternative state. It’s a shake-up of your company’s current structure and way of doing things. It impacts many aspects of your organization including training, user adoption, and incentives for better employee performance. When done properly it can yield great results and improve your team’s organizational knowledge.

At Sonoma Partners, the term "change management" best describes the state of an organization before and after they have adopted a CRM.

A common (and dangerous) approach to change management is implementing a plan after the CRM system development comes to an end. This method may not give you the results, or user adoption rates, that you are hoping for. Disrupting the way your employees are used to working without their feedback or input up front may lead to you building a system that no-one will use.

A better approach to change management and CRM is to incorporate it into the conversation from the beginning of the project. Remember: if you’re giving real value to your end user, you are less likely to have issues with change management, because people will be motivated to use the new system.


Here are a few tips to help you build your change management plan:

1. Identify

Who in your organization is going to be affected? Outline and define value propositions for each party to motivate them to use the system after it’s built.

2. Engage

Engage all parties involved from the beginning. This includes executives, stakeholders, end users, and management.

3. Educate

Communicate how the new system works in relation to how each team member will use it. Create a communication plan that outlines the benefits, functionality and status of the project.

4. Incent
Formulate an answer to the following question: “What’s in it for us?” Your CRM project lives and dies by user adoption rates. Develop an incentive plan to encourage system use.

Change management is a lot like user adoption. It’s a term that is defined differently by every person implementing it, and every party looking for it. The best way to guarantee a successful rollout of change management is to build a CRM system for your end users that best suits their needs from the start.


Topics: CRM Best Practices

XRM Tooling – Web Resource Utility

A couple weeks ago I posted a video on the new Login Control that comes with the XRM Tooling library in the latest CRM 2013 SDK.  Today I will show off another handy feature in the XRM Tooling library, the Web Resource Utility.  The Web Resource Utility provides an easy way to retrieve an Image or XML web resource. 

First you will need to download the latest SDK here.  Then you can add the following namespaces:

using Microsoft.Xrm.Tooling.Connector;
using Microsoft.Xrm.Tooling.WebResourceUtility;


Next you can either use the new Login control to get an instance of a CrmServiceClient or manually set it up yourself.

var crmSvc = new CrmServiceClient(

Then use the following code to retrieve an XML resource which will return a string of the XML content:

var xmlResources = new XmlResources(crmSvc);

Or use the following code to retrieve an Image resource which will return a BitmapImage object:

var resources = new ImageResources(crmSvc);
var bitmap = resources.GetImageFromCRMWebResource("myimageresource.png");


Now with the BitmapImage object, you could set an Image control directly within your WPF app and dynamically display images based off your web resources in CRM.

Topics: Microsoft Dynamics CRM 2013 Microsoft Dynamics CRM Online

The Salesforce1 problem

Recently I was working on a Salesforce1 mobile page and I ran in to an issue when attempting to use the API call. The code I started with was (condensed for brevity):

The idea here was to show the create record screen so that users could create a new Account when they clicked a button. 


This worked fine on a desktop, but the createRecord call was a bit slow over cellular networks (on the order of 5 – 6 seconds to load sometimes). During this loading time, it looked like the page wasn’t doing anything so the users would click the button that fired this code multiple times, resulting in multiple new forms being shown. To prevent that, we added a loading layover that shows the first time the button is clicked, preventing the user from clicking it again. 


So far this all worked fine, until we started really testing the create form. One of the things a user can do on the create form is click a cancel button which takes them to the previous form, where we got a nasty surprise: the loading screen is still there!

After some investigating, I found that the new Account form isn’t actually a new page, but is instead a layover on the current page, and the cancel button is just hiding the layover. Therefore, the custom page the user came from never gets reloaded.

We tried the onload event (which is only called when the page is loaded, not when cancel is clicked) and the onfocus event (which is only called if the user taps the screen again after clicking cancel). Neither were sufficient for us.

At this point, I opened a support case with Salesforce where they confirmed this is by design, and there is not a fix forthcoming.

We decided to take advantage of the fact that this is a layover and put in a timeout for the loading screen so the user isn’t permanently trapped. We added an idea to the Salesforce idea boards that you can upvote here if you think this is important to fix like we do.

Topics: Salesforce

EventWhoRelation – A gotcha

I recently had a requirement on one of my projects to build a Visualforce page that summarized an event, including all of the attendees of the event. After doing some digging through the documentation, I found the EventRelation and EventWhoRelation standard objects provided by Salesforce. Reading through them, it sounded like the EventWhoRelation object best suited my needs, so I wrote the appropriate controller code to retrieve the attendees as follows:

This all worked fine, and when I tested the code through the UI I got back the results I was expecting. After I was satisfied with how it worked, I turned my attention to the unit tests to finish up. I started with the following code:

When I ran the unit tests, I saw the following logs:

Looking at the last line, there’s no Event Who Relations! Double checking the unit tests, I wasn’t running it as a particular user so I shouldn’t be getting any profile-related issues, and Shared Activities was enabled (otherwise EventWhoRelation wouldn’t be available at all), and I was using the latest API version available to the organization (31 as of this writing). The documentation says that EventWhoRelation is a filtered view of EventRelation, so I would expect that a record meeting the criteria listed (IsParent = true, IsWhat = false) to show up in the EventWhoRelation table.

I opened a support case with Salesforce to see what was going on here. After doing some digging on their end, they confirmed that the EventWhoRelation records are not created in test cases unless you add the @isTest(SeeAllData=true) attribute. Their explanation: since the EventWhoRelation is a derived table, we need to be able to see all data in the org to read from it (otherwise it’s just always empty).

We don’t typically condone using the SeeAllData setting unless absolutely necessary as it makes the tests more brittle and harder to maintain. The workaround I came up with is to not use the EventWhoRelation and instead use the EventRelation in my controller:

Topics: Salesforce

XRM Tooling – New Login Control

With the latest CRM 2013 SDK, Microsoft has provided a new XRM Tooling library to connect to CRM.  Along with the new Tooling library comes a brand new Login control that is styled with the 2013 look and feel and can be used for custom WPF apps. 

In our new video below, I demonstrate how to easily setup the new Login control so you can be on your way with your custom CRM WPF app.



Topics: Microsoft Dynamics CRM 2013 Microsoft Dynamics CRM Online

The Seven Use Cases Your Mobile CRM Sales Application Must Nail

We’re now at the point where enterprise mobility should be built into your CRM platform from the beginning of a project. You know that your sales team needs to be able to access their accounts and data on the go.

But how can you guarantee your users will have what they need when they need it? Build an app that nails these seven use cases to ensure that your sales team can and will use your mobile CRM application.

#1. Availability
Don’t assume you are always connected to a network. The terrain that your sales team can cover varies and your app needs to be available every step of the way, regardless of possible nearby wifi networks or cellular connection signal strength. If your app doesn’t have the ability to record notes and orders offline and then immediately sync up when a connection is established, your sales team won’t use it in fear of losing valuable data.

#2. Brand Standards
When your sales team is meeting with prospects and customers they should be able to use their CRM app as a sales tool and collaborate directly with them. This includes being able to display specific product information, conduct a product demo and access relevant marketing collateral on the fly. Because your clients viewing your app with your sales team, your mobile CRM app needs to absolutely reflect your organization’s look and feel and reinforce brand standards.

#3. Digital Sales
Your team needs to be able to do more than pull up existing accounts in the field, they need to be able to create new ones! Your app must allow users to display and present sales collateral during client meetings. Most importantly you need to be able to pull up pertinent information relevant to a specific sale to get a holistic view of the account. Being able to check if merchandise is in stock or an updated version of an item is available could positively (or negatively!) impact the direction of a meeting.

#4. Location-Based Activity
Sonoma-phone-tabletAs your team travels throughout the day they need to be able to see the accounts and prospects in the area. Incorporating geo-coding into your mobile CRM app can help your team maximize their time in the field. If a meeting is cancelled or postponed, being able to identify prospects geographically could translate to a new opportunity.

#5. Activity Management
Not only should your team be able to monitor clients and sales opportunities but they need to be able to manage their schedules. Build a mobile CRM app that allows users to track and manage their day including appointments, tasks, and to-do lists. Make this process as touch friendly and as simple as possible. Creating a tool that provides value and simplicity back to the sales team increases the likelihood of user adoption.

#6. Account Management
It’s important that your users are actually able to manage opportunities in the field.
Accessing sales materials and product information is essential to making the sale but taking notes, updating contact information, and adding reminders for future meetings can be just as important. Building a mobile app that allows your sales team to manage an account at all stages while in the sales process guarantees that the highest quality of data will make it into your CRM.

#7. Build an App that Minimizes Training
If you deploy an app that isn’t intuitive or user-friendly, we guarantee that your adoption rate will suffer. Remember that having to use your CRM isn’t enough of a motivation for your users, they have to need or want to use it. Engaging in a user discovery process and investing in thoughtful user experience increases the likelihood that your mobile CRM app will satisfy the needs and wants of your users.



Topics: Enterprise Mobility

How to: Setting up Unified Service Desk

Earlier this year, we posted an overview of Unified Service Desk based on a Convergence session.  Now that the Spring ‘14 update has been released, get can get our hands on USD ourselves.

Note: This walkthrough is only meant for a development environment and should not be used for production.

First, head here to download the USD package.  This contains a CRM2013-USD-PackageDeployer.exe and a UnifiedServiceDesk.msi.  Run the msi which will install the actual USD desktop client onto your machine. 

Next step is to run the CRM2013-USD-PackageDeployer.exe which will extract files to a specified folder.  Navigate to the extracted folder and it should contain a PackageDeployer.exe.  This is the new Package Deployer tool that we blogged about last week but it will already contain packages specific to USD.  This tool will deploy solutions and import data to your organization so it is highly recommended to be done in a development environment.         

Run the PackageDeployer.exe and you’ll come to a login screen.  Enter credentials for the organization that you would like to install USD to and click Login. 


Next you will get a list of package options to use.  Select the package you would like to use and click next.


Clicking Next will move onto the next page that displays a detailed description of the package you are about to import into your organization.


Click Next to verify the organization you are installing to and then Next again and the tool will validate the solutions and import files that it is about to install.


Clicking Next again will start the import process and display a report of the status.  If there are any errors, you can click the link at the bottom left to view the log file.


Clicking Next will display the completion page.  Then click finish and you’re done with the installation process!


Now you can open the Unified Service Desk client that you installed in the first step.  A login screen very similar to the Package Deployer tool will display.  Enter your credentials to the organization that you installed USD to.



Now you can play around with USD in your organization and get a feel for what is possible.  If you are interested in extending USD, head to MSDN where there is a great set of walkthroughs on adding custom modules, layouts, iframes, etc.

Topics: Microsoft Dynamics CRM 2011 Microsoft Dynamics CRM 2013

CRM Online Service Update 3 Rollout

CRM Online Service Update 3 is being rolled out this week.  To find out if your organization has been updated, click the gear in the top right corner and click About to check the build number.  The build number for this update is

This update resolves a handful of issues both performance and usability related.  Here are some of the most notable fixes:

  • Duplicate records created if Save and Save and Close is pressed multiple times
  • Unhandled exceptions in asynchronous plugin instantiation causes Async service to crash
  • Option set not selected on first click
  • SQL deadlock and performance issues after Spring Release ‘14 update was applied
  • Multiple navigation and command bars show up via associated grid navigation

It is nice to see a steady release of fixes from Microsoft.  Especially with a focus of frustrating usability issues and performance optimization.  For a full list of fixes, check the KB article which can be found here.

Topics: Microsoft Dynamics CRM Online

Salesforce1 Mobile – Object-Specific Actions

In part 1 (Branding your mobile application) of this series we talked about how to brand the Salesforce1 mobile application to fit your company’s standards. In part 2 (Becoming mobile ready) we met Bob the sailorman salesman and customized the Salesforce organization to make it more mobile friendly. And in part 3 (Global Publisher Actions) we took a look at one of the ways you can add custom functionality to your Salesforce1 mobile deployment – by implementing Global Publisher Actions. In this 4th and final part of the series, we will take a look at one more way to add custom functionality to your Salesforce1 mobile deployment – Object-Specific Actions.

Object-Specific vs Global publisher actions

The main difference between Object-Specific and Global publisher actions is that Object-Specific publisher actions are context aware. They are invoked from a specific record using the publisher icon in the lower right corner of the SF1 mobile app (as opposed to the left hand navigation) and the code to make them work knows which record the user was on when they started the action.


This gives Object-Specific actions the ability to act upon the data contained in the record to perform various actions such as mapping the current Account using a maps application.

Bob’s Business

Bob is pretty happy with his mobile experience and has been adding Accounts to his VIP list which we built in the last part of this series, but the business is not as pleased. They’ve noticed that Bob has begun adding all of his Accounts to the VIP list, and would like to change the business requirements to have Bob also enter in a justification when he adds an Account to the VIP list. To enable this, we will build an Object-Specific publisher action for Accounts that Bob can use to promote them to his VIP list and enter the justification the business needs.

To do this, we will:

  1. Remove the VIP checkbox from the form
  2. Create a new custom field called ‘VIP Justification’ that will store Bob’s input. This will just be a long text field for now.
  3. Create and configure the Object-Specific action so that Bob can invoke it from an Account record.
    1. The action will take Bob to a new page which has the justification input field.
    2. When the page is submitted, the field is saved and the record’s VIP checkbox will be checked.

Step 1 – The customizations

At this point, these customizations should be old hat so I’ll just briefly go through what I did.

I created the new VIP Justification field on the Account object:


I created a workflow that sets the VIP checkbox to true whenever the Account is updated to have text in the VIP Justification text area:



And I updated the form to remove the VIP checkbox from it:


Step 2 – The Justification Page

Next, we need to create the page that will allow Bob to input his justification. Because we just need to display the text box for Bob to be able to input the text, we will use one of Salesforce’s native action types to display a form. We could, however, also write and deploy a custom Visualforce page like we did in the previous post to have more control over the look, feel and exact mechanics of the page.

For now, navigate to Setup > Customize > Accounts > Buttons, Link, and Actions and click New Action:


On the following page, enter in the following values:


The Update a Record type is what will allow us to create a form to present to Bob so that he can enter in his justification. Once he clicks save, the workflow we set up earlier will automatically check the VIP box – no code required!

Once you click Save, the next screen will be the form we want to present to Bob. Edit it so that it only contains the following fields:


Notice how we have to keep the Name field because it’s a required field. For our purposes, this is fine, but if we really didn’t want to display it we could write a custom Visualforce page that would track it in the background and only display the justification text box.

Before we save this, we need to make the Justification field required (no point in going to this page if you’re not going to enter anything…). To do this, hover over the VIP Justification field on the form so that the wrench icon appears, then click it. Next, click the Required checkbox and OK.




Once that is done, click Save.

Step 3 – Giving Bob access to the action.

The last thing we need to do is give Bob access to use the new action we just built. To do this, we need to edit his layout (the Standard User Layout) and add the action to it.


On the resulting page, click Actions in the header and drag the new Action we just created to the Publisher Actions section on the form. Click Save.


Step 4 – Testing it out

Now that we’ve given Bob access to the action, he should be able to start using it! Looking at Bob’s mobile device, we can see:



It’s our new action! If Bob clicks on it:


Bob is presented with the justification page we built. He can enter in a justification and click ‘Submit’ to add the Account to his VIP list.

Wrap Up

This concludes our series on Salesforce1 Mobile. If you enjoyed it or found it useful, please let us know in the comments below!

Do you need help with your Salesforce deployment? Thinking about going mobile but aren’t sure what the best way to start is? Contact us! Our team of Salesforce and mobile professionals can help you from planning through deployment and post go-live support.

Topics: Salesforce

CRM 2013 Spring ‘14 Package Deployer Tool

The Package Deployer is a new tool that was released with the CRM Spring ‘14 update and provides administrators with an easier way to deploy to CRM organizations.  The Package Deployer can deploy one or more CRM solution files as well as import data and can even be extended to execute custom code to handle any edge cases while deploying to your CRM org.

Sounds great, so how do we get started?  Well first, you will need to have Visual Studio (2012 or 2013) installed, which we be used to create a package.  Next, download the latest SDK that was released with the Spring ‘14 update which can be found here.  After the SDK is installed, browse to SDK\Templates folder and run the CRMSDKTemplates.vsix to install the necessary Visual Studio Templates.

Now that we have everything setup, we can start to build our deploy package.

  • Open Visual Studio
  • Go to File –> New –> Project
  • Select CRM SDK Templates on the left
  • Select CRM Package Deployment Template and click OK


This will create a structure in the Solution Explorer like shown below:


The PkgFolder is where you put any CRM Solution files that you would like to be deployed as well as any import data files. 

In my example I have a solution “MySolution1” and “MySolution2” as well as a contacts.csv data import file.


Now you can open the ImportConfig.xml and update it with your package files.  At the top of the config file you can also set if you want to install the out-of-the-box sample data as well as if you want to wait for the sample data to install before deploying your package.  There are two agent desktop settings as well that can be used when deploying Unified Service Desk.

In my example I have the package deploying sample data as well as waiting for it to finish before deploying the package.

<configdatastorage xmlns:xsi="" xmlns:xsd=""

In the solutions node you can define each of your solutions that should be deployed.

    <configsolutionfile solutionpackagefilename="" />
    <configsolutionfile solutionpackagefilename="" />

Lastly, you can define any data import files to be imported with the deploy.

    <configimportfile filename="contacts.csv" filetype="CSV" associatedmap="" importtoentity="contact" 
                      datadelimiter="" fielddelimiter="comma" enableduplicatedetection="true" isfirstrowheader="true"  
                      isrecordownerateam="false" owneruser="" waitforimporttocomplete="true"/>

That’s it for the ImportConfig.xml.  Here is my full config for reference.

<?xml version="1.0" encoding="utf-16"?>
<configdatastorage xmlns:xsi="" xmlns:xsd=""
    <configsolutionfile solutionpackagefilename="" />
    <configsolutionfile solutionpackagefilename="" />
    <configimportfile filename="contacts.csv" filetype="CSV" associatedmap="" importtoentity="contact" 
                      datadelimiter="" fielddelimiter="comma" enableduplicatedetection="true" isfirstrowheader="true"  
                      isrecordownerateam="false" owneruser="" waitforimporttocomplete="true"/>


One last thing to note is that the PkgFolder contains a Content folder with a WelcomeHtml and EndHtml folder.  Within each of those folders are a Default.htm page.  These pages can be customized to your needs to provide a unique welcome and end page during the deploy process.


Now you can build the solution in Visual Studio (Build –> Build Solution) which will create a dll that we will use for the Package Deployer Tool.  Go to the bin\Debug folder, copy the PkgFolder as well as the dll named the same as your Visual Studio project and paste them into SDK\Tools\PackageDeployer.

Run the PackageDeployer.exe and a login screen will appear.


Select your organization and login.  The next screen will display an iframe showing the content from the WelcomeHtml folder.  As mentioned before, you can customize and brand the html page to suit your needs.

Click Next and you’ll see a screen that lists out the solutions and any files you have included to import.


Click Next again and the Package Deployer will attempt to import the included solutions and files.  Once it is finished, it will give you a status on what succeeded or failed.  You will also see another screen showing the content from the EndHtml folder which can be branded and customized as well just like the Welcome screen.

As you can see, the Package Deployer tool is a great asset for administrators and customizers.  It is now easy to make your own branded installation wizard that covers most aspects of the deploy process so you can handle it in one fell swoop. 

Topics: Microsoft Dynamics CRM 2013 Microsoft Dynamics CRM Online