Sonoma Partners Microsoft CRM and Salesforce Blog

Cover the Bases of a Successful CRM Deployment

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

We’ve seen customer relationship management (CRM) help organizations improve sales teams’ productivity, increase revenue, and optimize their business processes. Are you looking to invest in a tool that can transform your sales organization?

Here are a few tips to help you cover the bases of a successful CRM deployment.

Hit 1st, 2nd, 3rd, and make the dash to home to get a better sense of what you should be considering when investing in a new – or updating an existing – CRM system.

1. The Platform

Are you interested in a platform that can benefit all areas of your business? We suggest turning to the key market leaders, Microsoft and Salesforce. As you evaluate platforms don’t get distracted by impressive lists of feature/functions. At the end of the day, Microsoft and Salesforce are powerful tools that can be customized to meet your organization’s unique needs. Instead of conducting the evaluation based on features, spend your time looking at the systems your organization already uses. What integrations do you need to connect different aspects of your business? Which platform is best positioned to make these integrations as seamless as possible?


Pro-tip: We highly discourage you from building your own platform, a.k.a. a Homegrown CRM system. Microsoft and Salesforce are market-leaders for a reason. They come with next-level enhancements, support blogs, customer forums, frequent updates, and so much more. Save yourself the headache of having to make adjustments and conduct maintenance all by your lonesome. Rely on your teammates at Microsoft or Salesforce instead.

2. Executive Buy-In

 The success of your CRM lies in the hands of your leadership. Getting executive buy-in at the beginning of your CRM journey is crucial to garnering meaningful end user adoption. The leaders at your organization need to actively use CRM and support change management and user adoption programs in order to make a serious and lasting impact on your users.

3. Scalability

Customer relationship management is not just a deployment, or a project. It’s a never-ending, ongoing program, and your system needs to grow as you do. As you optimize your business processes, your solution needs to adjust and evolve. It’s critical to view the initial deployment as just one piece of the bigger picture you need to get the 360-degree view of your clients that you want.

4. The Partner

Slide into home with an implementation partner that can help you achieve your CRM goals. When selecting an implementation partner, it’s important to make sure they understand your business. Which industries do they specialize in? Do you resonate with their case studies? If you’re interesting in getting a general feel for the organization, try to attend an in-person event or demo.

Different partners have different methods for implementation. What model does this particular organization follow? Do they have a strategy for change management and user adoption? Set yourself up for success by doing your research prior to investing in a partner who can truly make – or break – your implementation.

A poorly implemented system can go stale quickly when users are not committed, or motivated, to logging information within the system. With a failed partnership, you’ll find yourself entering the selection process all over again, and no reason to “fly the W” just yet.

Are you interested in getting started on a homerun of a deployment? We’d love to help! Fill out this brief form to contact us.

Topics: CRM Best Practices

Take Your Salesforce Service the Extra Mile with Entitlements and Milestones

Today's blog post was written by Sarah Parise, Business Analyst at Sonoma Partners.

Leveraging Salesforce cases and work orders is great, but are you looking for more insight into your how service agents are actually doing? Salesforce’s Native Milestone and Entitlement Processes can provide a clearer picture of how effective your service agents handle their work. With these insights, you can finetune your support processes, find bottlenecks that affect your customers, prioritize incoming requests, and provide better, quicker service for your customers. Win, win, win. So how does it work?

Milestone and Entitlements are a native feature of the Salesforce Service Cloud.

They allow you to create service processes for your customers in the form of Entitlements made up of multiple Milestones. Entitlements denote what service process a customer is entitled to based on attributes such as what Tier of Account they are, what type of products they’ve purchased, or if they have any additional support contracts. Milestones represent steps in each Entitlement process, such as responding to a client email, ordering a new part, or having a field agent complete an appointment with a customer. On each milestone you can denote an amount of time each step should take.

