Sonoma Partners Microsoft CRM and Salesforce Blog

When Lightning Comes to Town

Today's blog post was written by Troy Oliveira, Principal Developer at Sonoma Partners.

One question that we get asked quite often from our customers is “should we make the move to Lightning?” Inevitably, the answer to this question leads in various directions, from compatibility of existing customizations and installed packages to how do I sell it to my users.

The question of compatibility can be explored through the help of the Lightning Readiness Check, but that’s a different post for a different day.

I'd like to focus on the “how do I sell it” question, because at the heart of every good Salesforce implementation is a drive for adoption.

Classic, the Salesforce security blanket

For many users, the Salesforce Classic interface is comfortable, safe. While there are things that almost everyone would like to change about it, users understand it, they know it, and it keeps them warm during cold winter nights.

For the most part, all Classic pages look the same. You have the object details at the top and related lists at the bottom. Everything you need, all within scrolling distance.


Out of the box Account Layout



Out of the box Contact Layout

Out of the box Opportunity Layout

Why completely upend a user’s world by making them learn a new user interface? Because there is a better way to view this data.

I see a couple main problems with Classic:

  • Every page layout looks the same. Sure there are different colors across the top, but it is way too easy to confuse which object you are looking at, especially if you are flipping between several open tabs in your browser.
  • If you want to view details of related records, you must jam the fields into the list view or click into the record itself. We all know that fewer clicks leads to a better experience.

Lightning, a more elegant interface of a more civilized age

While having the same basic page layout for every object might be more consistent, it can also lead to confusion. This sameness also assumes that the same content/context is the most important part of every object record. Let’s look at the out of the box pages in Lighting.


Out of the box Account Page

Out of the box Contact Page

Out of the box Opportunity Page

Now, I know that the first thing that you’re going to say is “the Account and Contact pages almost identical!” and you’d be right. However, look at the Opportunity. You see, the Opportunity has the sales path across the top of the page, and some related data along the side panel for quick viewing. Lightning allows for users to have pages that make sense in the context of the object that they’re working with.

If you build it…

The Lightning App Builder interface is one of the pieces that makes Lightning so powerful. Building pages in Lightning takes customization to a whole new level. In Classic, you were limited to what order the fields appear on the page and what related lists show up, and add VisualForce. That’s it. In Lighting, you still have those options, but you also can break the page up into columns, organize data in tabs, and drag-and-drop standard and custom components that will enhance and streamline the user experience.


For example, I’m going to drag the “Related Record” component onto my Opportunity page and configure it to display details from the Opportunity’s Account record.



Once I’ve dropped it in place, the App Builder interface shows the component with actual record information. This way I can determine if I added what I wanted to add. I’ll save and activate my updates.

Now, if I reload my Opportunity, I can see the related Account information in the right column. I don’t have to click into the Account to see the data.


Unfortunately, I have some redundant data. The summary at the top of the page has the Account name, but I also have it shown on the right. I know that the summary is controlled by the Opportunity Compact Layout, so I’ll change the fields in the compact layout to remove the redundancy and bring more key information “above the fold.”


You can see that I have created a holistic view of my Opportunity. I have my key details summarized at the top of the page, I can see an Activity timeline in the middle and have Account and Contact details to the right. If I need to dig deeper into the Opportunity details, I can click the Details tab.

An administrator can create customized versions of the record page and assign them to users by profile, by record type and by application. That’s right, Lightning takes the page assignment one step further than Classic. I can have a completely different view of the Account for my Sales App than what I see when I look at it in my Service App.

The streamlining benefits don’t stop there. In Lighting, every lookup link tells a story. Unlike in Classic where a user would have to click into a record to see related details, simply hovering over a link to a related record in Lighting provides contextual data.


Convinced Yet?

If you’re on the fence and are looking for a way to show users that their lives can be made easier, I hope that this post has proved to be helpful.

However, I know that not everyone is going to go running into the open arms of the Lighting Experience. There are valid reasons why you may not be ready to take the leap, either waiting for feature parity or needing to update your customizations to be compliant.

We are more than happy to help you figure out if Lighting is the right move. Contact Us for more information on how we can make the transition painless when Lightning comes to town.

Topics: Salesforce

Customer Success Story: Building A Stronger Foundation with Salesforce

Before deploying Salesforce, Feralloy lacked a centralized method for tracking and managing existing client relationships. As one of the country’s largest high volume steel processing plants, Feralloy needed a customer relationship management system that could measure up in equal strength to the materials they manufacture.


Who is Feralloy?

Feralloy Corporation consists of an extensive network of plants throughout the United States and Mexico. They bring over 60 years of experience to the table as they deliver high quality processed flat rolled steel.

Supporting Customization

