Sonoma Partners Microsoft CRM and Salesforce.com Blog

Chatter to Yammer Migration? You can do it, we can help!

Today’s guest blogger is Ross Talbot, a Development Principal at Sonoma Partners

 ChatterToYammer

While both Microsoft Dynamics CRM and Salesforce.com are both top-ranked CRM applications…sometimes customers migrate from one tool to the other. The reasons to migrate vary by customer, but pretty much all of them say something like “Hey it’s not you, it’s me”.

As part of some recent Microsoft Dynamics CRM deployments for Sonoma Partners customers, we also migrated the customer’s Chatter data to Microsoft’s Yammer app. While The customer obviously wanted to save their years of Chatter history and posts, and they didn’t want to start with a blank Yammer app. Since Yammer and Chatter offer very similar capabilities and use comparable data models, the customer asked if we could help migrate all of their Chatter data to Yammer?

At first blush, this might seem like a pretty straight-forward request. Both Chatter and Yammer have API’s…we should be able to migrate the historical Chatter data to Yammer pretty easily right? Unfortunately there are some constraints in the Yammer API that increased the level of difficulty. Having completed multiple Chatter to Yammer migrations, we have learned a lot of tips and tricks to make this process go more smoothly each time. Let’s consider some high level information about our most recent Chatter to Yammer migration:

  • Large enterprise customer – 5,000+ users
  • More than 3 years of Chatter data including:
    • 175,000+ posts
    • 300,000+ comments
    • 125+ GB of files/documents

Getting the data out of Chatter was no problem using their API, and we were able to migrate the following types of data into Yammer using their API:

  • Posts and comments (along with user impersonation so that it preserved which users previously made the comments)
  • Files (including both Chatter Files and Salesforce Content)
  • Images (interesting to note that Yammer supports up to 25 images per post, while Chatter only supports one image per post…the customer liked that)
  • Private messages (being very careful to respect the security model so that the private Chatter messages stayed private in Yammer!)
  • Topics and hashtags (like #chatterMigration)
  • User profile information, including manager info
  • @ mentions of users in posts
  • Groups
  • Deep CRM linking (linking Yammer posts to the appropriate CRM case, account, contact, opportunity, etc.). Maintaining this deep CRM linking proved key to the customer because more than 90% of their old Chatter posts were directly linked to CRM records.
  • Likes – the customer didn’t ask us to do this in the end, but this was supported if someone wanted it in the future

With that said, there were a few areas that we had to “get creative” on importing the data into Yammer. These areas included:

  • There is no supported way in the Yammer API to import group memberships (which users belong to which groups). We can’t reveal our secret sauce here, but the hint is Fiddler trace. :)
  • The Yammer API throttles imports to 10 posts per user every 30 seconds. With 175,000 posts and 300,000 comments for 5,000 users…we had to leverage multi-threading to get the data import done in a reasonable amount of time.
  • There’s no such thing as Yammer sandboxes, so during UAT and production migration we had to employ a bunch of tricks to prevent 500,000 @mention notification emails going out to users! We also developed some scripts and utilities to bulk delete the Yammer test records from the org (we needed the Yammer org empty for the final import!). Again not all of delete actions we needed were not supported in the Yammer API so we developed our own processes.
  • Sadly, there was no supported way (and no creative workaround that we found) to maintain the original Chatter post date in Yammer. So all of the imported posts have the same posted on date and we simply appended an “Originally posted on xx/xx/xxxx” line into the Yammer post so that users knew how old the original post was.

Generally speaking Sonoma Partners avoids unsupported techniques at all costs, but we tested these scenarios very thoroughly and received approval from the customer to move forward knowing some of these areas were unsupported. Since these were just one-time unsupported techniques for the data migration (versus being used ongoing in production), everyone felt the reward was worth the risk.

In summary, if you’re looking to migrate from Chatter to Yammer… and you’re bumping into some of these issues please give us a ring, we can help you out! We have the kinks worked out, the data mapping documents done, and the migration scripts pre-built.