Each case or work order is then associated with an entitlement, and you can then track progress toward each of the entitlements milestones, and whether or not your agents are in violation or approaching violation on a step in your service process.

A violation has occurred on an Initial Customer Response milestone.

Sarah 1
Click the image to expand.

You, in turn, can report on milestone and violation metrics through native Salesforce reporting functionality, like in the example below.

Example of Milestone and Entitlement Reporting

Sarah 2
Click the image to expand.

Violation notifications work hand-in-hand with the Milestones Console widget. Agents can leverage the this widget to see, in real-time, whether they are currently in violation of a required step for their cases or work orders. The Violation status on the widget shows if your users are reaching an upcoming milestone, have passed and violated a milestone, or are in good standing. Additionally, you can automate email alerts, tasks, field updates and outbound messages when milestones change in status to help agents prioritize and stay on top of their work loads.  

The Milestone Tracker on a Case Record

Sarah 3
Click the image to expand.

Typically, Salesforce milestones tracking is related to certain Service Level Agreements associated with your Accounts, Contacts, and their associated orders. This is to allow you the flexibility to specify what type of support your customers receive and enforce different milestones, such as email response time account status or the Service Agreements that they have purchased.

However, how do you handle it if you don’t have different Service Level Agreements for different Accounts or Products? Recently, a customer came to us with this very question. Out of the box Salesforce Milestone tracking requires you to manually add different Entitlements or Service Level Agreements to your Account and Orders, but we needed a solution that was more automated, and provided the ability to track milestones against items in the system that weren’t cases or work orders.

To handle the need for one entitlement process for all customers, regardless of product or account type, we created a custom code that auto created the create Entitlements for each Account and Contact in system. This trigger also automatically associated that entitlement to all incoming cases, removing manual steps for both their sales and service teams!

For more information about how to set up entitlement and milestone tracking for objects not natively supported by Entitlements and Milestones look out for the second part of this blog post coming soon!

Topics: Salesforce

How CPQ Impacts a Sales Rep, By a Sales Rep

Today's blog post was written by Niki Somerfield, Senior Account Executive at Sonoma Partners.

When I began my sales career, I started in an inside sales role in a call center environment. I sold hardware and software to companies, generating anywhere from five to fifteen quotes a day. This type of transactional quoting can be fast-paced and exciting…for me, this was not the case.

At the time (though I’m sure they’ve upgraded systems since then), we would use approximately five different applications to get a quote together.

I used one application to store and gather all my customer information; a website to look up product data; another website for pricing and comparisons; another application for shipping and distribution; and a final order fulfillment application. I would assemble information from each application and manually input it into Excel… which I would then convert to PDF and send through e-mail. Whew. If your head isn’t spinning, I applaud your ability to understand what took me months to get a hang of.

Each quote took me 15-20 minutes to put together. In a highly transactional sales position, that’s an impossible amount of time. Every moment of the day that I wasn’t making calls or sending e-mails, I was missing opportunities. But I couldn’t wait until the end of the day to get the quotes together because the customer would likely purchase from a competitor in the meantime.

Fast forward to a point where I was ready to move on in my career and started looking around. I learned about a company that sold CPQ (Configure, Price, Quote). I fell in love and couldn’t believe this solution existed! As a sales rep, these are the things that made the most difference for me:

1. Better System

This product was built for me – the sales rep – in mind. The application streamlines business processes across the sales organization. Its modern, slick, and created for the 21st century sales process. And its cloud-based! So that means push upgrades with new features to take advantage of all the time.

CPQ_blog_infographic 750x392

2. Better Productivity

When I use CPQ… I have ONE… I repeat ONE… screen open at a time to get a quote together. It plugs into my CRM which means I’m also not manually entering anything.
Ever had to deal with data entry? Manual entry equals multiple errors. It’s hard to even put into words how much more I could fit into a work day when I wasn’t spending hours completing quotes or correcting errors.

3. Better Relationships

