Sonoma Partners Microsoft CRM and Salesforce Blog

Announcing Sonoma Partners Editable Grid for Dynamics CRM 2011

A common request that we hear from our Microsoft Dynamics CRM clients is the ability to quickly edit records directly in the grid, without having to open up each record one at a time to make updates.  The great news is that now you can!

Sonoma Partners is pleased to announce the latest and greatest FREE solution available for download.  You heard that correct.  This solution is absolutely free and just takes a couple minutes to install.  The Sonoma Partners Editable Grid for Dynamics CRM 2011 can be downloaded from the our download page.  This is available for both CRM Online and CRM OnPrem versions of CRM 2011.

The editable grid solution works with the Lead, Contact, Account, Opportunity, and Case entities out of the box.  You can also enable the solution to work with custom entities.  Those instructions are detailed on the help documentation for the editable grid solution.

As mentioned above, after downloading the solution, the installation is very simple.  Just import the solution using CRM’s native import process and you’re done.  After that you’ll notice an Edit Records button in the ribbon of those entities listed above.


Clicking on this button will open up a new window (or tab) that has the editable grid in it.  The editable grid that appears will have all the views that are available for that entity (System and Personal) so you can filter between records to edit.  The view and data that appear by default is the view and data that was appearing in CRM’s native grid when you clicked the Edit Records button.



After selecting your view to work with, you can update any field that’s editable within CRM.  System fields (such as Contact Full Name, Created On, Modified By, etc.) are not editable.  Fields that are read only on forms aren’t automatically read only in the editable grids as CRM 2011 allows multiple forms.  However, you can even configure additional columns to be read only by using the Editable Grid Settings entity.  You’ll need to create one record in this entity per entity that you want to include additional read only fields.  Simply enter in the schema name of the entity, and a comma delimited list of field schema names that you want to make read only.


Functionality that’s included with the Sonoma Partners editable grid:

  • You can update any field that’s editable (taking in mind the detail in the section above).  Changes aren’t saved until you click one of the save buttons.
  • You can save the changes and stay on the editable grid, or save and close the editable grid window.
  • Any unsaved changes you also have the chance to undo with the Cancel Changes button.
  • You can open the records in the native CRM form by clicking the magnifying glass on the far of the grid.
  • You can create a new record.  This assumes that the view you’re using has all required fields included in it.
  • You can change the view using the view selector.
  • You can also filter the data more using the down arrow on each column.  This is the same filtering that CRM makes available in the native grids.

Grab your FREE copy of the Sonoma Partners Editable Grid from our download page and enjoy!

Topics: Microsoft Dynamics CRM

CRM SDK v5.0.14 Has Been Released!

The CRM SDK v5.0.14 was released yesterday and it includes a new utility as well as some insight into the upcoming Yammer integration.

Solution Down-level Utility

The solution Down-level utility is a brand new tool that has been released in this latest version of the SDK.  According to the SDK article:

The Solution Down-level utility is a command-line executable program that exports a managed or unmanaged solution without any dependencies introduced by Update Rollup 12 or the December 2012 Service Update. The exported solution will be compatible with organizations that have installed Microsoft Dynamics CRM 2011 Update Rollup 6.

This utility can only be used with an organization that has Update Rollup 12 or the December 2012 Service Update installed.

The SDK states that this utility should be used whenever you are distributing a solution from an Organization that contains UR 12 or the December 2012 Service Update.  The SDK also notes that even if your solution excludes UR 12 and December 2012 Service Update dependent components, you should still use the utility to export the solution as the native solution export may still include some dependencies.

It is best practice to develop your solution using the same version as the environment that it is being released to in order to mimic the environment that it will be used on.  In that scenario then this utility will not be necessary as you will be exporting/importing into the same environment version.  That being said, with UR 12 solutions that will be distributed to multiple environments of different type, this solution will be necessary for export.

Yammer Integration

The SDK also contains some exciting new information about the Yammer integration.  Yammer is a very powerful tool allowing your internal CRM users to interact with external clients, partners, etc. via the Yammer website.

The article titled “Connect to Yammer” talks about the ability to use Yammer in your CRM Online organization.  It states that before you set up a connection to Yammer, you must first create a paid Yammer enterprise account for your organization ($3 per user).  Each user must also have a valid Yammer account.

New CRM Online Resource Center articles are referenced in the SDK article as well:

Topics: Microsoft Dynamics CRM

Announcing Sonoma Partners’ CRM 2011 Token Engine Library

Today we are excited to announce the release of Token Engine!  Token Engine is a C# library that allows developers to replace tokens in text by using attributes from CRM records or constant data.  This is similar to how native email templates work in CRM but for custom code. 

There are several advantages to using this library.  It can be used to help generate custom email messages, word documents, or any other text that needs to contain dynamic content from records in CRM.  Token Engine can also easily resolve related attributes.  For example, you could display the name of a contact’s parent customer or even related attributes from the parent customer itself. 