(Likewise if you want to go from Yammer to Chatter, we bet we can help you out there too)

Topics: Microsoft Dynamics CRM Salesforce.com

Deploy Dynamics CRM with PowerShell Part 3: Auditing

Today's post is written by Ian Moore, a developer at Sonoma Partners.

Making sure that auditing is enabled and configured correctly is usually a critical step when setting up a new Dynamics CRM organization, especially a production instance. Everything related to auditing can easily be added to a deployment or setup script with a couple extra lines of PowerShell code.

The first step in configuring auditing for your organization is to make sure it is enabled at the system level. If it is not enabled here, no auditing will ever occur. Here is a simple code snippet to test if your CRM organization has auditing enabled, and to enable it if it does not:

From there, you will need to ensure that auditing is enabled at the entity level for all data where you want to track changes. If you’re not sure which entities have been configured to audit, you can actually use PowerShell to generate a simple report of your current entity audit settings:

clip_image001

Once you know which entities still need to have auditing enabled, you can use metadata updates to configure each entity. The following snippet would enable auditing for accounts:

As with any metadata changes, you will need to make sure to publish changes for the entity. The easiest way from your PowerShell script would be to use the Publish-CrmAllCustomization function. If you are only updating a handful of entities, you could also create a PublishXmlRequest similar to the UpdateEntityRequest above rather than publishing all changes.

Hopefully these snippets help eliminate necessary manual steps when configuring auditing in your CRM environment.

Make sure to download the Microsoft.Xrm.Data.PowerShell module from GitHub at https://github.com/seanmcne/Microsoft.Xrm.Data.PowerShell and follow https://blogs.msdn.microsoft.com/crminthefield/ for updates to the module!

Topics: Microsoft Dynamics CRM Microsoft Dynamics CRM Online

Utilizing the Audit History for Fun and Profit

Today's post is written by Rob Montague, a developer at Sonoma Partners.

I was working on a project for a customer that wanted to send an email to all of the previous owners of a case when a case is resolved.  We had auditing enabled, and everything looked like it should be some simple fetch queries, but it wasn’t quite so simple.  Here were the catches.

Even though you have auditing turned on for a field, be sure to check to make sure that the auditing is enabled for the entity type you are using (especially if it’s native) 

  1. Settings -> System -> Auditing -> Global Audit Settings -> Start Auditing
  2. Make sure the entity types that you are using are enabled. In Global Audit Settings, under Enable Auditing in the Following Areas I had to enable Customer Service Entities to enable auditing on Case.
  3. Make sure you test to make sure your user will have access to the audit history field that you are accessing
  4. If you have an administrator that clears out audit logs OR you have an automated process to do so, you could possibly lose some historical data in the audit trail.

You can’t query the audit history directly, you must make an API call. I had tried fetching against the audit history table and the API would deny the request.  This is the call I had to make:

1

The call will get all of the field changes to the target field (in this case, ownerid) that have been done to the record (in this case incident which is the system name for the Case entity).

The audit detail records will have two properties Old Value and New Value. I then created a dictionary of owners so that I wouldn’t have duplicates when I was sending the emails out and went through the audit collection. With this approach you could notify salespeople that have modified a record when a contact buys a product, or when their contract is about to expire.



 

Topics: Microsoft Dynamics CRM

Deploy Dynamics CRM with PowerShell Part 2: Importing SLAs

Today's post is written by Ian Moore, a Developer at Sonoma Partners.

If your Dynamics CRM deployment includes Service Level Agreements, you have probably encountered the following error in the import log when importing solutions from a dev environment to a testing environment:

“You can't edit an active SLA. Deactivate the SLA, and then try editing it.”

clip_image002

