Microsoft CRM 3.0 Experiences

Tuesday, April 29, 2008

Website Feed Generator on MS CRM

We have 6 company websites in the Chelford Group and we wanted an easy way of updating, news, case study, datasheet and newsletter information across all of the sites. In some cases the article would be repeated on more than one of the sites and also the article might apply only to a particular industry.


We thought about using blogger to create our feeds but decided to create a custom application in our common Microsoft CRM platform that was specific to our needs. We use MS CRM for all our Sales and Marketing so why not centralise our website news etc on here as well making it easier to maintain.


How does it work?


Website Feed Entity


I basically created a new entity on MS CRM called "Website Feeds" and added fields / attributes for your basic XML RSS 2.0 standard layout such as:



  • <title>

  • <link>

  • <description>

  • <image link>

  • <publish date>

  • <expiry date>

and custom fields such as



  • <industry> - the industry the feed is applicable to

  • <feed type> - news, case study, datasheet, newsletter

  • <company_id> x 6 - the company website the feed is to be displayed on (can be more than 1)

Feed Generator


On saving a new feed the feed generator (an ASP page in a IFRAME) retrieves all of the feed data from CRM and then creates an .xml file for each feed type for each company website in other words it creates:


SSI Website -



  • ssinews.xml

  • ssicasestudies.xml

  • ssidatasheets.xml

  • ssinewsletters.xml

and the same for the other 5 websites.


To see some of these live feeds visit http://www.ssi-world.com/

Tuesday, January 15, 2008

Updating Statecode, Statuscode values when importing into Microsoft CRM 3.0

I use CRM Extensions ImportManager Studio 2006 when importing and mass up-dating recording in Microsoft CRM 3.0 but I found a problem when I wanted to Import (create) a large number of Tasks, marking them as Completed.  Microsoft CRM would ignore my request to mark them as completed (setting statecode = 1) and set them to active (statecode = 0) instead.  This was because, due to MS CRM logic, you cannot create a completed task.
 
Workaround
 
It suddenly occurred to me that I didn't care what statecode they were set to when imported because I could set up a Workflow rule that would check each Task as it was created, in my case I checked for a particular value I'd set in the Task Category field, and then change the status of the Task entity in the workflow to be Completed!

Wednesday, January 02, 2008

SMS Alerts to Salesmen regarding new CRM Opportunities

We wanted a direct way of alerting our salesmen that they had a new opportunity assigned to them on Microsoft CRM. They already receive email alerts but this hadn't been achieving a quick enough response rate.

Therefore we decided to create a utility whereby our telemarketers could alert the salesmen via a text message. This utility would need to be activated manually so that the telemarketer could decide if it was appropriate to send a text message or not.

We put a button on the Opportunity form as shown below:



Clicking this but brings up the following "Are you sure?" type window:


And the SMS gets sent.

The code behind the scenes basically does the following:

  1. Extracts the User ID of the owner of the Opportunity record.
  2. Looks up the Users mobile phone number on CRM.
  3. Generates an Email for TextMagic where the email address to sendto address is in the format ###########@textmagic.co.uk where ########### is the Users mobile phone number. The From address is an address we have registered with TectMagic. The emails content contains "Hi, Username, you have a new opportunity on CRM: CompanyName created CreatedByName".
  4. TextMagic takes the users mobile number from the To address and then sends the email bodytext to the user via SMS.


Code for MS CRM Improved Phonecall Screen for Telemarketing

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!--#include file="Connections/CRMConn.asp" -->
<%
' This ASP script finds and displays information related to the Account (Company) on a CRM Phone Call form.
' It calculates who the related Account is regardless RegardingObjectType on the Phone Call form.
' In other words if the RegardingObjectType is a Contact, this script will calculate the Parent Account of that Contact
' It does the same if the RegardingObjectType is an Opportunity or another other RegardingObjectType
 
Dim activityid, RegardingId, Obtype, WhatSQL, AccountSQL, ContactSQL, OpportunitySQL, SuperSQL, DontKnowSQL
Dim Company, Revenue, Employees, SIC, SICDESC, IndustryO, ERP, ERPDESC, City, County, ERPLastUpdate, ParentAccount, AccountId
Dim AddiContactSQL
activityid = Request.QueryString("activityid")
 