In my previous role, a customer would often send an email to multiple vendors asking for competing quotes. I’d typically save the quote for the end of the day so I could use the time customers are in the office to call on them (remember – 15-20 minutes to get a quote together!). But sometimes a customer didn’t want to wait and would execute the first quote that came across their desk. With CPQ, I can get quotes out to a customer in five minutes or less. I could even generate one while on the phone with them! That makes a huge difference to the seller!

4. Better Management

I would say I’m a fairly typical sales rep. And as a typical sales rep, I’m not interested in any activity that isn’t revenue-generating. In my previous position, I’d have to enter data into an application my manager used so he could report off of it. Then, I’d re-enter some of the same information in a separate application to generate my customer facing quote. If I’m honest, I’m only going to do one of those things. And that one is going to be the revenue-generating option.

Using CPQ, you enter the information in ONE place. My manager gets the data he’s requested, and I get the quote to close the deal. CPQ in tandem with CRM helps decrease the amount of administrative work required to forecast accurately.

Are you interested in talking with us more about CRM and CPQ? You can contact us here, and we’d be happy to help.

Topics: CRM for Manufacturing

Winter '18: Top 5 New Reasons to Switch to the Lightning Experience

Today's blog post was written by Caitlin Pfeiffer, Prinicpal Consultant at Sonoma Partners.

The Winter '18 Release Notes have been published and preview sandboxes have been upgraded, signaling that the next Salesforce release is around the corner. With most Winter releases, there is a lot of new functionality included in this release, but what I’d like to focus this blog post on is the latest changes you can expect with the Lightning Experience.

Caitlin 1
If you are still using Salesforce Classic, the Winter '18 release gives you a bunch of reasons to get ready to switch.

Here are just my top 5...

5. Embed Dashboards on the Home Tab and in Lightning Apps

Caitlin 1_v2
Click the image to expand.

What is it? You will now have a native out of the box “Dashboard” lightning component that can be added to a Lightning Home Page or App.

Why it’s cool? Before this feature, you could only add single reports to the Home Page and display the chart included in that report. This meant that you were unable to use some of the chart components that are only available on a Dashboard (like metrics and gauges). Plus, if you already included your key metrics in a dashboard, you would need to update both the Home Page and the Dashboard if you wanted to change or add a metric. Now, you simply can update the Dashboard, and it will automatically update the Home Page as well.

Classic vs. Lightning Comparison

  • Classic
    • Con: Homepage dashboard component only displays top 3 charts from a dashboard
  • Lightning Experience
    • Pro: Embed a full dashboard or a link to a dashboard directly on the homepage

4. Expand Your Reps' Email Reach with List Email

Caitlin 2 v2
Click the image to expand.

What is it? Mass emailing has come to the Lighting Experience.

Why it’s cool? Mass Emailing in Classic always felt “hidden” away on the Contact / Lead landing page. The new List Email functionality is integrated into your Contact, Lead and Person Account list views and seems to be more user friendly and flexible than Classic Mass Emailing.

Classic vs. Lightning Comparison

  • Classic
    • Con: Preview email template with placeholders for merge fields
    • Con: Users can only select from one of the predefined email templates
    • Pro: Allows mass emails to be scheduled
  • Lightning Experience
    • Pro: Preview your email with merge fields populated for the contacts you are emailing
    • Pro: Allows users to send a customized email and add their own merge fields without needing to create a saved email template
    • Con: List emails can only be sent immediately

3. Prompt User to Add Products to Opportunities

Caitlin 5_v2
Click the image to expand.

What is it? When this feature is enabled, users are prompted to add Products to an Opportunity as soon as they create a new Opportunity.

Why is it cool? This is a common requirement that I’ve heard from several of my clients. Previously, this was something we’d have to do using custom code, but it’s now as simple as checking a checkbox in the setup menu.

Classic vs. Lightning Comparison

  • Classic
    • Con: Not available without custom development
  • Lightning Experience
    • Pro: Turn on with a check of the checkbox and get reps to enter their product information more consistently and easier.