This error occurs because your solution contains an SLA that is active in the current environment. Having an SLA in your solution can complicate imports if you forget to deactivate the SLA before starting, as the error will come at the end of the import process and you will have to start over. Thankfully we can use PowerShell to automatically deactivate any active SLAs and re-activate after importing an updated solution.

For this example we will use a simple solution that contains one SLA component, and try importing it into an organization that already has an active previous version of the SLA.

clip_image004

After getting a connection with Get-CrmConnection, we can query for active SLA’s with Get-CrmRecords in the org we will be importing to:

$crmOrg = Get-CrmConnection –InteractiveMode

# get any active SLAs in the org
$SLAresults = Get-CrmRecords -conn $crmOrg -Entitylogicalname sla -Fields slaid, statecode, isdefault -FilterAttribute statecode -FilterOperator -eq -FilterValue Active

From here we can deactivate the SLAs with Set-CrmRecordState and import the solution:

# deactivate the active SLAs
$SLAresults['CrmRecords'] | % { Set-CrmRecordState -conn $crmOrg -CrmRecord $_ -StateCode Draft -StatusCode Draft }

# import solution
Import-CrmSolution -conn $crmOrg -SolutionFilePath C:\Path\To\Solutions\CaseEnhancements.zip -ActivatePlugins -PublishChanges

With the SLAs in draft status, the solution should import successfully. Once it is completed, we can re-activate the SLAs. One catch to this process is that any SLA that was not marked as Default will not be restored when it is reactivated – so after reactivation we can use Set-CrmRecord to update the “Is Default” property as necessary.

# re-activate SLAs
$SLAresults['CrmRecords'] | % { Set-CrmRecordState -conn $crmOrg -CrmRecord $_ -StateCode Active -StatusCode Active }

# update any default SLAs to be default again
$SLAresults['CrmRecords'] |
? { $_.isdefault -eq 'Yes' } |
% { Set-CrmRecord -conn $crmOrg -EntityLogicalName sla -Id $_.slaid -Fields @{'isdefault'=$true} }

Now any SLAs should be restored to their original state, and the solution with SLA updates is imported and applied. Here is a sample script that shows the whole process:

Make sure to download the Microsoft.Xrm.Data.PowerShell module from GitHub at https://github.com/seanmcne/Microsoft.Xrm.Data.PowerShell and follow https://blogs.msdn.microsoft.com/crminthefield/ for updates to the module!

Topics: Microsoft Dynamics CRM Microsoft Dynamics CRM Online

Dynamics CRM – Specialized Operations

Specialized Operations were introduced in Dynamics CRM 2015 Online Update 1 and now included in Dynamics CRM 2016 as well.  They provide the ability to do what used to take separate messages (such as Assign or SetState) all in a single Update message. 

The following is the list of special messages that can now be executed in a single Update message:

  • AssignRequest
  • SetStateRequest
  • SetParentSystemUserRequest
  • SetParentTeamRequst
  • SetParentBusinessUnitRequest
  • SetBusinessEquipmentRequest
  • SetBusinessSystemUserRequest

Let’s jump into some sample code.  Before CRM 2015 Online Update 1, this is what it would look like to make an update to a record and then assign it to a different owner.

    var update = new Entity("contact");
    update.Id = contactId;
    update["firstname"] = "Blake";
   
    orgService.Update(update);
   
    var assignRequest = new AssignRequest();
    assignRequest.Assignee = new EntityReference("systemuser", ownerId));
    assignRequest.Target = new EntityReference("contact", contactId);

    orgService.Execute(assignRequest);

As you can see, both the Update message and the Assign message need to be executed.

Now with CRM 2015 Online Update 1 and now CRM 2016, the Assign message can be merged into the Update message and save an extra round-trip to CRM as shown below.

    var update = new Entity("contact");
    update.Id = contactId;
    update["ownerid"] = new EntityReference("systemuser", ownerId));
    update["firstname"] = "Blake";

    orgService.Update(update);

