I recently worked on two seperate CRM data migration projects that have highlighted how easy it is to customize the Saleforce.com Sales Cloud CRM solution. In both cases I was migrating data out of an existing CRM system and into Salesforce.com. What struck me after completing these projects that without the ability to easily customize Salesforce.com, both of these projects would have been much more difficult.
Every data migration project has a similiar data mapping process. You first map the easy fields. These fields have a one to one mapping from the old system to the new system. There are a piece of cake to do. Next you look at the "almost" fields. These are fields that almost have a one to one match from the old system to the new but with an issue. Maybe the new field is not large enough, or the data is stored in a slightly different way, or something else which makes this fields a little harder to map. These are more difficult but not a roadblock to the migration. Then you look at the roadblocks. These are the fields or objects that have no corresponding match in the new system. You are left to figure out how to implement functionality in a system that it was not designed to do.
In both of the projects I worked on one of the roadblock was how to store contact relationships. The source CRM has a very robust relationship model that allows users to relate any contact to any other contact with a variety of relationships. Dave "Knows" John. Tom "Works for" Lisa. and so on. Another feature of the source CRM solution is that companies and contacts are stored in the same object. This allows users to create relationships between contacts and companies. Dave is "employed by" Rightpoint for example. Salesforce.com does not support this relationship model out of the box (Can I even use that saying about a cloud based solution?), but the ability to create custom objects and relate them to standard objects make this very easy to do.
To handle these relationships in Salesforce I first created a custom object in Salesforce. This object has three custom fields. The first two are Master-Detail fields that relate to the contact object. Using the fields like this is referred to as a "junction object". One of the fields represents the source of the relationship and the other field represents the destination. The third field is a picklist that defines the type of relationship.
Once the object is defined I modified the contact object's page layout to include this now related object. This allows users to review each contacts relationships when looking at the detail page of the contact.
After creating the objects I can then use the data loader to load the relationships as part of the data migration process. Users can then manage their contact relationships using the standard "New", "Edit", and "Delete" functionality provided by Salesforce.
The best part is I didn't have to write code. I didn't have to request a custom modification from the vendor. And it took less than an hour to implement.
For my situation I had to create two objects. One for contact-contact relationships and one for contact-account relationships.
The ease of custimizing objects and fields within Salesforce.com is invaluable to the people who must migrate data. There are enough other issues in a CRM migration project (workflow issue, data ownership, data cleanup, etc) without having to worry about where to store the data that needs to be brought over. The Salesforce.com platform almost makes these type of challenges fun to work on.