Before CRM, Feralloy managed business operations through a myriad of Word documents, Excel spreadsheets, and verbal and email communication. This system created many problems for their organization, one of which was maintaining data after an employee departure. When a member of their sales team left, so would their customers’ information. Furthermore, without a formal process for managing customers, sales processes differed between business units, making communication and collaboration very challenging. Overall, the sales organization lacked the tools needed to adequately manage existing client relationships and nurture prospective business.

Building Systematic Inventory Management

Sonoma Partners helped Feralloy get up and running with a custom Salesforce deployment and an integration between CRM and their ERP System, STAR (AS 400). The integration allows Feralloy to more accurately document their inventory and assist customers in finding what they need when they need it. By more effectively overseeing their assets, Feralloy drives profitability for not only themselves but also their clients.

Facilitating Employee Management

With improved visibility into team performance, CRM allows Feralloy to more productively manage their employees. Knowledge management tools and streamlined onboarding process helped employees work strategically in their new environment, no matter what their experience in the industry. 

Going Mobile

Feralloy’s outside sale team can be on the road up to four days a week, working multi-state territories. By leveraging Salesforce1’s native capabilities, Feralloy’s sales teams can view account and territory management in the field. Since investing in a mobile strategy they’ve seen an improvement in the accuracy of their data due to their team having a more efficient way to enter it on-the-go.

Interested in a custom CRM system to call your own? Let us know.

Is your CRM

Topics: CRM for Manufacturing Salesforce

Shifting to a PowerBI World

Today's blog post was written by Keith Mescha, a Principal Architect at Sonoma Partners.

Power B-What?

There's been a bit of buzz recently in the CRM circles around Power BI and how it fits into the overall CRM landscape. There is certainly no shortage of blogs, podcasts and event demos showcasing the power of this toolset. On a personal note, I'm am seeing the same level of interest based on the meetings on my calendar over the past few weeks.

What we're finding at Sonoma is that the topic of Power BI is still very confusing for most customers. In this multi-part series we hope to help demystify some of the confusion through real-life examples and suggest some best practices based on learnings from our internal use as well as implementations with our clients.

The Basics

Power BI is Microsoft's analytics and dashboard Business Intelligence (BI) suite of tools and solutions. It's made up of a few main offerings:

  • Power BI Desktop – Free development tool for building data models and dashboards
  • Power BI Service – Online PaaS offering to host and share Power BI solutions with a monthly licensing per user subscription based model
  • Power BI Embedded – Online PaaS offering for embedding Power BI solutions into applications for external consumption with a session based subscription model
  • Power BI Mobile – Free mobile app for consumption of deployed Power BI solutions on a mobile device
  • Power BI Enterprise Gateway – On Premise software used to extend on premise data to the Power BI Service

For latest and greatest features and release notes, refer to the Power BI site.

Real-Life Example

Every company I know has data quality issues or challenges to overcome. Unfortunately, we here at Sonoma are not exempt. One of the things we constantly struggle with is incomplete data and stale data. Often times, we will create a record without knowing all of the various data points we typically want to capture. If we do not go back and fill that information in once it becomes known, we are left with an incomplete and potentially inaccurate record. The genesis of the original report request was to provide a means for the data steward team to monitor newly created records.

The original ask was for a custom SSRS report that listed out all Accounts that were missing specific data across a pre-determined list of fields. This report would then be provided to our data steward team on a regular basis to ensure the data is augmented appropriately. When one of my colleagues stopped by to chat about the report, I happened to be in the middle of building a dashboard in Power BI for a customer. He was curious what I was working on, and as we talked and he explained his need, I fired up a new instance of Power BI desktop in an attempt to solve the problem.


Get Your Data

I pulled up the 'Filtered Account' view from the 'Get Data' option in Power BI. My User Account is a System Admin and the Filtered Account view resolves all the option set and lookup fields for us, so this was a quick and easy solution. When getting data for many of the source types, you have an option to Import or Direct connect. I’ll go deeper on that topic in my next post but for this solution I chose to import.


Shape Your Data

Initially Power BI pulls in all the attributes in the table, this can be a bit overwhelming so filtering down the attributes was our next step. My colleague had a list off the fields he wanted to audit and report, so I filtered down the data set to only include those attributes.


Within 15 minutes my colleague and I had a prototype dashboard built with the fields he needed, including a couple charts to use as filters. From there we iterated on a few designs, and ultimately landed on the below look and feel. End to end this entire process took a couple hours to build, including some custom columns to allow linking to our Account Forms on Dynamics and Salesforce.


Deploy Your Solution

Once we had a solid solution built in Power BI Desktop, I created a new O365 group for internal reporting, added a few users to the group and then deployed the Power BI solution to the Power BI service.