This new feature also has an impact for plug-ins and workflows.  If you perform an Update message that contains the Owner field then any workflow or plug-ins that are registered on Update will trigger once for all non-owner fields and then again for the owner fields.  The same goes when updating state/status fields.

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

How many tables and records are in your Dynamics CRM Database?

Today's post is written by Keith Mescha, Principal Architect at Sonoma Partners.

There are many reasons to want to know how many records are in each table in your MSCRM database. One of the primary instances in which we use this information is when we are assessing the level of effort required to upgrade a client from older versions of CRM, or from MSCRM On-Premise to MSCRM Online.

When migrating customers from one version of MSCRM to another, it's good to get a handle on what's in the current system from both an entity and record count standpoint. This is also a good way to know which entities are being used, and which are not. It's also very easy to pick out non-native objects as they will have a prefix on them. Sometimes you will see more than one prefix, which will indicate that 3rd party solutions are installed or they have had many different groups or people in their customizing without maintaining consistency.

There are a few tools out there that do this type of thing, but if you are On-Premise and have access to the underlying SQL database, and have a little bit of experience working in SQL, this can be quite simple.

BTW if you have an Online Microsoft Dynamics CRM org and want to get some record counts, see this blog to learn about Dynabacus, an application we built to help count records within Microsoft Dynamics CRM Online.

Once you get into that database via SQL Server Management Studio (SSMS) you can get row counts for all tables in a couple of different ways. One easy way is to run this simple SQL query and copy and paste the data from the results pane to Excel, and then start analyzing from there.

/* Change <orgname_dbname> to be the name of your organization database* */

USE <orgname_dbname>

GO

 

SELECT t.name, s.row_count, s.index_id

from sys.tables t

JOIN sys.dm_db_partition_stats s

ON t.object_id = s.object_id

AND t.type_desc = 'USER_TABLE'

AND s.index_id <2

order by 1

 

Depending on what version of SQL Server you are running there are also some built-in reports into SSMS you can use if you right click on the database name in SSMS and select the reports option. Run the Disk Usage by Table report. This will query the database and return you a simple interactive report where you can do some basic sorting. This will help you quickly uncover which tables have the most records, or which tables are taking up the most disk space.

Photo 1


Finally, within SSMS there is the ability to use the Object Explorer Details option from the View menu. You can then drill into the tables object. This will bring up a list of all your tables and some SQL technical stuff you don't care much about. If you right click on the header row you can select and deselect what columns to show. To make it cleaner, I typically remove all the other columns and only add the Row Count column. This is my go-to method when trying to get a quick glance at how many rows are in the tables in a MSCRM Org. The nice part about this one is your column selection is saved, so next time you go in you just browse to the tables and you get a quick read of the row counts.

 

Photo 3


Photo 4

 

Want to discuss the tables and records in your Dynamics CRM Database? Contact us to learn. In the meantime, download Dynabacus, the Microsoft Dynamics CRM Record Count Tool.

Dynabacus the Microsoft Dynamics CRM Record Count Tool

 

Topics: Microsoft Dynamics CRM

Dynamics CRM 2016 – Turn Any Text Field into an Auto-Complete

Before the holidays I wrote about the new keypress events that exist in Dynamics CRM 2016 and how they can be used to provide more rich data validation but also with the release of Dynamics CRM 2016, the keypress events can be utilized to provide even more functionality by way of auto-complete controls.  Auto-completion methods were added to the Xrm client-side library which can be used in conjunction with the keypress events to turn any text field into an auto-complete control.  This can come in handy if you want to pull data from a third-party source and display it as if it were a native lookup control in CRM. 

A great example of this would be turning the native State and Country address fields into an auto-complete using live data from another source.  Without further ado, lets jump into some code on how this can be accomplished using the native Country field.

In this example I will be using the geognos free web service to retrieve a list of countries as well as their respective flags.

Note:  The free web service is http only so if you are using it in an https-enabled CRM environment then you will have to manually allow access through a browser prompt.