Along with resolving tokens using CRM data, Token Engine can also resolve constant tokens.  For example, you could setup a token in your content called “currentdate” and replace it with the current date time or even replace tokens with calculated data. 

With a few lines of code, you can turn this:


[$contact.address1_city$], [$contact.address1_stateorprovince$] [$contact.address1_postalcode$]

Dear [$contact.fullname$]

Thank you for your interest in [$$].



January 31st, 2013

John Smith
555 Main Street
Chicago, IL 60661

Dear John Smith

Thank you for your interest in Amazing Widgets.

Blake Scarlavai

If constant tokens and CRM based tokens aren't enough for you, then the Token Engine base logic can be extended using custom code to dictate how your custom tokens should be formed as well as the logic to resolve them.

Grab your copy of Token Engine from the Download Page, compliments of Sonoma Partners!

Note:  Token Engine only supports CRM 2011 and CRM Online.  It does not support CRM 4.0.

Topics: Microsoft Dynamics CRM

CRM Mobility Options Demystified

Today’s guest blogger is Jacob Cynamon-Murphy, a Sales Engineer at Sonoma Partners.

I have had the pleasure of delivering a presentation entitled CRM Mobility Options Demystified to several audiences across the United States. Although I continue to get requests to deliver the session in person, I thought I would also share the highlights in a blog post for our readers.

While it is no secret that there are a variety of mobile solutions in the market to support your field sales and service teams, there has not been a lot of solid objective knowledge shared about the pros and cons of each solution and how best to choose the solution(s) that are right for your employees. The following blog post outlines the three main option tiers – browser-based, commercial off-the-shelf (COTS), and custom mobile – as well as the differentiators for each tier that can help you make the best decision for your team.


Brower-Based Mobile


Microsoft Dynamics CRM 2011 conveniently comes with a free web-based mobile client that runs in the browser of virtually every mobile platform on the market today. Ideally suited as a quick reference to pull up data from your CRM system while in the field, it can be cumbersome to use for creating or editing substantial amounts of data.

  • Free!!!
  • Point-and-click configuration that leverages your existing system setup
  • Nothing to deploy
  • Universally accessible (HTML4+)
  • Good for quick, read-only use
  • Very simplistic - not specific to your needs
  • Difficult to use on most devices
  • Challenging for data entry
  • No enhancements on roadmap
  • No system access (camera, GPS, multi-touch, address book, etc.)


Commercial Off-the-Shelf (COTS) Native Apps

There are a variety of vendors offering off-the-shelf mobile solutions on all major platforms. However, two vendors stand out from the rest as the most innovative, broadly-available solutions – CWR Mobility and Resco. For this category, I’m providing a list of the pros and cons of the COTS category broadly, which covers both vendors; reach out to me directly if you want guidance on the trade-offs between the CWR Mobile and Resco MobileCRM apps.

  • Extensible
  • Quick to deploy via app stores
  • Offline-capable
  • Access to system features
  • Supports all major mobile platforms
  • Not specific to your needs w/o code
  • Per-user license fees add up
  • Dependent on a 3rd party to update
  • Need to deploy app and updates
  • Server components to maintain (CWR)


Custom-Tailored Mobile Apps 


Sonoma Partners has an enterprise mobility practice and I have been an active contributor to sales and marketing efforts in this space; as a result, I’ve gathered a lot of feedback and expertise around the advantages and disadvantages of custom-tailored app development. In full disclosure, I don’t always advise custom mobile; from my experience, for many scenarios COTS or Mobile Express is a perfectly suitable option based on customer needs, but when custom mobile makes sense, it’s hands-down the best choice.

  • Personalized to your business/users
  • Offline-capable
  • Able to access system features
  • Able to extend app beyond CRM
  • Targeted to the platform(s) you use
  • Can change with your business
  • Longest to implement
  • Need to deploy app and updates
  • Additional effort/cost for multiple platforms
  • Cost-prohibitive for small user bases


In closing, if your road warriors are clamoring for a mobile CRM solution, you have plenty of choice. By spending time to gather feedback about their needs and comparing it to the lists above, you can determine the optimal solution for them to be most effective. If you have any questions along the way or need help as you explore mobility options for your team, feel free to reach out to me – jcynamon AT sonomapartners DOT com – for mobile strategy guidance.

Topics: Microsoft Dynamics CRM

Our Story: Synchronizing the Sonoma and MSCRM Dynamics Environments

Today’s guest blogger is Mike Welburn, a Senior Developer at Sonoma Partners.

As a partner of both and Microsoft, we have separate sales teams handling each product using their respective CRM tools, and Microsoft Dynamics CRM. Unfortunately, this leads to having two "systems of record" in terms of customer base, sales pipeline/history, and contact management. 