One key thing to note here is that we had to assign Power BI licenses to these users before they could login and see our dashboard. The fact that we wanted to schedule this a couple times per day and that we were managing this through our 0365 AD bumped us from the free to the paid license. We had a handful of users requiring access and plenty of licenses available so this was a decent option for us. If you have a different need there are other options, we can consider for staying on the free option.


Manage Your Solution

From there my colleague could interact with the report by logging into


After my colleague was happy with the presentation of the data and a few more cleanup steps, I was able to setup the data refresh of the data set in Power BI. We already had a Power BI Enterprise Gateway installed on our SQL Server for another solution, so including my data set in the refresh was very simple with just a few clicks.

Now that our solution was deployed, our data stewards have logged in and subscribed to the dashboards. Every morning they get an email with a snapshot of the dashboard and a link to access the dashboard where they get direct access to the records in Dynamics or Salesforce so they can easily update those with missing data.

In summary, the Power BI platform is a great set of tools that are easy to learn. There is quite a bit of information available through various internet communities, so getting started is easy. As shown here, from idea to solution was less than one day for a very simple deliverable. The toolset can extend into much larger solutions as needed, so please give us a call and let us help you take the next step in your analytics journey within your CRM applications.

In our next Power BI post, we will discuss in more detail the step of getting your data and how to decide on Data Import Vs Direct Query.

Topics: Analytics CRM Best Practices CRM for Professional Services Microsoft Dynamics 365 Salesforce

App Innovators - Are you ready for Summer '17?

Today's blog post was written by Nathen Drees, Senior Developer at Sonoma Partners.

Recently, Salesforce sent emails to all administrators informing them of a change to the Content Security Policy that will affect Lightning Components. The intent was to give administrators and App Innovator partners time to review their components to ensure they meet all the best practices and do not run afoul of the newly enforced settings. Once the Summer '17 release is live, a critical update named “Lightning LockerService Security” will be force enabled, and any Lightning Components not meeting the new requirements may cease to function properly.

Not sure what Content Security Policies or the Lightning LockerService are? Need some help reviewing your components to ensure they’re compliant? Just want to talk to a human being? Contact us and we can help.

The body of the notice has been reposted below for your convenience:

As an admin for a Salesforce org using Lightning components, we want to notify you of an update to LockerService, that will impact your custom Lightning components with the Summer ’17 release.

What is LockerService?
LockerService enhances security by isolating individual Lightning components in their containers. LockerService also promotes best practices that improve the supportability of your code by only allowing access to supported APIs and eliminating access to non-published framework internals. For more information, see the Lightning Components Developer Guide.

What is the update?
LockerService will be automatically activated for all orgs in the Summer ‘17 release. In the Spring '17 release, the existing LockerService critical update will enhance security by enforcing Content Security Policy (CSP) to eliminate the possibility of cross-site scripting attacks by disallowing the unsafe-inline and unsafe-eval keywords for inline scripts (script-src).

What action do I need to take?
If you’d like to apply LockerService to your sandbox or Developer Edition org before the Summer ‘17 release, activate the LockerService critical update. Before the Summer ’17 release, you can manually activate and deactivate the update as often as you need to evaluate the impact on your org. To deactivate the critical update, from Setup, click Critical Updates, and click Deactivate on the critical update labeled "Enable Lightning LockerService Security."

What do we recommend?
We recommend that you test the CSP enhanced LockerService after the Spring ‘17 release in a sandbox or Developer Edition org to verify the correct behavior of your components before activating it in your production org. Before the Summer ’17 release, you can manually activate and deactivate the update as often as you need to evaluate the impact on your org. LockerService will continue to be a critical update for Spring '17.

- Internet Explorer 11 doesn’t support CSP, so we recommend using other supported browsers for enhanced security.

- When LockerService is activated in sandbox or Developer Edition orgs, you can't edit rich-text fields, and the fields are grayed out. This limitation will be removed when LockerService is auto-enabled for all orgs during the Summer ’17 release.

Where can I find additional information?

For more information, see the LockerService Overview video and the Lightning Components Developer Guide. Also, review Supported Browsers for Lightning Experience and the Lightning Discussion Forums are also a great place to get help from Salesforce and developer community experts.

For additional questions, open a case with Support via the Help & Training portal.

Is your CRM

Topics: Salesforce

Displaying External Data Using Salesforce Connect

Today's blog post was written by Kyle Dreyer, Principal Architect at Sonoma Partners.

Today we’re going to discuss a feature in Salesforce that we find is drastically underutilized. Salesforce Connect (formerly Lightning Connect) is a feature within Salesforce that allows companies to display external data without having to build a robust, complicated integration. Additionally, the data isn’t technically stored in Salesforce and therefore does not count against your data storage! The evolution of Salesforce Connect now allows the data to be editable (if desired) in Salesforce and can also be reported on. Let’s walk through how to set up the connection:

1. The first step is that the data from the external system needs to be available via an OData (V2 or V4) endpoint. You can also connect to a different Salesforce Org if desired. Note that this endpoint needs to be publicly available to the Salesforce servers.

In this scenario, I am using an endpoint that is located here.

Running a GET in a REST utility shows the following data:


After configuring the External data source, we will have external objects for People, Photos, Airlines, and Airports.

2. Go to Setup -> Develop -> External Data Sources. Click New External Data Source.

3. Populate the appropriate fields. In this example, I configured the information as follows:

Dreyer 2

There are a couple important things to note here:

  1. If enabled, there is an option called “Writable External Objects.” Selecting this is required if you wish to allow the data to be editable in Salesforce. Note that the OData service must allow data to be updated through it.
  2. Authentication – In this example, the service is “wide open,” so no authentication is available; however, Salesforce Connect allows for Anonymous, Per User, and Named Principal authentication mechanisms.

4. Click Save! You have now finished configuring your external data source.

5. After Saving, the option to “Validate and Sync” will appear. This will allow you to select which external objects to create.

Dreyer 3

6. After selecting the object(s) you want to create, click “Sync.”

7. You will now notice that you have several External Objects in your org.

Dreyer 4

8. Unfortunately, these objects are not automatically Deployed, and they are not currently available for reports. In order to fix this, you must click into each one and change the settings as shown below.

Dreyer 5

9. After this step, you may choose to create a Tab for the object(s). Once that is complete, you can start viewing the data!

10. Let’s take a look at our Airlines data from the service.

Dreyer 6

You’ll notice that this is the same data returned by the OData service.

Dreyer 7

Displaying this data is useful (and in some cases may be all that is required), but what if we want to manage the data in our back-end systems through Salesforce? Can we create a new Airline or update an existing one? Since we allowed our External Data Source to be Writable, we can absolutely do that. Let’s start by creating a new airline, called “Sonoma Airlines.”

1. Click “New” on the Airline page and input the data.

Dreyer 8

2. Clicking Save saves the record, but let’s make sure that we can view it directly through the service. I created another GET call to see if we can find this airline.

Dreyer 9

You can see that the airline has been created in the back-end system. The same concept would apply to update the data as well.

Now that you have (hopefully!) seen the value of Salesforce Connect, it would be prudent to consider whether this is a valid option for future integrations within your Salesforce org. It is very simple to configure (this demo took about 15 min) and has relatively robust features. And of course, if you need any more information or have any questions, never hesitate to contact us.

Is your CRM

Topics: Salesforce

Admin Toolkit: Advanced Process Automation with Visual Workflows

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

This blog post is written for the advanced admins out there. Ever asked to automate a process that is too complex to achieve with workflow rules or Process Builder, but you don't know Apex and you don't have a developer to help create an Apex Trigger. Try Visual Workflow!

Visual Workflow is an admin tool that is most commonly used for call scripting, but can also be used to complete more complex process automations with clicks, not code.

If you are starting to experiment with Visual Workflow, here are a few things to keep in mind:

  • Salesforce has published a Visual Workflow Guide that is a great reference and includes a few other examples.
  • If your use case requires you to automatically create Orders from Opportunities - great news! Salesforce provides some Flow templates to get you started. Check them out here.
  • Flows are subject to Salesforce governor limits, so if you expect this flow to run in bulk transactions (e.g. integrations or Data Loader updates), you may run into errors (Apex Triggers will need to be used in these cases).

To show you how you can use Visual Workflows to achieve some more complex process automations, I'll show you an example for a common use case I've heard from clients.

Use Case: Automatically creating renewal opportunities when an Opportunity is marked as Closed Won. The renewal Opportunity should be an exact clone of the original Opportunity including products, except the Close Date should be pushed 1 year out and the Stage should be reset to "Qualification." Below is a guide on how to set up this process automation.