First setup a standard onload event in your JavaScript and register it on your form.

Then make an ajax call to the geognos web service which will retrieve all countries and add them to a list along with a URL to an image of the country flag.

$.ajax({
     url: 'http://www.geognos.com/api/en/countries/info/all.jsonp',
     dataType: "jsonp",
     jsonpCallback: 'callback',
    success: function(data) {
          for (var country in data.Results) {
              countries.push({
                   id: country,
                   name: data.Results[country].Name,
                   icon: "http://www.geognos.com/api/en/countries/flag/" + country + ".png",
                   fields: [data.Results[country].Name] 
              });
          }
    }
});

Next we will write a function using the keypress event for the native address1_country field which will utilize the new auto-completion methods to hide and show a list of countries.  The kepress event needs to handle the logic to filter the list of countries based on what the user types so we will compare what the user typed to the name of the country in the list to filter it down and pass the results to the showAutoComplete method.  If the data passed into showAutoComplete has an icon property set (a url to an image) then it will display an icon next to the list item which we will utilize to display the country’s flag.

var keyPressFcn = function (ext) {
     try {
          var resultSet = { results: [] };
          var userInput = Xrm.Page.getControl("address1_country").getValue();
          var userInputLowerCase = userInput.toLowerCase();
          for (i = 0; i < countries.length; i++) {
               if (userInputLowerCase === countries[i].name.substring(0, 
                  userInputLowerCase.length).toLowerCase()) {
                     resultSet.results.push({
                          id: i,
                          fields: [countries[i].name],
                          icon: countries[i].icon
                     });
               }
               if (resultSet.results.length >= 10) break;
          }
          if (resultSet.results.length > 0) {
              ext.getEventSource().showAutoComplete(resultSet);
         }
         else {
             ext.getEventSource().hideAutoComplete();
         }
     } catch (e) {
          console.log(e);
     }
};

Lastly, we need to register the keypress function we wrote above to the address1_country keypress event

Xrm.Page.getControl("address1_country").addOnKeyPress(keyPressFcn);

Once we add the script to CRM and register the onload function we can now check it out in action!

Note:  The user can still type free-form text into the control and by default CRM won’t validate that the user selected something from the list but JavaScript validation could be added to make sure an item from the list was used if necessary for your business.

Here is the complete script for this example:

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

Deploy Dynamics CRM with PowerShell Part 1: Duplicate Detection Rules

Today's post is written by Ian Moore, a Developer at Sonoma Partners.

The Dynamics CRM PFE team recently released Microsoft.Xrm.Data.PowerShell, which is a PowerShell module with cmdlets for interacting with data in a CRM Organization. It includes cmdlets that allow automation of solution exports and imports, changing system settings, and administration tasks. In this series of blogs, we will look at how these cmdlets can be used to automate common tasks that are encountered in deploying solutions for Dynamics CRM. The first part will be how to enable duplicate detection rules from PowerShell.

When importing a solution that contains an entity, it is not uncommon for CRM to unpublish any duplicate detection rules for the entity.

clip_image002

This requires any affected rules to be published manually after the solution is imported. We can automate this process in a few lines of PowerShell.

First, create the following function:

This function takes in the CrmServiceClient created by the Get-CrmConnection cmdlet, and an array of guids for duplicate rules. Each guid is piped to the small “Create-PublishRuleRequest” function to create an SDK request, and the piped to the code block that executes the request and returns the response as a PublishDuplicateRuleResponse.

Now for the script, we need to make sure the module is imported and can create a connection to Dynamics CRM with Get-CrmConnection.

if (-Not (Get-Module -Name Microsoft.Xrm.Data.Powershell)) {
     Import-Module Microsoft.Xrm.Data.Powershell
}

$crmOrg = Get-CrmConnection –InteractiveMode

Before importing the solution, we can query for the duplicate rules that are currently published with Get-CrmRecords. By filtering for only active rules, we can make sure we don’t unintentionally publish a rule that wasn’t active prior to importing the solution.

