Mashing up CRM and Twitter, Part 2
The Truth is Out There (in 140 Characters or less!)
If you didn’t read the first part of this “series”, here’s a link to Mashing up CRM and Twitter, Part 1. That article provides a high-level overview of three topics:
- What the heck Twitter is, in case you’re new to it
- Why you might want to integrate it with Dynamics CRM
- Some basics of Twitter Search
To follow up on part 1, I want to cover two main topics here:
- How you can implement a managed Twitter search from a Dynamics CRM record
- Discuss some of the interesting extensions of the simple example I’ll show, and argue a little more why Twitter search is so important
Implementing a Managed Twitter Search from Dynamics CRM
What I’ll show here is some of the mechanics of doing a contextual Twitter search from a CRM record. These will be similar no matter what entity you’re searching from, so I’m going to show how to customize the Dynamics CRM “Competitor” entity. (In the example I show it will be not for my competitors, but for a group of companies that compete against each other. Same techniques, either way.)
The general technique is to use an IFRAME control on a customized CRM form, and dynamically update the “src” property of the IFRAME with information from the current record. Here’s what the user experience looks like, starting with the Competitor form opened to a specific record, in this case my favorite food company, Kraft:

Figure 1: Competitor form open with a record selected
This shows a standard Dynamics CRM form, in this case having double-clicked on the “Kraft” record from the Competitors grid. When a user clicks on the Twitter Search tab, what they see is an IFRAME that exposes the results of a Twitter search. What that might look like is shown here:
Figure 2: Twitter search results based on CRM data
How to Build it
That’s the user experience. What I’ll show you next is how to build a customization like this — essentially, how to update the “src” property of an IFRAME like that with information from the current record. The idea here is to provide a managed search experience from within CRM, so my brand managers or whoever else might be using this don’t need to worry about Twitter search syntax. To save a little time, I’ll give you a “heuristic” step by step. I’ll post a video shortly where you can see all of the detailed steps, but for now…
…follow these steps:
- Customize the Competitors entity, by adding a tab, a section, and an IFRAME; call them all Twitter Search or something like that.
- To start out, set the IFRAME’s URL property to http://search.twitter.com . Turn off the “prevent cross-frame scripting” property by unchecking it.
- Navigate to the form’s OnLoad event, and add the following jscript code:
code starts here:
var CRM_FORM_TYPE_CREATE = 1;
var CRM_FORM_TYPE_UPDATE = 2;
var twittersearchURL = “”;
switch (crmForm.FormType)
{
case CRM_FORM_TYPE_CREATE:
twittersearchURL = “http://search.twitter.com“;
break;
case CRM_FORM_TYPE_UPDATE:
// Use Twitter search with this account’s name when updating account
twittersearchURL = “http://search.twitter.com/search.atom?q=”;
// Encode the account name and add it to the search string
twittersearchURL += encodeURIComponent(crmForm.all.name.DataValue)+”&rpp=100&lang=en&tude=:)”;
break;
}
// Set the respective IFRAME’s URL
//alert (twittersearchURL);
crmForm.all.IFRAME_twittersearch.src = twittersearchURL;
end of code
Let me make a couple of comments about this code, in case you want to try it or some variation on it:
- Notice that the twitter search url uses the “atom” qualifier. This is the way twitter search lets you return results in an RSS format. This is a lot more convenient in many ways than search results returned to an HTML page. In part 1 of this article I discussed Twitter search basics, and included a link to the Twitter search API, which I highly recommend you read if you want to do things like this.
- Notice the encodeURIComponent function call. In this example, I pass “crmForm.all.name.DataValue” into that function — this is the value of the “name” field on the Competitor form. If you were doing this for the Account or most other entities, it would be identical, but you might need to change the field name depending on what you want to do. EncodeURIComponent does things like replace spaces with the “%20″ strings you see in URLs; it basically takes text strings and formats them properly as URLs, so get used to this function if you want to do things like this.
- Also: notice the “&tude=:)” and the other strings I tacked on to the end of the url. If I hadn’t commented out the alert, I’d see a URL like this just before the last line of this OnLoad event code gets run: http://search.twitter.com/search.atom?q=Kraft&rpp=100&lang=en&tude=:) This search query looks for Kraft, then tells Twitter to return up to 100 results per page, then says to only look for English results, and finally says to look for “results with a positive attitude”. Obviously, if I’m a Kraft brand manager and I’m looking at search results for “Oreo Cakesters”, or “mac ‘n cheese”, I’d probably want to look at both “tude=:)” and “tude =:(” results, if you know what I mean!
Refer back to Figure 2 for a second and notice the “Results mood” pulldown list. With very little additional effort (similar jscript to the above, only behind the Change event of the picklist attribute that gets selected) you can build in some flexibility along these lines.
Extensions and the Importance of Twitter Search
Here are some of the more obvious ways this could be extended. (You can probably think of a lot more — let me know if you have some good ones!)
- If I’m a Kraft brand manager, I’d want to use the Product entity, and add a bunch of my products (see above), and search on them with both
and
tude qualifiers, and maybe stack up how I’m doing against my competition. - If I really did want to keep track of my competitors, the Competitor entity would work well, but you might want to do this for their products as opposed to just the company name.
- I think where it really starts to get cool is to store the results and start doing some analysis over time on the search results. You could store off these RSS data, say to a database, and really start to crunch some interesting numbers. For example, suppose you’re launching a new ad campaign for an existing product, and you want to see how it impacts the buzz about your product over time. Or suppose you’re watching to see how your competitors’ campaigns are doing over time. Or suppose you’re managing a product recall or something along those lines and how that impacts discussion of your product over time…
I could go on and on, but you probably get the point by now (if you’ve read this far! in which case, thank you very much). People who dismiss Twitter as a narcissistic time-suck are missing the point. If you’ve got 6 million+ people out there tweeting away about almost any topic you can think of, the chances are good they’re talking about things that matter to you. And if you can aggregate up all those tweets, you can actually learn some interesting things you might not already know.
The Truth is Out There…in the form of millions and millions of 140 character tweets.
Cheers –
Richard




Brought to you by Richard Knudson and IMG.