1. Create Visual Workflow to create a renewal Opportunity. When you save this Flow,
make sure that you indicate that it is an Autolaunched Flow, so that you can trigger it from a Process Builder Flow (details in step #2). After saving the Flow, also make sure to activate the most recent version.

Pfeiffer 1

a. Create a Fast Lookup (see details below) to pull back the Opportunity details for the closed Opportunity. NOTE: This element should be set as the Start Element for the Flow.

Pfeiffer 2

i. Create a new Variable to store the Opportunity Id of the Closed Won Opportunity. NOTE: This variable will be passed into this Flow, so it will need to be set as an Input variable.

Pfeiffer 3

ii. Create a new sObject to store the Opportunity details.

Pfeiffer 4

b. Create a Fast Lookup (see details below) to pull back the Opportunity Line Item details for the given Opportunity.

Pfeiffer 5

i. Create a new sObject Collection Variable to store all of Opportunity Line Items from the closed Opportunity.

Pfeiffer 6

c. Create a new Assignment element to update the sOpportunity sObject with any of the values you'd like to update on the Renewal Opportunity (see example below) Opportunity with Renewal Values.

Pfeiffer 7

i. Create a new Formula to update the Opportunity Name to append "RENEWAL" to the end of it.

Pfeiffer 8

ii. Create a new Formula to update the Close Date to push it out 1 year.

Pfeiffer 9

d. Create a Fast Create to create the Opportunity using the values in the sOpportunity variable.

Pfeiffer 10

e. Loop through each line item in the cOpportunityLineItems collection variable.

Pfeiffer 11

i. Create a new sObject variable to store the current Opportunity Line Item in the collection variable.

Pfeiffer 12

f. Create a new Assignment element to update the sOpportunityLineItem sObject with the Opportunity Id of the Renewal Opportunity. NOTE: The Id of sOpportunity will be set with the Id of the newly created Opportunity in Step d.

Pfeiffer 13

g. Create an new Assignment element to add the sOpportunityLineItem to a new sObject Collection Variable. You will use this new collection variable to create the renewal Opportunity Line Items.

Pfeiffer 14

i. Create a new sObject Collection Variable to store the updated sOpportunityLineItem's.

Pfeiffer 15

h. Create a Fast Create element to create the Opportunity Line Items using the values in the cRenewalOpportunityLineItems collection variable.

Pfeiffer 16

2. Create a Process Builder Flow to automatically launch the Visual Workflow you just created. When you configure the Flow action, make sure that you are mapping the Opportunity Id to the vOpportunity variable in the Flow.

Pfeiffer 17

3. Voila! You're done! Make sure the Process Builder is activated and test that it's working as you expect. This is just a simple example, but you can use these principles for automating your business processes. Happy customizing!

Is your CRM

Topics: Salesforce

Predictive Vision Service - Step by Step

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

Part 1: Creating and Using a Model

Salesforce recently rolled out a really cool feature for its new Einstein AI platform: Predictive Vision.

The Predictive Vision service allows users to upload pictures to a pre-trained model, and the model returns its best guess (plus a few other probable options) of what is in the picture.

The application of this service maybe isn’t immediately obvious, so let’s imagine you’re a mechanic and you have your own repair shop. Actually - let’s imagine you’re a starship mechanic. That’s more fun. Your clients are sending you pictures of their busted up ships; they want you to send them repair estimates, and – being starship pilots – they want them fast!

Ship's Broke...

Ship's Broke...

The galaxy is a big place, filled with lots of different starships, so you can lose a lot of time figuring out which ship you’re looking at. Predictive Vision to the rescue! Using Salesforce’s API, we can build a robust model of all of the different types of ships that you work on. Then, when a customer wants an estimate faster than the speed of light, all you need to do is run their picture through your model, and you quickly know what kind of ship you’re working with. Since you already have a Salesforce platform complete with replacement part prices, cost of labor estimates, and everything else that goes into your business, we can build a slick tool to tie it all together – but that will have to wait for another blog post. For now, let’s get up and running with Predictive Vision.

Let’s Get Started

It’s easy to sign up for the Predictive Vision service and hook it up to your Salesforce org. The documentation provides excellent step-by-step instructions for creating a certificate from your Salesforce org, downloading the certificate, and then using it to create a new account, so we won’t go over it in depth here. There are also code repositories provided by Salesforce that allow you to quickly create a basic Visualforce page that utilizes an already created image classifier in your Salesforce org.  All you have to do is clone the code repositories, copy the code into your org, and then follow the instructions provided to get the Visualforce page set up.

Now that we’ve got our very own account and it’s hooked up to our Salesforce org, we can try out the Predictive Vision service using the default image classifier. Since we need it to identify space ships, let’s see how the default classifier does…

It IS a Space Shuttle. Not Bad!

It IS a Space Shuttle. Not Bad!

The model is 99.9975% sure that this is a picture of a space shuttle. Pretty cool! Maybe we can use the default model and be done with this project right now! Let’s test it with the picture of our customer’s broken ship first.

Definitely Not a Can Opener

Definitely Not a Can Opener

Syringe… nope. Can opener… nope. Slide rule… nope. Space shuttle? Eh. Close, but still not what we need.

The image classifications are only as good as the model we use (and the model is only as good as the data we give it – more on that later). The default model is pretty impressive, but we’ll get much better results if we have a model specifically tuned to the kinds of images we want to classify. So, let’s see how to create a Model of our own.

Create a Dataset

To create a brand new model, we now have to leave the Salesforce org and work directly with our account. has a pretty simple REST API that allows you to create new datasets, add labels, upload photos, create models, and classify new images using the models you create. Their documentation shows what the REST calls look like if you’re using cURL to communicate with, but they’re pretty easy to translate into whatever language or tool you’re most comfortable with. There has been some talk from Salesforce that they will be releasing wrapper functions for Java, Node.js, and other languages in the future. For now, though, we have to make our own.

The first thing to think about when you’re working with the API is how you’re going to get an authorization token. There is a shell script available here which will generate a token for you. It’s designed to run in a Linux or Mac environment, but we were able to get it working in Windows with a little bit of editing.

The easiest solution, however, might be to simply load the sample Visualforce page that Salesforce provides us. They went through the trouble to write an Apex class that gets an access token, so we might as well use it! Remember when we tested the general model? Right below the image, there’s a field called “Access Token.” We can simply load that page and copy the token. It’s valid for one hour and if it expires, we can just reload the page to get a new one.

Sample Visualforce Page with an Access Token

Sample Visualforce Page with an Access Token

Here’s an example of a wrapper function we wrote using Node.js and its request library to create a new Dataset:

Mike sherry 5

To call the function, we just give it a name for the dataset and a list of the labels we want. In our case, the dataset will be called “Starships,” and we’ll give a label for each of the different models of starship we repair at our shop.

Mike sherry 6

The API call returns a JSON object with a dataset id and a list of all of the labels in the dataset, as well as ids for each label. Keep this information around, because we’re going to need it later.

Add Some Images to the Dataset

Now that we have a dataset, we need some sample images to help our model know what it’s looking for. Salesforce recommends providing at least 1000 images per labels, and they also recommend ensuring that each label has roughly the same number of pictures.

For this example, we used about 30 pictures per label and it gives pretty good predictions, so your results may vary if you’re using more or less labels and what sort of images you’re using as input.

To add an image to a dataset’s label, use the “Create an Example” endpoint. You’ll need to convert the image on your hard drive into a file stream. In the Node.js example below, we used the fs library to do the conversion. You’ll also need to pass in the model and label id so that knows where to put the image. You can send a request to the “Get a Dataset” or “Get All Datasets” endpoints if you forgot the dataset/label ids.

Mike sherry 7

Once you upload an image, it can take a few minutes for your to process it and have it ready to do more work (training, returning information about your model). You’ll know it’s ready when you can hit the “Get an Example” endpoint and it returns information instead of an error message. If you get an error, give it a few minutes and try again.

Train the Model

Once you’ve created a dataset and loaded all the images, training a model is easy! All you have to do is make a REST call to the “Train a Dataset” endpoint. Again, you can use cURL or write wrapper functions in your language of choice. You just need to provide a name for the new model and the id for the Dataset the Model will be generated from.

The service returns a JSON object with some information about how the model is being trained, the dataset its using, its current status (it can take a long time to create a model if there are a lot of pictures in your dataset), and most importantly, the model id. To see if the model is ready, send a request to the Get Training Status endpoint.  When it’s ready, you can get some information about your Model’s accuracy by sending a request to the Get Model Metrics endpoint.

Once the Model is ready, you can copy the Model id back into your Salesforce Apex logic and classify images using the new Model!

Let’s Try It Out!

To use the new model, we’ll go back into our Salesforce org and pull up the controller class for the sample Visualforce page we made. Then in the getCallVisionUrl() method, we’ll change the final line so that it passes in our new Model’s id instead of "GeneralImageClassifier" and a URL to the image we’re trying to classify. It will look something like this:

return Vision.predictUrl('http://myimageurl.jpg',access_token, 'myModelId');

Nailed It!

Nailed It!

Our new model is 99.174% sure this is a picture of an X-Wing. With this information, we can now build out a more useful page that populates a service form with potential replacement parts, reputable part vendors, cost estimates, and all sorts of other information we already have in our Salesforce org. We’ve already learned a lot about predictive vision in this post, though, so the full integration of Predictive Vision with our estimate app will have to wait for another post.

NEXT TIME: Integrating into Lightning Components

Topics: Salesforce

Looking for Our Pot of Gold with Spring '17

Today's blog post was written by Troy Oliveira, Principal Developer at Sonoma Partners.

If you’ve logged into a Salesforce sandbox in the last couple of days, you may have noticed that things are a little sunnier than they were last week.

That’s because Salesforce updated sandboxes to the Spring ’17 release over the weekend.

As we’ve come to expect over the last few releases, a big theme in Spring ’17 is LIGHTNING, LIGHTNING and more LIGHTNING. Apparently after all of that lightning has cleared up, you’re left with a fun, animated rainbow. Does this mean that there isn’t anything of value for Classic customers? Hardly, but it does continue the pattern of Salesforce focusing a great deal of their efforts in making Lightning the future of the platform.

Troy o 1

Service Cloud, Struck by Lightning

The big ticket item in Spring ’17 has got to be the Beta release of Service Cloud Lightning. Salesforce has completely overhauled the Service Console that we all know and love from Classic and turned it into the Salesforce Console for Service.

Troy o 2

This marks the last major cloud to move into the Lightning Experience and has led to some pretty fun innovations under the covers that benefit the entire platform.

Knowledge has been completely re-imagined for Service Cloud Lightning and as a result, this is a place where moving from Classic to Lightning will require some additional configuration and migration of data.

Other key takeaways for the Service Cloud Lighting also include Live Agent, an iOS App for Field Service Lightning and a more streamlined setup experience (We'll post more on these features soon!).

Making Lightning Yours

As Lightning has grown in feature parity, Salesforce has started to put a great deal of effort into making the interface configurable to and allowing more flexibility for granular control of the look and feel.

A big step forward in Spring ’17 is the ability to create Lightning Pages that can be scoped to Profiles or Record Types. This was a heavily used feature in Classic page layouts, but now extends even further by allowing for even more customization beyond just the “Details” that are shown.

Paths and Kanban

In the initial roll-out of Lightning, Salesforce provided a Kanban view of Opportunities. This provided a great way to be able to see (and make changes to) Opportunity records based on what stage they were assigned to. In Winter ’17, this was expanded to include Leads as well.

Now, the same abilities have been extended to Quotes and Custom Objects. Add your own custom Paths, and you can have a custom Kanban view of your Custom Object. This will provide you with the same ability to track stages and milestones for your custom objects as already existed for Leads and Opportunities.

These are my favorite things!

Finally, I come to what is probably one of my favorite new tidbits that has been thrown in with Spring ’17 but isn’t getting much buzz: the ability to mark records and views as “favorites” in Lightning. Much in the same what the bookmarks help make your web browsing experience more targeted, Favorites will keep you from stumbling through Salesforce looking for that exact right view of what you need to see. Simply click the  button in the global actions portion of the page to mark “favorite” it. And voila, you have a quick link back to the page that you can get to from anywhere. Switching between apps? It doesn’t matter; the favorite keeps tabs of what app you were in when you clicked it.

Troy o 3

Don’t just take my word for it.

Obviously these are just some of the highlights that I’ve found to be particularly exciting. For more information about the Spring ’17 release check out the Release Notes or the Salesforce Releases YouTube Channel for more.

If you have any questions on how Spring ’17 will affect you or would like some help getting started, please Contact Us. We’d love to hear from you!

Topics: Salesforce

Is Your CRM (Einstein) Smart?

Today's guest blogger is Aaron Robinson, an Engagement Manager with Sonoma Partners.

As the year comes to a close, Salesforce is wrapping up their New York World Tour - one of many for the coming year.

Even if you only watched with one eye open, you probably picked up on the common theme driving the conversation around the Salesforce platform – artificial intelligence, or AI for short.

While most people's personal experience with AI is probably summed up in the decades of sci-fi movies, it has inched its way into the consumer world of apps we use everyday. I would be willing to bet most people don’t even recognize AI in action when they see it, which is partly the beauty of having intelligent applications. Ever wonder how Netflix knows which movies to recommend for you or how Pandora can play hours of music you will enjoy without you having to select each individual song? These types of algorithms and the predictive power amassed by AI drives these types of little life improvements. Its the tip of the iceberg in terms of what we will see in the future, and if you want a little taste of how life changing this can be, take a ride in a self-driving Tesla.

AI for the (Business User) Masses

Einstein 1One of the great things that Salesforce is known for is marketing, and they do marketing on their own products about as well as anyone. AI has been taking shape in the technology world in many different forms because it’s such a broad topic – natural language processing, activity recognition, bots, machine learning, and sentiment analysis. There are many more, but Salesforce wishes to embody the spirit of their brand of AI into something easily recognizable and understood by anyone who encounters it. And what better way than to identify with one of the most revered human minds that ever existed: Albert Einstein. Also in traditional Salesforce style, they have created a cute and crazy haired little persona for their branded technology.

Salesforce Einstein is branded as “the first comprehensive AI for CRM.” Salesforce has integrated artificial intelligence technologies into the underlying platform to make their Customer Success Platform smarter and more importantly, usable by the average business user without the need for significant training. Salesforce states their differentiation in the marketplace in three key pillars:

  • Data-ready — You don’t have to do data preparation or manage models. Just put the data in Salesforce, and it works.
  • Modeling-ready — Multi-tenant, automated machine learning means the right model automatically fits to your organization.
  • Production-ready — No DevOps needed. It’s part of the same trusted Salesforce platform, with model management and monitoring tools.

All of the available clouds offered by Salesforce can take advantage of Einstein as its built into the platform layer of the application, shown in the graphic below. Einstein encompasses those forms of AI which I mentioned previously such as predictive analytics, machine and deep learning as well as natural language processing.

Einstein 2

The Smarts in Action

During the various cloud keynotes, Einstein was shown in action, driving analysis and serving up logical next steps to help improve various outcomes.

Sales Cloud Smarts

The Einstein conversation around sales focuses around leads and opportunities and how we can identify and develop the customers who have not only just raised their hands, but performed actions to tell you they are serious about your product or service. Depending on the industry, market, regulation, or service, selling always comes with its unique set of challenges. But what if your CRM platform could help evaluate how your sales team should be spending their time, recommend best next steps, and even facilitate automated follow-up? Ultimately, this would help focus their time to managing relationships and providing true engagement before, during, and after the sale.

Einstein 3

For the Sales Cloud user, the goal is to help your reps sell smarter with the help of Einstein. Salesforce starts you on the process with two key features: Predictive Lead Scoring and Opportunity Insights. For the inside sales team, predictive lead scoring ranks their leads in Salesforce using the attribute data. The insights pane on the lead will not only show a score but also the factors from the lead record that influenced the score, including lead data and activity performed by the individual tied to the lead. Assuming you’re using some related Salesforce marketing technology, you can even view a history of the engagement with the individual, including website visits, meeting acceptance, and from completion. This allows the rep to have a more intelligent and engaged conversation around your product or service.

Service Cloud Smarts

Providing great service isn’t just about solving a case quickly, but in the consumers’ eyes a connected and “conversational” approach to service. As a consumer with a basis towards the use of CRM systems, I’m totally befuddled by my interactions today with service reps, and the experience leaves me feeling like they know nothing about me. Not only does Salesforce help to bridge that gap, but they are using Einstein to serve up relevant information to the agent at the time of service to make that interaction personal and engaging.

To do this, Salesforce is enabling some new functionality, such as engaging customer through SMS text messaging, chat through Facebook messenger, and enabling Service Cloud bots. These features will help to drive quicker connection for service. But the real power comes through in how Einstein can help improve the customer interaction.

Einstein 4

Take this scenario, talked about during the Service Cloud key and a real frustration of mine when I call for service. Imagine chatting with an agent for support, only for them to ask if you mind being put on hold while they do a bit of research. And often that first hold isn’t enough, but they will come back and ask repeatedly for you to hold. With help from Einstein, agents can get recommendations based on the information they have collected, to help guide the experience in real-time, versus having to make the customer wait while the agent searches for a solution. And as cases get resolved, the system only gets more intelligent using the actions performed to solve the case to better predict how to solve similar cases in the future.

Marketing Cloud Smarts

Now why should sales and service get all the cool tools? Well, in Salesforce they don’t. Marketing is also served up a healthy dose of IQ points to make their engagement more effective. Consider a few of the following use cases conveyed during the Einstein Keynote...

Marketers can utilize the Journey Builder to build smart journeys that are individualized by the specific customer’s preferences. One such feature is the Smart Split which determines what are the best channels to reach a customer based on their preferences. Einstein will analyze the activity for a given customer to determine which channel is most likely to illicit a response – for customer A this may be email, while for customer B is might be text, and customer C is a Facebook ad. When a customer reaches this step in the journey, Salesforce will use the appropriate channel for that targeted communication. A similar intelligent path is based on time – when is the most optimal time to send the message to a customer. Using a time-optimized step in the flow, the message can be sent at the optimal time for the particular consumer. And this is just the beginning, so check out the keynote in full to see other options for features like predictive vision services (in beta) for product recommendations.

The Future is Here

At first blush, this is very compelling. It can be applied to such a wide range of challenges for different industries and business models. The part to keep in mind is that while it seems tempting to just jump in head first, it’s important to look at your business and where there are processes that can be improved with the use of AI. Also, there are distinct use cases where Einstein makes sense today, so it’s important to make sure your use cases match those. In the upcoming releases for 2017, we’ll look for improvements to Einstein and how that can be leveraged even further.

If you’re interested to learn more, head over to the Salesforce’s Trailhead and search for Einstein. If you’re curious how Salesforce Einstein can potentially help improve your business, we’d be happy to talk to you as well. 

Three Steps to CRM Success

Topics: Salesforce

Integrating MDR education and school data with your deployment

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

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

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

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

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

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

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


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

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



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


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

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

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

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

Topics: Microsoft Dynamics 365 Microsoft Dynamics CRM Salesforce