$duplicaterules = Get-CrmRecords -conn $crmOrg 'duplicaterule' -FilterAttribute statecode -FilterOperator -eq -FilterValue Active

$duplicateruleIds = $duplicaterules['CrmRecords'] | select -ExpandProperty duplicateruleid

Now we have the guids we need for publishing, so we can import our solution to the organization with Import-CrmSolution, and call our publish function.

Import-CrmSolution -conn $crmOrg -SolutionFilePath C:\Path\To\Solutions\DevSolution_1_0_0.zip -PublishChanges

Publish-CrmDuplicateRules -conn $crmOrg -RuleIds $duplicateruleIds

Here is a sample script that shows the whole process.

Make sure to download the Microsoft.Xrm.Data.PowerShell module from GitHub at https://github.com/seanmcne/Microsoft.Xrm.Data.PowerShell and follow https://blogs.msdn.microsoft.com/crminthefield/ for updates to the module!

Topics: Microsoft Dynamics CRM Microsoft Dynamics CRM Online

Upgrading to Microsoft Dynamics CRM 2015? Here's What You Should Consider

image

Are you currently working with a version of Dynamics CRM pre-2015?  Have you not yet experienced the new flattened “single window” UI?  Do you not know what a CRM Solution is?  Or even worse, do you still use call-outs and deploy custom web resources to the physical CRM Servers (yikes!)?  If so, it may be time to start thinking of an upgrade to Microsoft Dynamics CRM 2015.

Upgrading any software can be a frightening thought and something you’d rather just put on the back burner.  However, delaying the upgrade has some negative impacts as well:  you obviously miss out on the latest and greatest features, and delaying the current pain of an upgrade may mean more pain down the road if you’re not on top of the latest software. Upgrading from 2011 to 2015 is much easier than 3.0 to 2015.  In other words, your current self can rest easy, but the pain you’re causing your future self is growing by the day. 

How configured are you?

A good consideration to take when you do decide to upgrade is, how much of a beast has your CRM system become?  You may have had multiple vendors, multiple deployments, multiple internal project sponsors with different priorities of a CRM system, and years of band-aiding a system you don’t even want to think about upgrading.

In this scenario, it may be best to take a step back.  Look at the Dynamics CRM upgrade as an opportunity to clean up all the noise that has accumulated in your deployment and revalidate the work that has been done over the years.  Use this as your opportunity to deploy 2015 in a “clean slate” and interview the key business groups as if they don’t have a CRM system at all.  Just because something was built and functionality was added to your deployment, doesn’t mean it’s needed.  Ask the question “why?” and if nobody can provide an answer, seriously consider leaving it behind.

Going through this process means you’ll most likely need to write a process to migrate data from your current version, to 2015.  You don’t want to go through the upgrade process which would automatically take all your current customizations and migrate them to 2015.  Instead, you’ll want to start with a fresh install and reconfigure your environment based on the requirements you obtained during the “revalidation discovery” process.  E.g., there may be fields that drop from your schema going forward.

On the other hand, if your system is small, relatively new, and hasn’t had many deployments to it since go-live, you may want to have the upgrade process perform most of the heavy lifting for you.  This means you won’t have to write a migration process – the upgrade process will automatically perform any data conversion needed for 2015.

If your current system hasn’t been too configured, chances are that the changes you’ve made have been supported.  Therefore, they should automatically upgrade through the upgrade process with not much falling out for you to manually clean up.

Budget is a big driver of this conversation as well.  If you have a massive implementation, it may be quicker for you to start fresh and implement just those features you want to carry forward versus trying to upgrade an old archaic system with a lot of deprecated code.  However, if your implementation isn’t complex, and all your code was supported via the API and nothing is deprecated, an actual upgrade may be quicker versus redeveloping.

Pre 2011 vs. Post 2011