' Initial SQL to retrieve the RegardingObjectType based on the activityid
WhatSQL = "select regardingobjecttypecode, regardingobjectid from FilteredActivityPointer where activityid='" & activityid & "'"
 
' If the RegardingObjectType is an Account use this SQL
AccountSQL = "select p.activitytypecodename, a.name, a.accountid, p.subject, a.revenue, a.numberofemployees, a.sic, a.new_siccodedescription, a.new_industryother, a.new_erpsystemname, a.new_erpdescription, convert(varchar,a.new_erplastupdate,103) as ERPLastUpdate, a.parentaccountidname, a.address1_city, a.address1_county from FilteredActivityPointer p right join FilteredAccount a on p.regardingobjectid = a.accountid where p.activityid="
 
' If the RegardingObjectType is a Contact use this SQL
ContactSQL = "select a.name, a.accountid, a.revenue, a.numberofemployees, a.sic, a.new_siccodedescription, a.new_industryother, a.new_erpsystemname, a.new_erpdescription, convert(varchar,a.new_erplastupdate,103) as ERPLastUpdate, a.parentaccountidname, a.address1_city, a.address1_county from FilteredAccount a right join FilteredContact c on a.accountid = c.accountid where c.contactid="
 
' If the RegardingObjectType is an Opportunity use this SQL
OpportunitySQL = "select a.name, a.accountid, a.revenue, a.numberofemployees, a.sic, a.new_siccodedescription, a.new_industryother, a.new_erpsystemname, a.new_erpdescription, convert(varchar,a.new_erplastupdate,103) as ERPLastUpdate, a.parentaccountidname, a.address1_city, a.address1_county from FilteredAccount a right join FilteredOpportunity o on a.accountid = o.accountid where o.opportunityid="
 
' If the RegardingObjectType is something else use this SQL
DontKnowSQL = "select a.name, a.accountid, a.revenue, a.numberofemployees, a.sic, a.new_siccodedescription, a.new_industryother, a.new_erpsystemname, a.new_erpdescription, convert(varchar,a.new_erplastupdate,103) as ERPLastUpdate, a.parentaccountidname, a.address1_city, a.address1_county from FilteredActivityParty p right join FilteredAccount a on p.partyid = a.accountid where p.participationtypemask = 2 and p.partyobjecttypecode = 1 and p.activityid="
 

%>
<%
Dim WhatRS
Dim WhatRS_cmd
Dim WhatRS_numRows
 
Set WhatRS_cmd = Server.CreateObject ("ADODB.Command")
WhatRS_cmd.ActiveConnection = MM_CRMConn_STRING
WhatRS_cmd.CommandText = WhatSQL
WhatRS_cmd.Prepared = true
 
Set WhatRS = WhatRS_cmd.Execute
Obtype = WhatRS("regardingobjecttypecode")
RegardingId = WhatRS("regardingobjectid")
WhatRS_numRows = 0
WhatRS.Close()
 
' Uses appropriate SQL query for the RegardingObjectType
Select Case Obtype
 Case "1"
  SuperSQL = AccountSQL & "'" & activityid & "'"
 Case "2"
  SuperSQL = ContactSQL & "'" & RegardingId & "'"
 Case "3"
  SuperSQL = OpportunitySQL & "'" & RegardingId & "'"
 Case Else
  SuperSQL = DontKnowSQL & "'" & activityid & "'"