In the past, our teams have had to manually re-create records in Dynamics CRM, which robbed them of valuable time. To remedy this, we built an in-house solution to synchronize our CRM data into a single system of record, which we chose to be Dynamics CRM for a couple reasons. We have done some robust customizations to our internal system over the last few years to really make our process flow fit our business, and we also use it as the focal point of our internal project management and time tracking. Instead of rebuilding any of these pieces out again in, it made the most sense to leverage our existing work and push our projects into Dynamics CRM when we needed to start taking advantage of our other solutions.

Here are the steps we took to complete this sync:

Confirmed Business Requirements

The key objects/entities to sync were Accounts, Contacts, and Opportunities.  We determined that we wanted this to occur automatically (versus with user intervention like a button) on create and edit of records.

Mapped / Normalized fields

To start, we had to try to normalize the fields between Account, Opportunity, and Contact objects within and Dynamics CRM. While some of the fields overlapped, we had a number of custom fields that either had subsets of picklist values from the other system or fields that only existed in one system. The effort of creating a field mapping document usually proves to be a painful one, however we were able to cut down a lot of time by leveraging Metablast to generate our Dynamics CRM entity schema data instead of manually looking each entity up. Once we had that, we were able to compare it to the fields and finalize our desired mappings.  Some specific Dynamics / gotchas are:

  • picklists are multi-select whereas Dynamics CRM are single select – we handled this by making the fields single select. Alternatively, we could have used N:N relationships on the Dynamics side.
  • leverages picklist values as having the label and value both being the same; Dynamics CRM allows you to have an integer value back a pretty label. Due to this, any picklist value coming from needs to be converted into the respective integer representation from Dynamics CRM via code prior to attempting to save the new records in the target system.

Leveraged REST API

Once we identified the fields in Dynamics CRM, we were able to take advantage of a previous internal project that exposed an easy to use REST API that allowed creating and updating fields. With a little modification, we ended up with endpoints for Accounts, Contacts and Opportunities.

Persisted Relationships