2. Edit More Records at once with Mass Inline Editing

Caitlin 6
Click the image to expand.

What is it? Finally! You can mass inline edit in list views.

Why is it cool? I know this seems like a small thing, but this is a productivity feature available in Classic that a lot of users love because of how much time it saved them.

Classic vs. Lightning Comparison

  • Classic
    • Pro: Can mass inline edit up to 200 records from list views
  • Lightning Experience
    • Pro: Ditto

1. Add Tables with Up to 10 Columns to Dashboards

Caitlin 7
Click the image to expand.

What is it? You can now add Tables to Lightning Dashboards. This feature is currently available in Beta, but it’s something that your system admin can enable without creating a support ticket with Salesforce.

Why is it cool? While you could add tables to Dashboards in Lightning before, this adds some cool features that go above and beyond what’s available in Classic.

Classic vs. Lightning Comparison

  • Classic
    • Con: Can only have 4 columns
    • Con: Limited to which fields can be included in the table based on the fields that are included on the chart of the underlying report
    • Pro: GA with full set of features available
  • Lightning Experience
    • Pro: Can have up to 10 columns
    • Pro: You can include ANY of the fields available in a source report's report tyle. No more fighting with the source report so that you can pull in the fields you want to display on a Dashboard.
    • Con: Currently only in Beta and doesn’t support: Chatter photos, conditional highlighting, and dashboard filters aren’t applied to Lightning tables.

If you’d like to learn more, here are a few references I’d recommend:

Think that you might be ready to make the switch from Classic to Lightning?  Sonoma Partners has already helped several of our clients with this transition. We can help you navigate how to take full advantage of the Lightning Experience (contact us).

Topics: Salesforce

Sonoma Partners Becomes a Microsoft CSP

Today's blog post was written by Corey O'Brien, VP of Development at Sonoma Partners.

We're excited to announce that Sonoma Partners has entered the ranks of the Microsoft Cloud Solution Providers. This means that not only will we continue to provide the best-in-class Dynamics services you have come to expect, but that we also now sell and support subscriptions to Microsoft services.

What does this mean?

We were already supporting these solutions, but adding this offering means we are now officially a one-stop-shop for our clients. Our support solutions and accelerators – more coming soon! – will not only add value to the platform but can now be included as part of our CSP offering. As said by Microsoft, “The Cloud Solution Provider program puts our partners in the middle of the relationship with the customer, delivering on solution success, and managing the business relationship.” You can learn more about the benefits of being and working with a CSP partner with Microsoft here.

Cloud solution provider-03

Our team has been working with Dynamics for years and is recognized as a leader in the Microsoft Dynamics world. We already have support tools to monitor our clients’ Dynamics instances proactively, providing insight into potential issues before they arise. Our team continues to look for ways to bundle in additional IP with subscriptions to provide more value to our customers.

Why should you care?

Starting immediately, our clients can buy subscriptions to Microsoft Dynamics, Office 365, and Azure from us directly. Purchasing through a CSP partner, as opposed to going directly to Microsoft, can provide you with a broader range of purchasing methods, more flexible and customized solutions, and a more direct line of support. Whether you have already taken advantage of our services or would like to start with licenses first, we can help.

If you would like more information on this topic, please contact us.

Topics: Microsoft Dynamics 365

Webpack and Dynamics 365

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

These days if you're building any complex custom UI, you're going to come across webpack, and for good reason. What is webpack? It's a build tool that you can read more about here.

Webpack is great, but when using it with D365 you will likely encounter a few bumps down the road. You'll likely notice that you are unable to load SVG or Font assets into D365, stumble across the restrictions on which characters can appear in web resource filenames, and flip a table over trying to get sourcemaps into D365 as well.