There are a lot of clients out there that aren’t on Dynamics CRM 2011 or greater.  If this is you, you’ll want to definitely consider adding more time to your upgrade process as 2011 introduced some pretty groundbreaking changes to the deployment model.

With 2011, all customizations and configurations are packaged up in a Solution.  This includes any custom web pages, JavaScript files, etc.  With versions prior to 2011, these files were manually deployed to the server which means that they would have to be converted to 2011 format prior to upgrading to 2015.  If you’re on 2011 or later, then that work has been done already for you.  If you’re on a pre-2011 version, then you’ll need to factor that time into your upgrade decision.

Continued Investments into Mobile

Microsoft officially entered the mobile space with Dynamics CRM 2013, and they continue to improve upon that story.  With the release of 2015 they made enhancements to the Tablet Client by introducing an offline story, and making the dashboards more configurable.

Now with 2015 Online Update 1, they have introduced a refreshed phone app that has the same rich functionality that the tablet app has.  There’s still a lot of room for improvement in these apps, and during our time at Convergence 2015, the mobile roadmap looked feature rich.  If mobility is something you’re looking to get into, upgrading to the latest version of CRM could go a long way as you’d get a free mobile app in the process.

Features, features, features

Of course, the main driver for upgrading usually is the features that the new product comes with, and Dynamics CRM 2015 doesn’t fall short in this category.  With 2015, and 2015 Online Update 1 (Carina), Microsoft has continued to add to its already feature-heavy product.  Key notable features rolled out in these latest versions are:

  • Multi Entity Search
  • Business Rules
  • Business Processes
  • Continued Mobile Improvements
  • Hierarchical Security
  • Hierarchy Visualizations
  • Outlook Sync Improvements
  • Folder Level Tracking – Outlook Email Sync
  • Refreshed UI with cleaner Site Map
  • Theming
  • Date Only Fields
  • Office Groups Integration
  • OneNote Integration
  • Immersive Excel
  • Export to Excel Improvements

If any of these features are something you’ve been waiting for in the product, an upgrade now may be a no-brainer.

If your organization is considering a Microsoft Dynamics CRM 2015 upgrade, please let us help you decide the best way to approach the project.

Topics: CRM Upgrade Microsoft Dynamics CRM Microsoft Dynamics CRM 2015

Sonoma Partners Named the Microsoft Dynamics CRM US Service Industries FY15 Partner of the Year

Last month, Microsoft proudly announced the United States Microsoft Dynamics Partner Award winners during the US Microsoft Dynamics Annual Conference. 

“The US Partner Awards gives Microsoft Dynamics the opportunity to recognize its top partners at a global event.  We are honored to acknowledge the extraordinary contributions and success driven by our Microsoft partners serving a strategic group of customers and driving strong business impact throughout the past fiscal year.” said Marietta Davis, Vice President, US Dynamics.

Sonoma Partners was recognized with the Microsoft Dynamics CRM US Service Industries
FY15 Partner of the Year Award. The company was honored among the top Microsoft partners for demonstrating sales excellence in innovation and implementation of customer solutions based on Microsoft technology.  

Dynamics_logo_Service_Industries_partner_color_07_23_14_v1

Awards were presented in multiple categories, with winners chosen based on their Microsoft Fiscal Year 2015 industry and product sales performance in the United States. Sonoma Partners was recognized for providing outstanding solutions and services, as well as demonstrating excellent engagement in the in the Professional Services Industry.

“Sonoma Partners is seen as an industry leader in the area of Service Industries. They have built their organization by embracing the need to have unique specializations for success.” said Lindsay Zwart, US Partner Lead – Microsoft Dynamics.

Microsoft Dynamics Day 3 Awards-0062

Microsoft Dynamics Day 3 Awards-0147

Our Microsoft Dynamics CRM Sales Team accepting our award in Nashville, Tennessee. 

Upgrading to Microsoft Dynamics CRM 2015
Topics: Microsoft Dynamics CRM