Each of these endpoints accepted an array of JSON objects, which consisted of key/value pairs for each field. Because we only sync these records at a certain time, we needed to ensure that the relationship between an Account and its Contacts and Opportunities are persisted when they get sync'd for the first time. To do this, we added some additional logic that would allow child records for Opportunities and Contacts of the Account to be passed along within the Account endpoint to ensure synchronous creation, since the Account needs to exist prior to the Contact or Opportunity being able to reference it. An example of how that looks is below:


     "accounts": [


               "name" : "Test Account",

               "fax" : "555-434-8898",                

               "Salesforce_ID" : "001E000000JOAXj",

               "contacts" : [


                         "firstName" : "Bob",

                         "lastName" : "Smith",

                         "Salesforce_ID" : "003G0000018UpQm"



                         "firstName" : "John",

                         "lastName" : "Doe",

                         "Salesforce_ID" : "003G0000017Bugo"



               "opportunities" : [


                         "name" : "Test Opportunity",

                         "estimatedValue" : 10000,

                         "Salesforce_ID" : "006G000000LqXQI"





By nesting these records, it allows us to ignore API dependencies the first time through because we can create the Account, and then follow up with the Contact and Opportunity, all from a single request. It also allowed us to do some custom logic when there was a Contact lookup field on the Account, as we were able to do a second pass updating the Account field once the Contact was saved to the system. This approach also made it easier on the side because we did not have to worry about ensuring our Accounts all got created first, then sending over the remainder of our items. It also allowed us to limit the number of outbound HTTP requests we made.

Set-up Triggers

Once this endpoint was up and running, we set up triggers in on the three objects.  Based on the business requirements mentioned above, we wanted this integration to be completely behind the scenes, and not affect the usability of the system at all for our users. This meant not slowing down their user experience when a synch was happening, or providing error messages to them about any sync failures.

To alleviate the first issue, we decided to push the HTTP requests into future methods. This meant that our sync would happen asynchronously after the records had been saved in, allowing the user to save their record prior to the request being fired. These future calls usually happen within a minute or two (if not immediately), so the delay that we have in exchange for usability is trivial. For the second issue, in order to ensure that all sync errors would continue to be captured without notifying the user, we set up an email service to message an administrator with any errors that occurred. This allowed them to debug behind the scenes and then update the sync later.

Built API Request

After setting up the criteria in which we wanted to sync the records for each, we created Apex class objects to represent the JSON that our custom Dynamics CRM API was expecting. This allowed us to take advantage of JSON serialization that provides, allowing us to query for all the fields we need on a record, populate an instance of a custom Apex class object, and then serialize that object in a JSON string for our request body. A less complex example of a single account is shown below:

public class CRMAccount


     public String name;

     public String fax;

     public String Salesforce_ID;


CRMAccount acct = new CRMAccount(); = "Test Account";

acct.fax = "555-434-8898";

acct.Salesforce_ID = "001E000000JOAXj";

String body = JSON.serialize(acct);

At this point, the body would look like the following, without needing to manually build the structure:


     "name" : "Test Account",

     "fax" : "555-434-8898",                

     "Salesforce_ID" : "001E000000JOAXj"


Handled API Responses

Once this request is built, we are able to send it to our API endpoint and receive a success or error response. Similar to building the request body, we can leverage JSON deserialization to turn the response body (also in JSON) into an Apex class object that we can easily reference, rather than having to manually parse it. Below is a simplified version of a single Account response:


     "accountId" : "d8d27735-ba9d-433b-aa5a-dcb0bb2b4a1d",

     "Salesforce_ID" : "001E000000JOAXj",

     "errorMessage" : ""


And this would be the simple way to parse that into an object you can immediately reference:

public class CRMResponse


     public String accountId;

     public String Salesforce_ID;

     public String errorMessage;


CRMResponse resp = (CRMResponse)JSON.deserialize(body, CRMResponse.class);

This simple response allows us to accomplish two of our goals:  

  • Upon successful record creation, save the Dynamics CRM ID into a custom field for reference in future field updates
  • If the record fails to save/update, send the administrator an email referencing the ID of the record in both and Dynamics CRM, as a reference to the error generated by Dynamics CRM. Depending on how well the mappings were set up previously, this could be something overlooked like character limits being exceeded on a text field.

Maintained System References 

In addition to the fields that we decided to keep in sync between the systems, we also captured the unique identifiers for the records. This allowed us to quickly make updates to fields by referencing the ID in the other system, and also allowed us to create URL fields in each system that allow the user to quickly get to the record in the other system. This has proved invaluable for power user of one system when they want to check the other system.

This particular integration was only a one-way sync, and to prevent changes to these records in Dynamics CRM we ensured that they could only be updated in by disabling those records in Dynamics CRM using Dynamic Forms. This allowed us to identify records with a ID and differentiate them from Dynamics CRM created records.

If this was a bi-directional sync, we would have needed to implement the solution going the other way, and the logic behind it would have been very similar. provides an out of the box REST API for record creation, but also allows developers to create custom web services, which would have allowed us to build out a very similar API to the one we built against Dynamics CRM.

Other caveats for companies interested in doing something similar:

  • Validate with the users of both systems which fields are important, and ensure that you are mapping fields correctly as some might be interpreted incorrectly
  • Ensure that you are persisting any relationships between records in the source into the target correctly
  • If your source and target system have restrictive security, validate that your records are created with the right security model to ensure the wrong people don't get access to them
  • If you are going to do a historical sync from the source to the target, ensure your workflows in the target system are disabled. Otherwise you might end up with a lot of email notifications that aren't current
Topics: Salesforce

Loading or Manipulating Large Amounts of Data in Here's Some Options!

Today’s guest blogger is Mike Welburn, a Senior Developer at Sonoma Partners.

When manipulating or loading large sets of data, there comes a point where manual updates are no longer the best option. provides a couple of different ways to load data automatically based on CSV files, but the most flexible (official) tool they have is Data Loader

Data Loader allows administrators to insert, update, delete, and export records into/from their organization. If similar data loads are done on a recurring basis, administrators have the ability to save the data mappings so they don't need to be manually remapped each time. It also has the added ability to run as a scheduled job in Windows via the command line.

For the most part, Data Loader can handle what users need. However, there are some limitations:

  • Officially supported on Windows only
  • Can't set columns dynamically, e.g. a date value to the current date
  • Only works with editions that are API-enabled (EE, UE, PE if requested)
  • Can only load one set of data at a time
  • Doesn't interact with ODBC and JDBC data sources

While implementing for different clients (on different computers), I've ended up using quite a few different tools. Below is a quick overview of the other options.

Lexi Loader
Lexi Loader is the unofficial Mac version of Data Loader. The UI and functionality are the same, so anyone familiar with Data Loader can seamlessly use this tool when switching from a Windows machine to a Mac. Excel Connector
As you might imagine, the Excel Connector is a plugin for Microsoft Excel. Normally to use an external data loading tool, it requires the API be turned on in an org, which is not enabled in Professional Edition unless requested. The biggest benefit of the Excel Connector is leveraging it in Professional Edition environments even when API is not enabled, though for any other editions I tend to use the other (more robust) tools. As a caveat, we have more success installing to Excel 2003 than any new versions of Excel. is my favorite Data Loading tool right now for smaller batches of records. It is browser based, so it works on all operating systems, and has a very easy to use interface. It isn't quite as quick to use as Data Loader if you are running the same migrations frequently as there doesn't seem to be a way to save your mappings, and there is no option to set up scheduled batch loads like Data Loader. However, it allows you to run multiple data loads simultaneously, and it does keep track of your data loading history in the cloud so you don't have to worry about keeping track of success/error files across multiple computers.

Jitterbit Data Loader
Jitterbit Data Loader is another cloud based offering that I haven't gotten a chance to use on a project yet, but it's feature set exceeds the other options. It is the only tool that allows complex functions to transform data outside of manually doing it prior to loading the CSV into a tool, such as setting a date field to today's date. Additionally, they support Group Edition and above, and interact with both databases and flat files. They also have a substantial amount of positive reviews on the AppExchange and are gaining adoption pretty rapidly from power admins.

Topics: Salesforce

Do More With Less

Today’s guest blogger is Jacob Cynamon-Murphy, a Sales Engineer at Sonoma Partners.

Don't get me wrong… I love getting paid. However, with the economy still lackluster and IT budgets quite tight, CRM administrators are feeling the pressure to get creative. Thankfully, there are a lot of great free tools and utilities available for administering and enhancing Microsoft Dynamics CRM… if you know where to look. Clearly, you do and that is why you are here. Below, I have indexed a short list of useful tools and enhancements for Dynamics CRM that you can get for the most excellent price of $0 (also available for £0, €0 or ¥0, depending on currency of choice).

While I acknowledge that there are plenty of other free tools out there, these are the short list that I find the most useful across projects and customers.


  • SiteMap Editor for Microsoft Dynamics CRM 2011 (Tanguy Touzzard) – Microsoft used to offer a managed solution for editing the sitemap.  That page is down, so this is my first runner-up solution.  The application provides a tree structure and a simple form, so you can choose site map elements and edit their most common properties. Much cleaner than editing XML!


  • Ribbon Workbench for Dynamics CRM 2011 (Develop1) - Like the site map editor, above, this is a great tool to put in your belt. Also deployed as a managed solution and exposing a configuration page as the user interface, Ribbon Workbench makes ribbon modifications and enhancements substantially easier than manually editing XML (i.e. the old way).


  • Sonoma Partners Dynamic Forms Community Edition (Sonoma Partners) – Would you prefer to define form rules – validation, calculation, hiding and showing fields – visually or by writing and testing JavaScript? If you are in favor of the former, check out Dynamic Forms – you define rules that have conditions and actions to manage common form behaviors. NOTE: Requires CRM 2011 UR8 or higher.


  • Diagnostics Tool for Microsoft Dynamics CRM 2011 (Tanguy Touzzard) - If you used the CRM 4.0 Diagnostics Tool, you will find this very familiar. Not only does it make it easy to toggle tracing on and off when troubleshooting user issues, the tool also provides additional ways to capture meaningful server details that can be reviewed directly or shared with your IT department or Microsoft Support.


  • CRM Trace Log Viewer (Stunnware) - An excellent companion to the diagnostics tool (above), Stunnware's Trace Log Viewer turns trace files - those horrible streams of meaningless gibberish - into human-readable log files that can be productively analyzed for useful system insights.


Application Enhancements

  • Sonoma Partners Universal Search for Dynamics CRM 2011 (Sonoma Partners) - Ever since the early days of Dynamics CRM, one glaring omission was a means to easily search across tables when you don't know the entity type of a record that you are seeking. We saw a need for a simple, free tool to empower user-driven universal search and this was the result. Tapping into existing configuration, like system views, Universal Search is an easily-deployed, quickly appreciated managed solution


  • Sonoma Partners Editable Grid (Sonoma Partners) – Do you ever wish Dynamics CRM offered inline grid editing capabilities like you can get in Excel? Sonoma Partners has created a free solution for Dynamics CRM 2011 that can turn your existing views into editable grids, with just the click of a button


  • CRM Workflow Manipulation Library (Carlton Colter/Engage) - Carlton Colter's workflow manipulation library augments the native workflow activity options with a slew of additional capabilities, ranging from date manipulation to string manipulation and even to complex math capabilities to enable more powerful workflows for administrators and power users


  • Customer Portal for Microsoft Dynamics CRM 2011 (Microsoft) - Although the reviews slam the customer portal, I have found it to be a great starter application. If your organization needs to provide a web portal that surfaces CRM data and makes it available to non-CRM users - customers, partners, employees - this is a great foundation. Once deployed, this portal is a content management system (CMS) that can be edited in real-time and administered through the CRM application.



  • Mobile Express (Microsoft) - Free and available out of the box, Microsoft's CRM Mobile Express is a great lightweight offering if you are just beginning to dabble in mobile empowerment for your work force. Easy to configure - enable entities for Mobile Express with a checkbox, then customize the mobile form for the entity - and supported on all devices that consume HTML4+ (read: virtually any mobile device purchased in the last decade), this free option is an excellent read-only mobile experience for your connected users.


  • Resco MobileCRM (Resco) - Resco offers a compelling off-the-shelf mobile solution that takes your users well beyond Mobile Express. The app can be downloaded from all of the major app stores - Apple, Android, Windows Phone, Windows 8 - and provides a rich native app experience that takes advantage of the respective capabilities of each platform. Think of it as CRM on your mobile device. NOTE: The app is free on the app stores, which is why I showcase it here; however, if you want to customize the app - reconfigure the options, enable custom entities, write your own code - you have to license the configuration or development tools.


  • EZ Opp for Microsoft Dynamics CRM (Sonoma Partners) - EZ Opp was designed to be a free app to make it easy for salespeople to do two things: update their sales opportunities and get the insight they need to close those opportunities as won. A novel, and simple-to-use, touch interface makes it easy for salespeople to drag their opportunity "bubbles" around on a grid to change the probability, opportunity size and expected close date. By drilling into an opportunity, the salesperson gets a full view of the opportunity, including sales stage progress, open and closed activities, wall posts, related opportunities and more.

Topics: Microsoft Dynamics CRM

Missing some content in your Windows 8 HTML/JS app?

Today's guest blogger is BJ Dibbern, a Developer at Sonoma Partners.

While working on an HTML/JavaScript Windows 8 app recently, we noticed that on some of our pages we could not get certain elements to show up. It was really throwing us for a loop. In some cases we’d have an IFrame with a map and nothing would show up to the right of the map! In another case, any time we switched to a snap view of a page, our replacement content div for the snap view would not show up at all, even though we were using the exact same markup and styling on other pages where the snap view worked.

We made sure our elements were absolutely positioned and that they had the right CSS with “display: block” and everything, but nothing worked. Nothing, that is, until we switched our IFrame tag from this:

<iframe />

to this:


…and all of a sudden, everything works as intended! A simple self-closing IFrame tag was the culprit. The problem here is that technically self-closing tags in HTML are illegal. HTML is not XML and that is where its easy to get mixed up. If you’ve worked with XHTML long enough, you use them regularly.

So technically if you’re still using those in your regular HTML and not XHTML web work, then that is also invalid HTML although the browser is fixing the issue for you and making assumptions about what you meant.

Hope this helps!

CTI is Not Just for the Big Guys Anymore (Part 1 of 3)

Today's guest blogger is Luke Simpson, a Solutions Architect at Sonoma Partners

Computer Telephony Integration (CTI) is becoming a much more common set of functionality within the Customer Service industry than it was just a few years ago, enabling many companies to be able to consider implementing solutions once reserved for 1000+ seat call centers.  However, I have many customers that cringe a little when the idea of integrating phone systems with CRM comes up.  Most anyone responsible for planning a CTI project inevitably has heard horror stories of ballooning budgets, partners that refuse to work well together and finally, implemented projects that just don’t deliver the goods!  Often the common link in these stories is due to too many moving parts (managing the CRM software, the telephony service and the connector in-between).  Sometimes the cause is bad technology or lack of understanding of the technology, and far too often the cause is a simple miscommunication on the goals of the project.

Having worked through several CTI projects in the past, after Sonoma Partners announced that we would be entering into a partnership with I thought that it would be interesting to look into how hard (or easy) it is to deploy standard CTI functionality within a organization.  Do the same “gotchas” apply?  Are there any new things to worry about?

Why Computer Telephony Integration?

So what do you get with a CTI enabled organization?  Or maybe a better question is, “Why would I integrate my telephony system with, and what is the end objective?”

As a general rule, the #1 reason why an organization implements CTI within their CRM system is to Save Money.  The idea is to create efficiencies within the system that allow the organization to maximize the time of a user spent helping the customer and to minimize the amount of time spent searching or entering data into the system.  How does CTI do that?  To answer that question, let’s talk about the various terms associated with CTI and explain how they help your users:

The first bit of functionality that any CTI project will give to your users is called “Click-to-Dial”.  Click-to-Dial functionality turns every phone number stored in your system into a URL that, when clicked, automatically dials the number from your telephone system.  This allows your users to save a few seconds typing in phone numbers, and better yet drastically reduces the number of mis-dials that may occur.

The second, and generally most important, feature of CTI projects is the “screen pop”.  When a user decides to accept an incoming phone call, typically the CTI adapter performs a search within the CRM system (we are assuming using the incoming caller’s phone number (or other information depending on whether you are using an Interactive voice Response (IVR) system).  If a match is found, the adapter will “pop” the appropriate Salesforce page showing the details of the record of the caller.  Again, the objective here is to save time and allow your users to focus on fulfilling the needs of the caller.  Instead of forcing a user to search for the caller’s information, in a good system the information simply appears at the appropriate time.

Third, any time a user is on a call, they can be prompted to take notes on that call which are automatically logged within the system as an Activity.  Any related to the objects that the user has navigated to during the call can be automatically associated with that note.  In my mind, this is a fantastic feature!  It allows your organization to enforce specific behaviors across all of your users.  This increases the value of your CRM system by providing confidence in the information being collected.

And lastly, but definitely the icing on the cake, everything I just mentioned happens from within your Salesforce system.  No leaving the browser, no touching your phone, no toggling between a variety of programs on the desktop.  Nice, huh?

What Are My Options?

So you’ve decided that you want the benefits that CTI can bring to your CRM solution, but don’t know how to do it?  Well, there are basically two ways to enable CTI within your Salesforce deployment:

CTI Adapters

A CTI Adapter is a small piece of software that runs on the client machine and acts as an intermediary between the phone and  Whenever a call is routed to your phone, the adapter acts as the gateway to the softphone within to alert the user and pop the appropriate screen.  This action is reversed on the Click-to-Call functionality when a telephone number is clicked.

CTI Adapters are available via AppExchange for you to purchase direct from the vendors that have created them.  The trick here is to determine which one you need.  How do you do that?  Well, just pick the adapter from the vendor who makes your phone system!  If Avaya, you need one of the Avaya CTI adapters.  If you use Cisco you are going to need to purchase a Cisco adapter.  Makes sense, right?  There are dozens of options available in AppExchange, so feel free to take a look.  Some are free, most are not.  But the nice thing is that each adapter is specific to the phone system it supports and all integrate with the softphone.

Open CTI

The second option available is Open CTI.  Open CTI is a framework introduced by in the Summer ’12 release that allows “customers and partners to embed third party web apps directly into Salesforce”.  This eliminates the need for an adapter running on the client machine and truly makes the CTI functionality a cloud sourced solution.  It is a JavaScript based API that is designed to interact with web enabled telephony systems.  What this means in practice is that users will be able to have a user experience not unlike the Google Maps embedded within Yelp or various games that are embedded within Facebook.  The point is the user is able to perform necessary work (or play) without any knowledge that a hand-off of sorts has occurred within the software/browser.

Which Option Should I Pick?

Well, that is going to be the topic of my next few posts.  There are strengths and weaknesses to each option, and I would like to walk through them individually.  First, I am going to walk through the installation and configuration of a CTI Adapter within and analyze the ease of its use, along with what I view as the positives and negatives.  Finally, I’m going to spend a full post discussing the new Open CTI solution that was recently announced and what it means for’s vision of the future of CTI.  Stay tuned!


Topics: Salesforce

Introducing Sonoma Partners Dynamic Forms for MSCRM 2011

Microsoft continues to improve their product and the configurability of it meaning that more and more pieces of the application are surfacing to administrators to be able to configure the application, versus requiring a developer to write custom code.  An easy to configure application adds greater flexibility and increased options for end users to extend the application to meet their needs.

However, there are still some places that we find most of our customers want to easily extend, and also be able to control the configurability themselves.  And that’s the ability to have their CRM Forms dynamically change based on specific conditions (value of a field, users security role, etc.).  The great news is that Sonoma Partners has built something specifically for this that we call Dynamic Forms!

Sonoma Partners’ clients get the ability to use Dynamic Forms for free if their specific requirements warrant the need for it.  However, Sonoma Partners is now also making this powerful tool for controlling CRM Form behavior available to everyone!  The Sonoma Partners Dynamic Forms Community Edition will allow you to use this powerful too and create up to 10 rules for your organization.  You can request the Dynamic Forms Community Edition download from the Sonoma Partners downloads site.

  • Pricing:
    • Sonoma Partners Dynamic Forms Community Edition:
      • Free to all customers through a download on the Sonoma Partners website.
      • Allows for the creation of up to 10 rules.
    • Sonoma Partners Dynamic Forms Full Edition:
      • Free to Sonoma Partners clients.
      • Allows for unlimited creation of rules.
  • Easy Install / Fully Supported Design
    • Dynamic Forms is a CRM 2011 Managed Solution that you can simply import into CRM
    • The User Interface is built on Microsoft Silverlight that generates Web Resources that are transportable between organizations using CRM Solutions.
    • All of the script that’s generated in the Web Resources are fully supported using the native CRM JavaScript API

  • Easy to use Configuration User Interface
    • Easy to create rules using IF/THEN logic
    • Ability to filter list of entities to configure rules for by Native Entities, Custom Entities, or Entities that have Dynamic Form Rules
    • Users can add rules, save rules, and publish rules all in one place
      *UI created using Silverlight
  • Available Conditions (IF):
    • All conditions are AND conditions where every condition has to hold true for the rule to fire
    • Entity Field:
      • Contains Data
      • Does Not Contain Data
      • Equals
      • Does Not Equal
      • Begins With
      • Ends With
      • Contains
      • Does Not Contain
    • Form Type:
      • is Create/Update/Read Only/Disabled
      • is not Create/Update/Read Only/Disabled
      • is a specific Form
      • is not a specific Form
    • Related N:1 Entity:  Same options as “Entity Field” above
    • Current User:
      • Has a specific Security Role
      • Does not have a specific Security Role
      • Has values for a specific attribute on the User entity
  • Available Actions (THEN)
    • Disable the Form
    • Hide left Navigation Elements
    • Entity Field
      • Calculate the value based on two other fields (+,-,*,/)
      • Set Required
      • Hide
      • Hide and Clear Contents
      • Clear Contents
      • Show
      • Disable
      • Set the value
      • Set the value if currently NULL
      • Filter Values (for Option Sets)
      • Format values (ex: phone #)
    • JavaScript
      • Execute a JavaScript Function
      • Present a JavaScript Alert
    • Hide/Show/Disable Form Sections
    • Hide/Show/Disable/Collapse Form Tabs
  • Dynamic Forms In Action
    • Our business requirement for this example is the scenario where the client wants to require either the E-mail or the Main Phone number field for Accounts.  They don’t need both, but they need at least one.  The good news is this is a VERY SIMPLE scenario to accomplish with Dynamic Forms.  This won’t require a developer, and will take less than 15 minutes to complete.
    • To use Sonoma Partners Dynamic Forms, navigate to Settings –> Solutions and open up the “Dynamic Forms – Community Edition” Solution.  From the Configuration link off of the Solution, you can configure your rules.
    • You can filter the list of entities by typing in the “Filter Entities” drop down, or using the pick list of predefined options.   I notice that Account already has a rule configured to it via the arrow indicator to the left of the entity name.  I’ll select "Entities with DF Rules” to filter out the rest of the entities.


    • From here we can see the details of the rule for the Account entity already which is to format the Main Phone Number once populated.


    • Click on Add Rule above the Account entity name on the left to create a new rule.  Fill in all the details of your new rule.
      • Condition:  Main Phone - Does Not Contain Data
      • Action:  E-mail - Require
      • Name:  Require either Main Phone or Email Part 1
    • Your rule should look as follows:


    • The red exclamation point indicates the rule is not saved.  You can save it by clicking the Save button in the top right corner.
    • As you noticed I gave the rule a name “Part 1” as this requirement will require two rules.  One to require the Email field, and one to require the Main Phone Number field.  Conditions within a Rule act as AND conditions, where as Conditions between multiple rules act as OR conditions.
    • Luckily there’s a Copy button in the top right corner next to Save which will reduce the amount of work you need to do for “Part 2” of this requirement.
    • After you click Copy, set your rule up similar to what you did for the first part:
      • Condition:  E-mail - Does Not Contain Data
      • Action:  Main Phone - Require
      • Name:  Require either Main Phone or Email Part 2
    • Your rule should look as follows:


    • Now all you have to do is Save the rule as you did for the first rule, and once that’s done, you can click on the “All” on the left underneath the Publish: text.  You can choose to publish just the current selected rule you’re on, or all rules.  This will create / update the web resources that are attached to the entities and actually perform the Dynamic Forms magic.
    • Open up an Account record to see your newly published rules in action and to test them out. 
    • Here you can see an Account that was previously created before this rule was added and neither Main Phone or E-mail are populated.  Therefore both are appearing up as required on the form.  So far so good!


    • Now let’s populated the Main Phone number.  You’ll notice two things after stepping off the field. 
        1. First, the Main Phone number field is automatically formatted based on our format ###-###-####
        2. Second, you’ll see that E-mail is no longer is required


    • Now remove the value in Main Phone number, and instead type the same unformatted number into the Other Phone number field.  Also enter in an E-mail address.  You’ll notice two things:
      • First, the Other Phone number field IS NOT formatted based on our format ###-###-#### since this field didn’t have any formatting applied to it
      • Second, you’ll see that Main Phone is no longer is required


    • It’s just that easy!  Now you’ve simply satisfied the requirement of having either the Main Phone or E-mail populated for your accounts with a few simple clicks!

If you’re intending to use Sonoma Partners Dynamic Forms, there are some considerations you need to remember:

  • This solution is designed to work in unison with native CRM Field Level Security and Role Based forms (Dynamic Forms is not intended to hide sensitive data alone)
  • If you have multiple environments (e.g., Development / Test / Prod), you should consider where to manage the rules
    • In Dev (best practice and recommended): create and edit rules and deploy to other environments using Web Resources via a CRM Solution
    • In Production:  you’ll need to also deploy the entity records (Form Action, Form Condition, Form Rule, and Form Setting).  The Web Resources that the solution creates are needed to use Dynamic Forms, but the records stored in these 5 entities are needed to configure Dynamic Forms.

I hope you find this powerful tool as useful as we do and as our clients do.  You can find more information about Sonoma Partners Dynamic Forms for MSCRM 2011 including Help Documentation on the Sonoma Partners website.   Thanks to my colleagues Stephen Habegger, Matt Weiler, Brad Bosak, Kristie Reid, Pam Powell, Rachel Sullivan, Jeff Meister and Cherish Orozco for their contributions to making Dynamic Forms where it is today!

Topics: Microsoft Dynamics CRM