How do we get around these hurdles? The most obvious answer might be to use the url-loader module to embed your assets as Data URIs. That approach may work out fine in some cases, but there's a whole host of very valid reasons not to use the Data URI approach. Since we've got some significant downsides, let's take a look at other approaches to solving each of our problems.

Note: the below examples are targeting v3.4.1 of webpack

Unsupported File Types - Fonts

The way around most unsupported file types we care about is to append .css. We primarily use this for font files however. All you need to do to fix this in webpack-land is to adjust your output name pattern such that .css is appended, and you're all set. Therefore a font called something like awesomebold.ttf would become awesomebold.ttf.css.

Unsupported File Types - SVG

While we have support for SVG web resources supposedly coming in the next release, how do we handle this until then? You could certainly go with the same append .css to the filename trick we used for fonts, but in our experience we like another approach. We find our SVG assets do not change all that often, and are generally pretty small, so one would think we might lean back towards the url-loader approach mentioned above. And we do. Kinda. url-loader always does Base64 encoding of your assets, but SVG under the hood is just XML. As it is therefore human readable we prefer to pull the XML in pretty much as-is with svg-url-loader.

Filename Special Character Restrictions

If you've dealt with web resources for more than a hot second, you've likely stumbled across the fact that D365 will not allow you to name a web resource with a hyphen in it. According to the docs they technically only support:

[The] name can only include letters, numbers, periods, and nonconsecutive forward slash ("/") characters.

This means no hyphens. These are pretty darn common in asset filenames though, so thankfully we have a way around it! What we typically do here is simply ask webpack to strip out the hyphens using the customInterpolateName option. While the customInterpolateName option is not well documented, it is certainly available for us to hook into and thus solves our problem.


While it is arguable whether or not you want to store a sourcemap in D365, for homegrown applications these can be very handy for debugging, especially if you're not using something awesome like Imposter for Fiddler. Thankfully getting these into D365 is fairly easy. What we can do is use something similar to our first trick. In this case we prepend the word map as transforming the filename in any other way doesn't seem to work in all cases. Again, here we only need a quick change to our webpack config and we're off to the races.


So you see, with a few simple tweaks to our webpack config, we can now use just about any resources we want. Make a few config updates, kick off a new webpack build, and you've got your assets all set and ready to be uploaded to D365.

Have you come across any other issues with web resource development in D365 that you've yet to solve? We'd love to hear about them in the comments!

Topics: Microsoft Dynamics 365

Microsoft AppSource Admin Portal Improvements

Did you know that Microsoft AppSource recently celebrated its one-year anniversary? Me neither…time really flies, as I just assumed it has been around so much longer. The progress made over one year has been incredible!

