Monday, December 20, 2010

Being Labelled a SalesForce ‘Hater’

I was quite amused to be characterised as someone who is “damning and lashing out at the competitor’s CRM product”, specifically SalesForce. For the full article, here is the link.

ForceMonkey does say my blog is worth reading so I appreciate the endorsement. I did post a comment in response on his blog. I thought I would also give a more detailed reply here, reviewing ForceMonkey’s comments. This may be seen as evidence of “too much criticism, too little fun” but really I would prefer to characterise myself rather than have others do it for me.

Do Dynamics CRM Evangelists Love Their Product As Much As ForceMonkey Loves SalesForce?

I love my wife and my two children. However, I do not love something delivered to me via a web browser. There are plenty of sites designed to arouse the lonely internet surfer. If or make your list, there is something wrong.

At the time of writing (and hopefully for many years to come) I am a Microsoft MVP (Most Valuable Professional, an officially recognised evangelist, if you will). Arguably the MVPs are the most passionate advocates you will ever get for a Microsoft product. In my case that product is Dynamics CRM.

I probably have uttered the phrase “I love Dynamics CRM” in a moment of exuberance and I think Dynamics CRM is a great product. I have seen, first hand, how organisations with BONE setups (Business Cards, Outlook, Napkins, Excel) have been transformed through the use of the product. Am I passionate about the product and the benefits it can provide? Absolutely. Do I love the product? No, but I do love what it does to assist organisations deliver great service to its customers.

One other aspect in regards to loving a product. Love is blind. I am passionate about the potential of the product and, like many MVPs, have no hesitation in criticising the weaknesses in the product and letting the product team at Microsoft know my thoughts. MVP is often jokingly said to stand for ‘most vocal professional’ and it is true. We are strong advocates but also harsh critics. Microsoft respects that and generally encourages it. This is why they give us direct access to the product team throughout the year.

Do I Hate

I am largely indifferent to SalesForce but acknowledge it as a strong competitor. I rarely comment on its functionality, mainly because SalesForce have a very specific policy regarding the use of their product. Basically you cannot use it for competitive purposes. I try not to make comments without having something to back it up.

For those SalesForce folk wanting to try out Dynamics CRM 2011, the beta is public.

I sincerely hope someone like ForceMonkey takes the time to review Dynamics CRM and highlights the differences between the two products. There are many prospective customers out there begging to know the fundamental differences. He can help them, I cannot.

My most recent comment on SalesForce’s functionality was in a tweet where I pointed to two videos showing how SalesForce and Dynamics CRM integrate to Outlook. Here are the links if you are interested.


Dynamics CRM:

By my reckoning the integration between Dynamics CRM and Outlook is far richer than what I see in the Salesforce video but then there are plenty of people out there not using Outlook so, as we say in Australia, horses for courses.

So What About All Those Hateful Blog Posts?

Check for yourself. Throughout 2008 and 2009 my blogs have consistently commented on my thoughts regarding the SalesForce share price. In short, by any text book measure, it is massively overvalued. The ‘voting machine’ continues to disagree with me and the SalesForce stock continues to go through the stratosphere. My prediction is it will crash within 18 months.

So why the focus on Salesforce and not other CRMs? It is pretty simple really. is the largest cloud CRM in the world and they have a massively overvalued stock.

In regards to ForceMonkey’s suggestion that the Salesforce community does not give Dynamics CRM much regard, they should. It is always worthwhile keeping an eye on competitive offerings to see how yours can be improved. Benioff is certainly focussed on Microsoft. Microsoft is focussed on SalesForce. The rest of us should follow suit. Complacency is the domain of those who wish to become irrelevant.

I do recall once posting on either twitter or facebook about more than a passing resemblance of Marc Benioff to Douglas Reynholm from “The IT Crowd”. Others may disagree (and that’s ok). To be honest that is about as vitriolic as I get.

What About the Hashtags?