End Select
%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Phone Call Account Retriever</title>
<style>
body {font-family: tahoma,verdana; font-size:11px;}
table {border: 1 solid #333333;}
td.title {color:#FFFFFF; background-color:#336699;}
td.data {color:#000000; background-color:#eeeeee;}
td.contacts {color:#000000; background-color:#dedede;}
</style>
</head>
 
<body topmargin="0" leftmargin="0">
<table width="420" border="0" cellspacing="1" cellpadding="1">
<tr><td valign="top" width="260">
<%
Set WhatRS_cmd = Server.CreateObject ("ADODB.Command")
WhatRS_cmd.ActiveConnection = MM_CRMConn_STRING
WhatRS_cmd.CommandText = SuperSQL
WhatRS_cmd.Prepared = true
 
Set WhatRS = WhatRS_cmd.Execute
Company = WhatRS("name")
Revenue = WhatRS("revenue")
Employees = WhatRS("numberofemployees")
SIC =  WhatRS("sic")
SICDESC = WhatRS("new_siccodedescription")
IndustryO = WhatRS("new_industryother")
ERP = WhatRS("new_erpsystemname")
ERPDESC = WhatRS("new_erpdescription")
City = WhatRS("address1_city")
County = WhatRS("address1_county")
ERPLastUpdate = WhatRS("ERPLastUpdate")
ParentAccount = WhatRS("parentaccountidname")
AccountId = WhatRS("accountid")
WhatRS_numRows = 0
WhatRS.Close()
 
'Return on the Account data to display
%>
<table width="260" border="0" cellspacing="1" cellpadding="1">
  <tr>
    <td width="80" class="title">Company</td>
    <td class="data"><% =Company %></td>
  </tr>
  <tr>
    <td width="80" class="title">Parent</td>
    <td class="data"><% =ParentAccount %></td>
  </tr>
  <tr>
    <td class="title">Revenue</td>
    <td class="data"><% =Revenue %></td>
  </tr>
  <tr>
    <td class="title">Employees</td>
    <td class="data"><% =Employees %></td>
  </tr>
  <tr>
    <td class="title">SIC</td>
    <td class="data"><% =SIC %>C</td>
  </tr>
  <tr>
    <td class="title">SIC Description</td>
    <td class="data"><% =SICDESC %></td>
  </tr>
  <tr>
    <td class="title">ERP</td>
    <td class="data"><% =ERP %></td>
  </tr>
  <tr>
    <td class="title">ERP Description</td>
    <td class="data"><% =ERPDESC %></td>
  </tr>
  <tr>
    <td class="title">ERP Last Update</td>
    <td class="data"><% =ERPLastUpdate %></td>
  </tr>
  <tr>
    <td class="title">City</td>
    <td class="data"><% =City %></td>
  </tr>
  <tr>
    <td class="title">County</td>
    <td class="data"><% =County %></td>
  </tr>
</table>
</td><td class="contacts" valign="top" width="170">
<%
dim FirstName, LastName, JobTitle, Phone
 
AddiContactSQL = "select c.firstname, c.lastname, c.jobtitle, c.telephone1 from FilteredContact c left join FilteredAccount a on c.accountid = a.accountid where a.accountid = '" & AccountId & "' order by c.lastname"
WhatRS_cmd.CommandText = AddiContactSQL
WhatRS_cmd.Prepared = true
 
Set WhatRS = WhatRS_cmd.Execute
WhatRS_numRows = 0
 
do while not WhatRS.eof
FirstName = WhatRS("FirstName")
LastName = WhatRS("LastName")
JobTitle = WhatRS("JobTitle")
Phone = WhatRS("telephone1")
 %><p><b><% =FirstName %>&nbsp;<% =LastName %>:</b>&nbsp;<% =JobTitle %>&nbsp;<% =Phone %></p><%
WhatRS.movenext
loop
 
WhatRS.Close()
%></td></tr></table>
</body>
</html>
<%
 
Set WhatRS = Nothing
%>
 

Mike Harrison | Technical Marketing Executive | Chelford Group Plc | Direct: 01256 685319 | www.chelfordgroup.com

 

Monday, October 29, 2007

MS CRM Improved Phonecall Screen for Telemarketing

Our telemarketers at the Chelford Group use CRM Phone Call activities for the majority of their correspondence with prospects and when making a phone call to the prospect they don't want to be clicking around for various bits of information about the prospect i.e. to Account info, Contact info etc and would ideally like all the information at hand on one screen.

We have tried various methods of tackling this issue but have decided to make use of an IFRAME on the PhoneCall screen to contain all of the additional information they might require.

More to follow on how we did this and what information we brought across.......

Wednesday, October 03, 2007

eMail Marketing - Landing Pads

A Landing Pad is intended to maximise conversion rates, it is the element of the campaign where the recipient responds to the call to action, whether that’s a white paper/case study/brochure download, registration for an event or simply data capture/cleanse where a visitor fills in an online form. Landing Pads are sometimes known as a microsite, which is specifically set up for a campaign, typically with its own campaign URL.

Define Landing Pad objectives, for example:
  • Achieve registration typically to generate a lead which leads ultimately to sale.
  • Profile and qualify the visitor in order to deliver more relevant follow-up marketing communications.
  • Explain the value proposition offered by the company to differentiate from other vendors the visitor may visit during the buying process i.e. ‘answer the visitor’s questions’.
  • Communicate the brand values of the organisation running the campaign.
  • If the visitor doesn't want to disclose their details at this time, provide contact details for traditional sales channels such as a phone number, or give the visitor reasons to visit the company website or engage them through other relevant content or offers.

Tips to Improve Your Landing Pad effectiveness

Define Your Conversion

Before you start to design your Landing Pad, define the conversion activity. For a newsletter Landing Pad, the conversion activity is entering an email address into a form and clicking “Accept.”

Repetition of email promotion

45% of Landing Pads don’t repeat the email's call to action. Repeating the email's message on a dedicated Landing Pad will help reinforce the conversion.

Match the creative

This is another way of reinforcing the conversion goal - matching the look and feel of the email will reassure the customer that they have arrived at the right place.

Use of forms

If you have to ask for customer data on the Landing Pad, make it clear why you need this information. Distractions kill conversions. Strip any unneeded elements from the page. Autofill fields where possible.

Research

Build a profile of your ideal visitor. Keep this person in mind when creating your Landing Pad and keep everything “on target.” Your email campaign funnels traffic to your Landing Pad, so visitors are expecting a very targeted message.

Stay Focussed

Avoid the urge to promote or link to other areas of your site. The point of the Landing Pad is to prevent your visitor from wandering. You want them converting, not clicking around to other parts of your site.

Important Elements Above the “Fold”

Pay attention to the virtual fold (the bottom of the screen before scrolling). Place enough content above the fold to allow your visitor to make a decision about your offer.

Lead the Eye

Use typography, colour and images to your advantage. You can be more creative on a Landing Pad than in an email. Place the important stuff (whether it’s your copy or your image) close to the middle, and never distract your user from that focal point.

Test, Test, Test

After you have finished the Landing Pad, test it with a small user group. Go over a checklist:o Is the Landing Pad focussed? o Does the message match the initial email? o Have you reduced all distractions? o Is critical information above the fold?

Monday, October 01, 2007

Exporting Account / Contact data for external e-marketing mailshots in Microsoft CRM

Most marketing departments perform some level of e-marketing email campaigns to try and boost lead levels. There are many companies that provide online portals for you to perform these email campaigns such as Purestone and Communigator.

Typically you would upload a .csv list of target email addresses and other information such as Firstname, Surname, Job Title and Company. Then create the email template to send in both Plain Text and also HTML versions. This template would most likely include a link or links to landing pad web pages on your website.

The portals provide tools for analysing the campaign results. They track email opens, click throughs to the landing pages, replies as well as bounces and unsubscribes.

The question is, how do you get this information back into Microsoft CRM?

Exporting data from CRM using the front-end to an external source is always going to be problematic when you want to re-import the data. You never can be 100% sure that the right record will be updated.

The is a solution however (there are probably lots of other but this is the one I use).

  1. Create a Marketing List in CRM with you targets on.
  2. Run a SQL query on SQL Server Management Studio to return the fields you want from the Marketing List: not only FirstName, Surname, EmailAddress etc but also return the GUID - the unique identifier of the record.
  3. Run your campaign on the portal ensuring that the GUID is a field in your .csv.
  4. Re-import the results back into MS CRM using a tool such as ImportManager from CRM Extensions. This tool allows you to Import Records using the GUID! - CRMs tools do not allow you to this.

Now you can 100% accurate with your re-importing!

Monday, July 02, 2007

User Authentication settings in MS CRM

To ensure User Authentication works in CRM, users must have their Internet Explorer settings set up to allow it.

In IE go to Tools > Internet Options > Security > Local Intranet > Custom Level

and scroll down to the User Authentication options. Set "Automatic Logon only in Intranet Zone" or "Automatic Logon with current username and password".

MS CRM bypass the "The webpage you are viewing is trying to close the window" issue

To bypass the "The webpage you are viewing is trying to close the window" prompt in Microsoft CRM, change your shortcut to:

http://crm/loader.aspx

where "crm" is your usually crm url.