Microsoft recently improved the app submission process experience with the release of their Cloud Partner Portal ( In a previous post, I discussed how to prep your Dynamics 365 Customer Engagement solution to make it AppSource ready. This post will delve a bit more into the submission portal pages and detail the assets you need to have ready to submit an app.

Getting Started

First, you need to sign in with an account authorized to publish apps.

After sign in, you'll be taken to your offers list. This will show the status of your offers, including if there are any with errors existing with the submission process.


To create a new Dynamics 365 Customer Engagement (ie CRM) submission, click New offer and Select Dynamics 365 Customer Engagement.


This will take you to the new and improved Editor experience. As before, you can save your progress at any point (I always recommend you save often!).


The submission is broken into 4 key areas.

  • Offer Settings sets the Id, Publisher, and Name
  • Technical Info deals with Package information. The assets you need for this area is covered in detail in my previous post.
  • Storefront Details contains all of the marketing information required for the store.
  • Contacts simply collects the Engineering and Support Contact info

Storefront Details Section

Let's delve into my key takeaways from the Storefront Details section.

As you develop your solution for AppSource, be sure to have the following items ready from your content, product, and marketing teams:

App distribution logistics

  • A short summary and description of your application
  • Select your apps targeted industries, categories, and countries you plan to support
  • URLs to the following:
    • Help guide
    • App's privacy policy
    • Customer support
  • Terms of use
    • For some reason, this isn't a url, but the portal expects an HTMLI prefer to have our terms on our website, so we use the following HTML snippet:
    • <p>[App Name] is governed by the following terms located on our website.</p>
      < p>Please visit: 
      < a href=http://[url to license agreeement] target="_blank">http://[url to license agreeement</a>
      for full details.</p>

Marketing Artifacts

  • The new UI only requires two sizes for app logos. A 48x48 and a 216x216 sized logo. Be sure to the sizes correct
  • You can optionally connect videos that are stored on YouTube or Vimeo
  • You need at least one document. We usually add a product datasheet pdf
  • You can also add up to 5 screenshots of your app. Ensure your images size is 1280x720

Lead Management

Finally, you need to decide where you want AppSource to send the information it collects when users download your application. Your choices are:

  • None
  • Azure Blob
  • Azure Table
  • Dynamics 365 (CRM Online)
  • HTTPS Endpoint
  • Marketo
  • Salesforce

Additional Features


One final really cool new  feature is the Compare function. You can use Compare to find differences between the published version and your current draft version. This is helpful when you are making and trying to keep track of updates to your app.



Additional Portal Users

The new Cloud Partner Portal also allows the admin to create additional users who can have rights to contribute to the submission process.


This ensured that I am not a bottleneck in our app submissions and was a huge help to our organization. Smile

Final Thoughts

Once you are ready to submit, you will click the Publish button. Microsoft AppSource will go through a series of validation steps and email the contacts (and any additional email addresses you submit as part of the process) updates on completion or send you an email alert if it finds an error with something in your submission.

If you are an ISV and would like assistance with this process, please don't hesitate to contact us!

Topics: ISV for CRM Microsoft Dynamics 365

Connecting the Power BI On-Premise Gateway to a SQL Server Analysis Services Tabular Database

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

We’ve been surfacing a lot of our information for internal users via Power BI, and recently we wanted to author a round of reports that accessed an SSAS tabular database directly. We ran into some early snags, which were easily resolved by following some of the solution posted by the Power BI Team here.

Our takeaways from these early issues were to ensure a few things:

  1. Confirm that the account entered in the gateway configuration has been given Full Access within tabular database.

    Nerickson 1
  2. Confirm that the UPN that Power BI is using, the one on your Office 365 User object, matches the UPN of the target User in Active Directory.

Even with these changes in place we continued to see our report failing to load anything. We knew that the gateway was using EffectiveUserName to impersonate the end user, so we tried to determine if this was the culprit. In SSMS you can pass in the EffectiveUserName by going to the Connection Options and selecting the “Additional Connection Parameters” tab. By doing this, we captured in SQL Profiler the same error that we were seeing when the Power BI report would fail.

Nerickson 2

The following system error occurred: The user name or password is incorrect.

Nerickson 3

Nerickson 4

At this point we were confident that permissions were set properly within Analysis Services, so we began looking elsewhere. The step of verifying the UPN led us to Active Directory, and we discovered that making the account that runs Analysis Services an Domain Administrator solved the issue. This was not desirable as a long-term solution for obvious reasons so we continued to try various settings. Eventually whittled down the necessary permissions to Read on the AD User that is being specified by EffectiveUserName. To achieve this, we took the following steps.

1. Create a new Security Group and add the account running the SSAS Service to this group

We did this because we like to separate accounts that run different applications, and we like to retire old account when migrating to new versions of applications. It seems like this permission will be common, so our preference was to add the permission one time and manage the group membership as needed.

2. Grant the new security group read permissions to user objects in Active Directory

This permission can be granted to individual objects, or to an OU at a level that is sufficient to cover any users that would be passed into EffectiveUserName.

Nerickson 5

If this is being granted to an OU, click into “Advanced” and verify that is will apply to descendant objects as well. If it reads “This object only” edit the row and set “Applies To:” to include descendant objects as well.


Nerickson 6


Nerickson 7

3. Restart the SSAS Service

Initially the report in Power BI still was showing the error but after waiting a few minutes and trying again it work. Are assumption here is Power BI has some caching so key point is when changing domain level security make sure you provide ample time between tests for settings to proliferate through the various layers.

Now our report is accessible on and is connecting to our On Premise Analysis Services Tabular Model deployed in our Data Center via the Enterprise Gateway.

Nerickson 8

Please reach out if you have any questions by filling out our contact us form or commenting below.

Topics: Analytics Microsoft Dynamics 365

Day in the Life: Meet Charles

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

From Inside Sales Rep to Account Executive, Charles Winkler has seen many sides of Sonoman life.

We sat down with Charles to hear more about what it’s like working at Sonoma on our sales team, his favorite parts of Sonoman life, and what advice he has for future Sonoma sellers.


How would you describe a typical day in the life of a Sonoma Account Executive?

Winkler: Every day is different. I’m typically working down my to-do list of follow-ups, scheduling meetings with prospects, and making phone calls. Sometimes I have check-ins with the folks at Microsoft or with my manager. There is very little micromanaging in this role, so the day is very much what I choose to make of it.

What is your favorite part about working at Sonoma Partners?

Winkler: I really love the people at this organization. Everyone is very smart and works hard to help the business be successful. I’m never at a loss for people to ask questions of.

I also love the opportunity to grow and develop here. I began my work at Sonoma Partners as an Inside Sales Representative, mostly cold calling and prospecting at the top of the funnel. After working in that role for a few years, I was given the opportunity to move into an Account Executive role. Now, I get to see my deals all the way through to close. I’m the point of contact throughout the process, and I’m constantly interacting with customers. I really love taking on a consultative role in my selling – listening to the customer and customizing a plan for them with the help of other team members. I find it a very fulfilling role because you can see the impact you get to make on your prospects. I listen to their struggles and see what we can do to help.

CRM is also an exciting industry to be in. I’m on the Microsoft-side of our organization, and the product is always evolving. New updates and releases keep me on my toes and constantly learning to better help my customers. With all the different use cases for CRM and the industries it touches, it’s a lot of fun to challenge prospects with a new use case they may not have considered before. Selling custom solutions with a leading brand name behind it doesn’t hurt either.

What is your favorite Sonoma perk?

Winkler: Sonoma life is definitely a good one. I enjoy the work/life balance the company allows its employees. I also enjoy the “Boost My Roost” benefit that allows me to provide for my home office. I really believe Sonoma Partners is invested in making sure I have all the tools I need to be successful at this organization.

What advice do you have for future Sonoma sellers?

Winkler: The advice I would give for future Sonoma sellers is to utilize your coworkers. As I said, these are incredibly smart people, so use them to your advantage to differentiate from the competition and win.

Also, be patient, especially if you’re new to CRM. There is a lot to learn here, and it comes with time. Watch, listen, and absorb to be the best seller you can and fully wrap your arms around the product.

Lastly, get to know your coworkers early and often. The better rapport you have, the more successful you’ll be and fun you’ll have.

What do you think it takes to be successful at Sonoma and in our sales organization?

Winkler: Don’t wait for others to make things happen – get after it. We talk about being “hungry” for the deal. Staying focused and doing all that you can to move opportunities along will pay off, so don’t give up.

Relationships are key to being successful at Sonoma. Not only with our customers, but also with our software vendors. Make sure you’re in close contact with all of these players and building those relationships. It will pay off big time.

Thanks, Charles! Are you interested in joining our sales organization? Check out our open positions here.

Topics: Careers at Sonoma

Deleting Fields? Be Wary of Personal Views.

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

Dynamics System Administrators have free reign to do just about anything in a Dynamics organization… except with personal views. While you can manage your own of course, the personal views of others are locked down for those of us with even the greenest of bubbles in our privilege lists. And while the restriction itself makes sense I suppose – with 10s, 100s, or even 1000s of users, you can imagine how cluttered a System Administrator’s view lists would become if subjected to the whims of their user base’s individual views – this limitation does pose a problem when paired with the desire to delete custom fields.

Dearing 1v2
Behold the cursed yellow in a field of green, clipping our System Administrator wings, humbling us down to the level of a standard user.


You’ve been tasked with deleting a field in your organization - an easy feat for any System Administrator to accomplish. Or is it? Remember the 1000s of users mentioned before? Although this field may no longer serve a purpose for your organization, there was a point in time when it did, and someone is bound to have leveraged it as a column or criteria for one of their views. Dynamics will not notify you of this. It will tell you when the field is on a form, a system view, even a plugin image, but it won’t even warn of the possibility of this field being a part of a personal view – even your own.


Before I get into my code-based solution, there are several adequate non-code alternatives here, ones which most us have already been employing when facing a field deletion request. This can range from simply warning users of the upcoming deletion, and having them take it upon themselves to clean up any potentially affected personal views before the deletion occurs, or even tagging the field with a z_ at the front and setting it to non-searchable, making the field fairly out of sight for the average user.

But I wanted to take a different approach this time. A generic, programmatic approach, to clean any and all personal views of upcoming field deletions, without being bottlenecked by users, or corrupting their views in the process. My goal wasn’t to make the most optimized or prettiest resulting view definitions, but to safely eliminate references to fields with minimal disturbance to users.


  1. It is possible to programmatically create personal views that introduce situations that this code may not reliably clean.
  2. Microsoft may update advanced find view creation to incorporate functionality that this code does not anticipate, and therefore cannot reliably clean.
  3. You cannot impersonate and perform actions on behalf of disabled users. This means any personal views belonging to a disabled user will be uncleanable – so be careful of re-enabling users without running this script again.
  4. If the fields being cleaned are the primary criteria or columns of a view, the view may no longer serve much of a purpose. Views are never fully deleted as a part of this script, just cleaned, so users may still want to go clean out views that are no longer useful to them post-cleanup.


  1. This script was built to be run by Linqpad 5, a free tool that can execute C# code amongst other things. With minor adjustments this can be run from Visual Studio or your code editor of choice.
  2. You’ll need to reference the Microsoft.CrmSdk.CoreAssemblies nuget package, or the Microsoft.Xrm.Sdk assembly directly. This was written as of version
  3. The user executing this code will need to be able to impersonate other users, meaning they will need the ‘ActOnBehalfOf’ privilege. If unsure if you’ll possess enough privileges, just run as a System Administrator.

Code Summary

  1. Use the Organization Service Proxy class to impersonate all enabled system users for the organization by setting the Caller Id
  2. Iterate over all personal views, for all entities, for these users
  3. Use XPath expressions to detect and clean view fetchxml and layoutxml based upon inputted entity and field combos. A first pass is done on the primary entity’s fetchxml, then a secondary pass for linked entities. Fields are matched by their entity context, so fields with the same schema across different entities will not be incorrectly cleaned in the process, and layoutxml leverages the proper entity aliases to ensure it is cleaned correctly. Multiple levels of links are also cleaned properly.
  4. Executes view updates per user, if supplied that a cleanup should be performed



I've created a contact personal view with a link to account and referencing a few fields specified in the code to be cleaned for both entities:

Dearing 2

And here are the accompanying view columns: 

Dearing 3
Click the image to expand.




The cleaned view definition:

Dearing 4

And the cleaned view columns:

Dearing 5



After the script executes, we’re left with a functioning, albeit not fully optimized, view. I think we can all agree that it may not be the prettiest result given the sample we were fed, but we can now safely delete our fields without users receiving errors, and let the users decide what to do with their affected views on their own timetables.

Topics: Microsoft Dynamics 365