Nothing annoys me more than the misuse of hashtags. I use both the #salesforce and #df10 hashtags when the content of the tweet warrant it. For example, all my tweets regarding ‘Bernard’ had the #df10 hashtag on it because it all played out at dreamforce 10. I tweeted about three Microsoft case studies talking about SalesForce customers who had moved to Dynamics CRM (, and ) suggesting SalesForce try to win these guys back rather than hire actors to pretend they have returned. On this tweet I used the #salesforce hashtag.

The Bernard Farce

The Bernard thing annoys me. Microsoft should have hired a real customer for their testimonial poster (, and for example) and Benioff should have just called it out for what it was rather than this ‘bring him back from the dark side through our energy’ nonsense. Benioff, according to the Wall Street Journal, is friends with actor ‘Bernard’ ( making the whole DreamFarce theatre even more of a nonsense.

I think both sides could have taken the high ground on this one and both found it easier to take the alternative.

Do SalesForce Evangelists Have More Fun?

I have no idea. ForceMonkey suggested TechEd was the annual user conference. It is more of a developer’s conference really. I would probably characterise Convergence as the user conference ( This is a business-user focussed conference for the Microsoft Dynamics products, of which CRM belongs. I went last year and had a ball. ForceMonkey’s description of DreamForce was pretty close to my memories of Convergence. That being said, most user conferences follow a pretty similar format.

There is also the MVP summit, exclusively for MVPs across all Microsoft products and free of charge. This is held at Bellevue/Redmond, Washington and brings together the product teams and the MVPs from all over the world. As ForceMonkey says, it really does not get better than being surrounded by so many like-minded, passionate individuals and having Microsoft pick up the bar tab (or SalesForce in his case).

As for destroying the fun by all means let the good times keep on rolling at DreamForce. Benioff characterises viable competition as if it is the end of his world. I can understand why Benoiff would be nervous. Personally I am excited to see Dynamics CRM and SalesForce compete on a level playing field. I am sure there are markets for both products and both will prosper. The world is not as absolute as Benioff suggests.

Sunday, December 12, 2010

Auto-Numbering Using Workflow

This is a trick one of my co-workers (Amreek Singh) showed me a little while ago. This will work in CRM 4 and CRM 2011, although, for convenience, I’m doing it in the 2011 beta.

Current Auto-Numbering Options

The first option is for a limited set of entities which have auto-numbering out of the box.


For Contracts, Cases, Articles, Quotes, Orders, Invoices and Campaigns, auto-numbering can be set in the Administrative settings in CRM. The prefix for each of the entity numbers can be set and the final suffix can be of a length from four characters to six characters. A word of warning, if you change the length of the prefix, this changes for ALL the entities, not just the one you’re on.

For other entities, if you are using CRM 4, there is also an auto-numbering plugin available from codeplex.

Of course, if you are using the online version of CRM 4 or CRM 2011, you will need to resort to another option. Here is one using workflow.

Step One: An Entity to Store the Current Incrementing Value

To store the current value of the incrementing value, we need a new entity. For this entity we create one record to hold the values.


In this case I’m storing the prefix and the suffix I am going to use for an incrementing value on the account record.

The record also needs to have 1:N relationship to the records it will increment. In this case, the Account entity.

Step Two: Set up the Field on the ‘Numbered’ Record

Account already has an ‘Account Number’ field so I will use this field to hold the value of the field.

Step Three: Set up the Workflows

I tried doing this with one workflow but for some reason the workflow could not link to the record with the values in it and then populate them. Therefore, I’m using two. The first workflow runs on the creation of the Account record and links to the record storing the increment values.


Incidentally, there is no need to add the lookup to the Account form as workflows can populate fields whether or not they have been added to the form. This is great when you need to store values but do not want to clutter the forms up.

The second one is triggered when the link to the value store record is populated. It does the populating of the Account record and also increments the value store by one so the next Account record gets a different suffix value.


For the Account Number, we add the two ‘slugs’ divided by a dash.


For the incrementing of the storing record, I use a little known trick which is available in both versions of CRM.


When you use the Form Assistant to populate a field, drop the ‘Set To’ Operator down and you will see a whole range of different operators available, depending on the field type. In the case of integer fields, one of the options is ‘Increment By’. By adding ‘1’ to the Default Value and hitting OK we tell the workflow to increment by 1 every time the workflow fires.

What We End Up With

After all this we end up with a process which will populate the Account Number of an Account with a unique value every time an Account record is created. As usual with workflows, this runs asynchronously. In other words, you will NOT see the field populating on the initial creation but rather only after you have saved and closed the record and reopened it a little time later, after the workflows have finished.


We can extend this to multiple entities by adding other fields to the store record and setting up additional 1:N relationships from the store record entity.

Have fun!

Monday, December 6, 2010

Using Dialogs for More Than Just the Call Centre

A lot of the marketing about Dynamics CRM 2011 dialogs describes them as being like a call script and, while they can be used for this, they are a lot more powerful than simply a way to guide users through a call.

In this example I’ll show how we can use dialogs for an internal process such as timesheet capture.

So What Are Dialogs?

Dialogs can be thought of as a new kind of workflow. In this case, there is scope for user input. Another difference is that, while workflows are generally triggered off an event in the system e.g. the creation of a record, dialogs can only be run ‘On Demand’ from a record. Similarly, while a dialog can spawn a child dialog or a workflow, a workflow cannot spawn a dialog.

Creation of a Timesheet Record

In this case I’ve made the record reasonably simple:


We have the obligatory Name field, compulsory for all entities, we have an owner, in this case the administration account creating the record, the Consultant who is doing the work, the customer (an account in the system), the consulting hours, travel time, a description field and a processed tickbox to show when a timesheet has been invoiced.

The Dialog


The dialog is going to spawn from the user’s record and it is available as a child process. Making it available as a child process means I can call it again to enter multiple timesheets at once. Everything else you see, I’ll explain below.

Querying My Customers

The first thing I do is query the database. This is a new feature of dialogs, sadly unavailable in workflows. In this case I’ve created a many to many relationship between users and accounts so I can track who a given user’s accounts are.


The query then retrieves these accounts so we can assign the timesheet to the right account.


Here the query looks for accounts where the many to many relationship is with the current user. My initial design was to query based on the user record the dialog was spawned from. However, while you can add dynamic parameters (slugs) via the ‘Define fetch XML query text’ tab, for user queries you need to feed it the user name and GUID. I can get the user name from the user record, but I could not find the GUID and therefore settled with the current user.

Displaying the Dialog Page

Now we have our query we can display the results and ask the questions we need to fill out a timesheet.

In the case of the customer selection, we add a prompt and response, referencing our query.


This will provide a list of accounts, associated to the user with a radio button selection next to them. It will then be up to the user to select the right company. Rather than account, this could easily be opportunities or a custom project entity. The difference is in the CRM Query used in the previous section.

The next two prompt and response boxes simply ask for user input, in this case totals for the consulting hours and travel time. Here is an example of the first one.


The data type field will only accept Text, Integer or Float. You cannot enter a date, for example. This is unfortunate and hopefully will be adjusted when the full version is released.

Finally, we have a question as to whether there is another timesheet to enter.


Creating the Timesheet

Once we glean all of this information from the user, we can create our timesheet entry under the user record. This works just like it did in version 4 workflows.



Our final step is a conditional which looks at the value given for the ‘Another Timesheet?’ question. If the answer was ‘Yes’, the dialog is called again so a new timesheet can be entered. If the response was ‘No’, the dialog simply ends. One thing that tripped me up here is that the default is to compare against the response Value and not the response Label. Therefore you need to be careful you are comparing ‘Yes’ to ‘Yes’/’No’ and not to ‘1’/‘0’.

The End Result

What results is a dialog that can be called from a user record and allows the user to enter timesheets quickly and efficiently.



Have fun!