CRM Best Practice Webinar was a hit

by Bill Owens 2. September 2011 02:07

We held our first webinar on CRM Best Practices. Follow this link to sign up to be notified for the next events and to download the webinar and handouts.

Here is a quote from one of the attendees

“I attended today’s webinar and found it really useful.  It was clear, well organized and presented a lot of important information. Most webinars disappoint.  Yours delivered.”

Affiliated will be hosting a series of free CRM 2011 webinars just for you. The CRM Best Practices webinar series topics will include:
• Workflows
• Dialogs
• Advanced Find
• Reporting (online)
• Dashboards
• Goals

the webinar above was the 50,000 overview of these topics and best practices.

Tags: , , ,

CRM 2011 | CRM 4.0

On-Premise multi-organization SQL job

by Bill Owens 29. June 2011 22:33

I have a client with 20+ organizations on their CRM server and I just ran into an issue where we really needed to issue un update SQL command against all of the CRM’s currently installed on the server. In this case we needed to update the Case’s subjectid if it was not filled in and there is a kb article attached to the case. The KB Article has the subjectid we need to update into the case entity. I must also add this is CRM 4.0 On-Premise. I playing around I created the following script that reads the MSCRM_CONFIG DB for the organization databases and then dynamically executes an update to the databases

-- =============================================
-- Author:        Bill Owens    
-- Create date: 6/29/2011
-- Description:    Update all of the Case Subjects with the KB Article's Subject
-- =============================================
SET NOCOUNT ON;
DECLARE @DB as Varchar(100)
DECLARE @SQL AS nVarChar(4000)
DECLARE Org_Cursor CURSOR FOR
    SELECT     DatabaseName
    FROM         mscrm_config.dbo.Organization
    WHERE     (IsDeleted = 0)
OPEN Org_Cursor;
FETCH NEXT FROM Org_Cursor into @DB;
WHILE @@FETCH_STATUS = 0
   BEGIN
        SET @SQL = 'Select count(*) as cnt from ' + @DB +'.dbo.AccountBase'
        set @SQL = 'UPDATE IncidentBase SET SubjectId = KbArticleBase.SubjectId FROM '+@DB +'.dbo.IncidentBase INNER JOIN '+@DB +'.dbo.KbArticleBase ON IncidentBase.KbArticleId = KbArticleBase.KbArticleId WHERE('+@DB +'.dbo.IncidentBase.SubjectId IS NULL) AND (NOT ('+@DB +'.dbo.IncidentBase.KbArticleId IS NULL))'
        EXEC sp_executesql @SQL
      FETCH NEXT FROM Org_Cursor into @DB;
   END;
CLOSE Org_Cursor;
DEALLOCATE Org_Cursor;

. FYI, cross scripting needs to be turned on on the SQL server for this to work.

Tags: ,

CRM 4.0

Deleted Records hanging in there! Forcing the delete job

by Bill Owens 22. July 2010 23:46

Here is a scenario for you to ponder..

  1. You have a separate database with accounts in them that need to be uploaded to MSCRM.
  2. You use the DDM or write your own application to load the data into MSCRM
    • You use the key (a GUID) from the data being imported as the new key in CRM. Yes you can pass in the key GUID you want to create the record for.
  3. You realize you need to make some changes.
  4. You delete the records in MSCRM using the screens
  5. You try the import and it fails telling you you have a duplicate key.
  6. You search the screens thinking you did not delete them only to find out you did.

What happens when you delete a record in MSCRM is that the record is flagged with a 2 in the deletion State Code and a daily job runs that will clean up and perform all of the deletions.

So no the question, how do you force the deletion job to run NOW.

Well it is not hard.

Run the following SQL on your SQL Server

 

USE MSCRM_CONFIG 
 
UPDATE ScaleGroupOrganizationMaintenanceJobs 
SET NextRunTime = getdate()
WHERE OperationType = 14 

then restart the Microsoft CRM Asynchronous Service

 

 

I would suggest that after you are done you revisit this and set the next date/time to sometime in the evening well before backups so that the job runs normally after hours.

Tags:

CRM 4.0

Custom workflow action which renders and sends a report for Microsoft Dynamics CRM 4.0 with email

by Bill Owens 15. July 2010 22:50

I found this on Andriy Butenko’s blog and it looked like a very good article to share. Way to go Andriy. His post can be found here  .


Tuesday, August 04, 2009

Custom workflow action which renders and sends a report for Microsoft Dynamics CRM 4.0 with email

Idea of this custom workflow action is following:
1. Give user possibility to run and export report in one action.
2. Insert this exported report as attachment into email.
3. Sent this email to recipient.

I've created a new project. Type of project is 'Class Library', Framework - 3.0.
First step is to add all required references to reporting service, Workflow assemblies and CRM assemblies:
Reporting Services:


Workflow assemblies:

And Microsoft CRM SDK assemblies.
As a result I retrieved such project:

Second step - is to create a custom workflow action which does't have a required code but can be deployed to CRM. So the code of such class:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Workflow;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
 
namespace SendReportAction
{
    [CrmWorkflowActivity("Execute and send a report")]
    public class SendReport : SequenceActivity
    {
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            return ActivityExecutionStatus.Closed;
        }
    }
}

Next step is to declare properties for worflow action (url of reporting services web service, report to run, recipient of email with report - in my case a systemuser):
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Workflow;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
 
namespace SendReportAction
{
    [CrmWorkflowActivity("Execute and send a report")]
    public class SendReport : SequenceActivity
    {
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            return ActivityExecutionStatus.Closed;
        }
 
        public static DependencyProperty ServiceURLProperty = DependencyProperty.Register("ServiceURL", typeof(string), typeof(SendReport));
 
        [CrmInput("ServiceURL")]
        public string ServiceURL
        {
            get
            {
                return (string)base.GetValue(ServiceURLProperty);
            }
            set
            {
                base.SetValue(ServiceURLProperty, value);
            }
        }
 
        public static DependencyProperty ReportNameProperty = DependencyProperty.Register("ReportName", typeof(string), typeof(SendReport));
 
        [CrmInput("ReportName")]
        public string ReportName
        {
            get
            {
                return (string)base.GetValue(ReportNameProperty);
            }
            set
            {
                base.SetValue(ReportNameProperty, value);
            }
        }
 
        public static DependencyProperty MailRecipientProperty = DependencyProperty.Register("MailRecipient", typeof(Lookup), typeof(SendReport));
 
        [CrmInput("MailRecipient")]
        [CrmReferenceTarget("systemuser")]
        public Lookup MailRecipient
        {
            get
            {
                return (Lookup)base.GetValue(MailRecipientProperty);
            }
            set
            {
                base.SetValue(MailRecipientProperty, value);
            }
        }
    }
}
 
Next step - is to write code which will create an email:
if (MailRecipient != null && !MailRecipient.IsNull && !MailRecipient.IsNullSpecified)
            {
                IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService));
                IWorkflowContext workflowContext = contextService.Context;
                ICrmService crmservice = workflowContext.CreateCrmService();
 
                email mail = new email();
 
                activityparty fromparty = new activityparty();
                fromparty.partyid = new Lookup();
                fromparty.partyid.type = EntityName.systemuser.ToString();
                fromparty.partyid.Value = workflowContext.UserId;
                mail.from = new activityparty[] { fromparty };
 
                activityparty toparty = new activityparty();
                toparty.partyid = new Lookup();
                toparty.partyid.type = EntityName.systemuser.ToString();
                toparty.partyid.Value = MailRecipient.Value;
                mail.to = new activityparty[] { toparty };
 
                mail.subject = "Report Subscription";
                mail.sender = "crm@example.com";
 
                mail.description = "Report Subscription";
 
                mail.ownerid = new Owner();
                mail.ownerid.type = EntityName.systemuser.ToString();
                mail.ownerid.Value = workflowContext.UserId;
                Guid createdEmailGuid = crmservice.Create(mail);
            }

Next step is to execute and export report:
Reporting.SessionHeader sessionheader = null;
                byte[] result;
                string encoding;
                string mimetype;
                Reporting.ParameterValue[] parametersUsed = null;
                Reporting.Warning[] warnings;
                string[] streamids;
 
                BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
                binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
                binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
                binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
                binding.Security.Transport.Realm = string.Empty;
                EndpointAddress endpoint = new EndpointAddress(ServiceURL);
            
                Reporting.ReportingServiceSoapClient client = new Reporting.ReportingServiceSoapClient(binding, endpoint);
                client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
            
                client.Render(ref sessionheader, ReportName, "Excel", null,
                null, null, null, null, out result, out encoding, out mimetype,
                out parametersUsed, out warnings, out streamids);

Next step is to attach retrieved file to the email:
activitymimeattachment attach = new activitymimeattachment();
                attach.activityid = new Lookup(EntityName.email.ToString(), createdEmailGuid);
                attach.body = System.Convert.ToBase64String(result);
                attach.subject =
                attach.filename = "Report.xls";
                attach.filesize = new CrmNumber(result.Length);
                attach.mimetype = @"application/vnd.ms-excel";
 
                crmservice.Create(attach);
 
And sent the email:
SendEmailRequest sendrequest = new SendEmailRequest();
                sendrequest.EmailId = createdEmailGuid;
                sendrequest.TrackingToken = "";
                sendrequest.IssueSend = true;
 
                crmservice.Execute(sendrequest);
 


Full code of this custom workflow action:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Workflow;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using System.ServiceModel;
using System.Security.Principal;
 
namespace SendReportAction
{
    [CrmWorkflowActivity("Execute and send a report")]
    public class SendReport : SequenceActivity
    {
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            if (MailRecipient != null && !MailRecipient.IsNull && !MailRecipient.IsNullSpecified)
            {
                IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService));
                IWorkflowContext workflowContext = contextService.Context;
                ICrmService crmservice = workflowContext.CreateCrmService();
 
                email mail = new email();
 
                activityparty fromparty = new activityparty();
                fromparty.partyid = new Lookup();
                fromparty.partyid.type = EntityName.systemuser.ToString();
                fromparty.partyid.Value = workflowContext.UserId;
                mail.from = new activityparty[] { fromparty };
 
                activityparty toparty = new activityparty();
                toparty.partyid = new Lookup();
                toparty.partyid.type = EntityName.systemuser.ToString();
                toparty.partyid.Value = MailRecipient.Value;
                mail.to = new activityparty[] { toparty };
 
                mail.subject = "Report Subscription";
                mail.sender = "crm@example.com";
 
                mail.description = "Report Subscription";
 
                mail.ownerid = new Owner();
                mail.ownerid.type = EntityName.systemuser.ToString();
                mail.ownerid.Value = workflowContext.UserId;
                Guid createdEmailGuid = crmservice.Create(mail);
 
                Reporting.SessionHeader sessionheader = null;
                byte[] result;
                string encoding;
                string mimetype;
                Reporting.ParameterValue[] parametersUsed = null;
                Reporting.Warning[] warnings;
                string[] streamids;
 
                BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
                binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
                binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
                binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
                binding.Security.Transport.Realm = string.Empty;
                EndpointAddress endpoint = new EndpointAddress(ServiceURL);
            
                Reporting.ReportingServiceSoapClient client = new Reporting.ReportingServiceSoapClient(binding, endpoint);
                client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
            
                client.Render(ref sessionheader, ReportName, "Excel", null,
                null, null, null, null, out result, out encoding, out mimetype,
                out parametersUsed, out warnings, out streamids);
 
                activitymimeattachment attach = new activitymimeattachment();
                attach.activityid = new Lookup(EntityName.email.ToString(), createdEmailGuid);
                attach.body = System.Convert.ToBase64String(result);
                attach.subject =
                attach.filename = "Report.xls";
                attach.filesize = new CrmNumber(result.Length);
                attach.mimetype = @"application/vnd.ms-excel";
 
                crmservice.Create(attach);
 
                SendEmailRequest sendrequest = new SendEmailRequest();
                sendrequest.EmailId = createdEmailGuid;
                sendrequest.TrackingToken = "";
                sendrequest.IssueSend = true;
 
                crmservice.Execute(sendrequest);
            }
 
            return ActivityExecutionStatus.Closed;
        }
 
        public static DependencyProperty ServiceURLProperty = DependencyProperty.Register("ServiceURL", typeof(string), typeof(SendReport));
 
        [CrmInput("ServiceURL")]
        public string ServiceURL
        {
            get
            {
                return (string)base.GetValue(ServiceURLProperty);
            }
            set
            {
                base.SetValue(ServiceURLProperty, value);
            }
        }
 
        public static DependencyProperty ReportNameProperty = DependencyProperty.Register("ReportName", typeof(string), typeof(SendReport));
 
        [CrmInput("ReportName")]
        public string ReportName
        {
            get
            {
                return (string)base.GetValue(ReportNameProperty);
            }
            set
            {
                base.SetValue(ReportNameProperty, value);
            }
        }
 
        public static DependencyProperty MailRecipientProperty = DependencyProperty.Register("MailRecipient", typeof(Lookup), typeof(SendReport));
 
        [CrmInput("MailRecipient")]
        [CrmReferenceTarget("systemuser")]
        public Lookup MailRecipient
        {
            get
            {
                return (Lookup)base.GetValue(MailRecipientProperty);
            }
            set
            {
                base.SetValue(MailRecipientProperty, value);
            }
        }
    }
}

Next step is to build and publish developed custom workflow action:

And now I can use this step in CRM. As an example I'll create on demand workflow which will send 'Contacts' report (this report have no parameters but my custom workflow action can be extended with parameters to be used in report).
This workflow:




Save and publish it and the result of work:






As you see - this works. But there is one trick. To make this workflow action work you have to run Microsoft CRM Asynchronous Service under account which have access to Reports used in the workflow.

Posted by Andriy a33ik Butenko

Tags: , ,

CRM 4.0

The Forrester Wave: CRM Suites For Midsized Organizations, Q2 2010

by Bill Owens 14. July 2010 17:14

Microsoft Dynamics CRM is looking good according to the Forester Wave report. Click here to download The Forrester Wave report

fw 

“Microsoft Dynamics CRM shines by offering flexibility for large and midsized organizations.
Microsoft seeks to exploit its desktop applications strength in large organizations and promote
its now-more-robust business applications to this sector. As a result, Microsoft is pursuing its
strategy for penetrating the CRM market through offering buyers the “Power of Choice” so
that companies may choose how to deploy (on-premises, on-demand, partner-hosted), how
to pay (license, subscribe, finance), and how to use (Outlook client, browser, SharePoint site,
other interfaces) the application. The product competes well on price compared with its major
competitors, and this favorable price/value profile is capturing buyer interest at midsized
organizations — and in the large-organization segment, as well. The product provides very
strong sales force automation and strong capabilities in the areas of marketing automation,
customer data management, customer service, and analytics. But it is weaker in eCommerce,
partner channel management, and field service. The product is relatively easy to configure and
deploy, and the solution’s code is the same regardless of deployment choice, so migration from
one deployment type to another is relatively easy.
Microsoft Dynamics CRM lacks industry-specific solution sets at this time. However, Microsoft
is investing substantially in growing its already strong global partner ecosystem to help
customers address local and industry-specific requirements. To accomplish this, Microsoft is
revamping its partner program and creating a new incentive structure, more rigorous training,
and certification assets. Buyers will be attracted to Microsoft Dynamics CRM if they have
made a commitment to a Microsoft infrastructure in order to lower their TCO in buying and
managing business technologies. Buyers also like Microsoft Dynamics CRM’s usability, lower
price, and its quick time-to-value compared with traditional CRM applications.“

This is a copy from the
June 16, 2010  The Forrester Wave™: CRM Suites For Midsized Organizations, Q2 2010 by Forrester Research, Inc.

Tags:

CRM 4.0

Oh Where, Oh Where has my room gone!

by Bill Owens 12. July 2010 18:03

                Several of my clients have asked me to look into the ever growing MSCRM Database to figure out what is taking up all of the space. With all of the knowledge base articles talking about workflows eating up the database, it is very easy to say Workflows. However, with a little digging you may sometimes be surprised. I have found that with the advent of a very easy to use Outlook to CRM interface and a one-click button to push up emails, a closer look at the emails in CRM my revile your data munching monster.  Frankly, it is all of the attachments to the emails that add up quickly.

                These attachments are sometimes half of the database size. This bloated table will cause issues with backup and recovery. So, for a client of mine I have proposed the following solution:

  • Any mime attachment over X days old
    • Move to another document repository
    • Replace with a html page that redirects to Document Repository and loads the document through the web
    • Overwrite the Mime Attachment in CRM to add .html to the end of the file name and load the HTML redirect page into the document data
  • Document repository system
    • Database
      • Holds attachments
      • Use CRM Attachment GUID as the Key
    • Webpage
      • Retrieves the Attachment GUID in the URL
      • Looks up from the database the documents
      • Returns the document as a file

This solution will off load the data into another database easing the restore of the CRM database as needed. The user experience will be a flicker as the html redirects to another system to return the document. The end result will be two databases and the same amount of data to be backed up and restored for a full restore. However, the large mime attachment database is not as critical as the CRM database and CRM can come up quicker.

Tags:

CRM 4.0

Workflow Best Practices – Reduce Wait time

by Bill Owens 29. May 2010 00:56

As many of you know, the more items you have in a wait state in MSCRM the slower the system can perform. On of the best practices is to wake up every so often and perform your check and go back to sleep if the condition doesn’t meet.

 

Example:

Case: Wait 7 days and if the Status is not Completed then Send an escalation Email.

Best Practice would have workflow do some thing like this. (This is pseudo code)

Wait 1 day
If Status = Close then Stop Workflow
Wait 1 day
If Status = Close then Stop Workflow
Wait 1 day
If Status = Close then Stop Workflow
Wait 1 day
If Status = Close then Stop Workflow
Wait 1 day
If Status = Close then Stop Workflow
Wait 1 day
If Status = Close then Stop Workflow
Wait 1 day
If Status = Close then Stop Workflow
Send Escalation Email

Well, what if you wanted to change the durations from 7 days to 3. Worse yet, this is a 30 day wait process with 30 of those wonderful lines. The answer is that you can change the workflow, but all of the currently running workflows will still have the old code instantiated and they need to work through.

I came up with another method, some of you may have done the same, to make this more manageable.

 

I added to the case 3 fields.

  • Escalation – Next Wake up
    • This is a date and time for the workflow to next wake up
  • Escalation – Wakeup Count
    • This is an integer that tells you how many times the workflow has waited
  • Escalation – Escalation On
    • This is an integer that when the Escalation – Wakeup count is equal to or greater than it escalates

image

Putting it together in a workflow

Create a workflow for cases

eee

Change the Scope to Organization and check off the As a Child Workflow

Startwf

Add a check condition step to check the case Escalation – Next Check is blank.

checkwfes

Add under the if statement un update to the case Escalation – Next Check to be create on date time and set the Escalation – Wakeup Count to 1 plus the Escalation – Escalate On to 7 (1 week)

 

wf2

 wf33

Now on a new line add the Add 1 day to the Escalation – Next Check

wf4

wf3

Add the Wait till Escalation Next Step

wf5

wf6

Now do your check to see if the condition is right to quit this workflow. In this case if the case is not active then we do not need to escalate. Stop the workflow if it is true.

wf8

Now add the escalation logic. If Escalation - Wakeup Count is => Escalation - Escalate on then send escalation and stop

wf9

Add 1 to the Escalation - Wakeup Count. Add un update to the case

wf12

image

It should look like this

wf10

Now add the last step and that is to call this workflow . NOTE. You will need to save the workflow before you can call it.

wf14

 

Publish and now try it. You will find that it is easier to update the Escalation process even on items currently running. Plus you have an easy way to force many workflows to stop within a day if needed. Enjoy and I hope this helps.

 

Bill Owens

Tags: ,

CRM 4.0

CRM Update Rollups - Which Files Should I Apply?

by Bill Owens 27. May 2010 18:37

Microsoft has settled on an every-other-month release schedule for CRM Update Rollups.  The update rollups are released as a set of files meant for updating different CRM components.  Here are some guidelines to help you understand what each available file is meant for and whether or not you will need to apply it to your CRM system.  This post is specific to CRM On-Premise only!

  1. The first thing to understand is the file naming convention.  The files are currently named as follows:

    (CRM Major Version) - (Knowledge Base Article) - (Hardware Platform) - (CRM Component) - (Language ID).exe

    So an example filename such as this: CRMv4.0-KB979347-i386-Server-ENU.exe tells us that this file is meant for application to a CRM 4.0 Server running on a 32-bit platform in the English (US) language.  In addition, it lets us know that KB979347 is the knowledgebase article that provides the details for this Update Rollup file.


  2. The possible platform values are i386 or amd64.  If your hardware is 32-bit you will want the i386 files.  If your hardware is 64-bit you will want the amd64 files.


  3. The possible CRM Component values are:

  4. Client - The CRM Outlook Client
    DMClient - The CRM Data Migration Manager (also known as the Data Migration Wizard)
    MUI - The Multi Lingual User Interface Pack
    Router - The CRM Email Router
    Server - The CRM Server
    SRS - The SQL Server Reporting Service Connector for CRM

  5. The final thing to understand is which of the above components you need for your specific environment.  Well everyone (running an on-premise system) requires the server file.  If you have CRM Outlook clients you will need to apply the Client update to your CRM Outlook Client machines.  Most organizations do not require the CRM Data Migration Manager Rollup file unless they are using that tool to migrate data into CRM.  If your system is not multinlingual you obviously do not need the Multi Lingual User Interface Pack Rollup file.  If your system CRM email is handled by the CRM Email Router then the Router file must be applied to the machine running the CRM Email Router.  Finally, if you have an IFD (Internet Facing Deployment), you will need to apply the SRS file to the machine running the SSRS Connector for CRM so that your users can view reports over the web.  If your system is not exposed to the internet, you will not need to apply the SRS file.

Tags: , , , , ,

CRM 4.0

Time is money!, EService accelerator to the rescue

by Bill Owens 26. May 2010 19:23

Time is money!, this old axiom is well known in the business world and has always remained a core truth. Every time one of your customer service representatives picks up the phone and says, “How may I help you”, money is spent. It may be the 10 minutes on the phone collecting the answers from simple questions to documenting the answers to the questions for future billing or lessons learned. The net result is every time the phone rings your company spends money.

How would a company battle this known fact with their customer server? You must provide customer Service to your customers to keep the money coming in, it’s the money out we want to try to curtail. A simple yet effective answer to this would be to have the Customer share in the cost of Customer Service. To effectively accomplish this you can offer them a service which allows for:


        Easy entry of cases
        Ability to instantly know the status of the case
        Communicate with the support person via the service
        Search and Schedule available service offerings
        Search a Knowledgebase of company articles
        Update their contact information
        Update Account information
        Custom Case escalations

The sell to the customer is fairly simple, we provide you with a website on which you sign up and you can do all of the above without being put on hold.

Welcome eService from Microsoft Accelerator’s repository. The eService Accelerator is a free set of code that Microsoft has given to the community and can be download from http://crmaccelerators.codeplex.com/. You must be running Microsoft CRM 4.0 to utilize this Accelerator, plus it is would only be fair to mention that it can take a while to setup for each company. The application itself only take about 4-6 hours to get working correctly in your environment, the time comes into the equation when you want it to look like it is part of your company. This is usably called skinning in the web world and can take time to get correct.

What is eService?

The eService accelerator is a set of .Net code that will reside on a .Net website that your company will host and allow access from the internet (where your customers are). The accelerator is made up of 2 accelerators, the first being the Portal Server Accelerator which allows access and customizations against Microsoft CRM 4.0. The Second is the rest of the eService accelerator, which provides what are called user controls. These user controls are NotesEditor , CasesGrid , CaseEditor , KBSearch , NewEntity , ViewKBArticle , ServiceScheduler , ProfileEditor , CreateUserAccount , and Login. In a nutshell, they are prewritten, self contained programs that allow simple access to the CRM system. So, if you have a web programmer that has created .Net pages they will understand what these controls and how to use them.

How do customers sign up?

The portal uses the ASP.NET membership provider (http://msdn.microsoft.com/en-us/library/ms998347.aspx) – it handles encryption/account management etc (in short, it keep you and your company away from managing user names and passwords). Web portal customers are invited to be a web user, there is no mechanism to sign up independently. The invitation process is triggered via workflow when the Microsoft Dynamics CRM contact’s eservice access level field is set accordingly.

What do I need to install eService? 
 

  • The following is a list of items you will need to install the CRM eService Accelerator:
  • A preinstalled and configure installation of Microsoft Dynamics CRM 4.0.
  • A web server that is running
    • IIS.
    • .Net 2.0 or above.
    • An internet accessible address for the eService Portal to use.   This server must have access to your CRM server via http(s). If you are in a DMZ some firewall configurations will be needed.
  • A .Net developer who can create a Master Page
    • This is a critical piece of the puzzle. If you are not familiar with user controls and master pages you will need to do some homework or find someone to help.
  • SQL Server 2005 or 2008

Walk Through of eService:

Customer is marked as an eService user

In order for the customer to receive their welcome aboard email, someone must set them up in CRM as an eService user. There are two levels, contact and account. If the user is signed up as a contact level, then they will only see their cases and items. If the user is signed up as an account level, then they will see all cases within the account and the other users who have access.

clip_image002

Once you make the change above an email is sent to the user. This email will need to be customized for your business and can be found in the CRM workflows.

Customer Sign up

The customer will receive an email like the one below. Please not you will have modified it for your organization before they get it. This is just an example.

clip_image004

The user will click on the link provided and go to your Create User Account page. The following pages are using the Small Business Starter Kit solution which creates the Fabrikam website. This is a sample website with three columns. I would recommend one with 1 or 2 columns at the most for the eService.

clip_image006

The email and information filled in on this page are not stored in CRM but in the .Net Membership Services Database.

Once the user logins

It will is customary to create a landing page for the user see when they first log in. This page is up to you and your design team as to what appears. My recommendation would be to create an announcement block so you can broadcast information to everyone logging in. Also with any other useful links to information for your customers.

Add a case

In whatever menu system you choose to add to your site, you will have the user open a new case. The page will allow for the creation or editing of the case, which reduces code complexity for you.

clip_image008

You may at this point be wondering what fields will show up here. That piece is configurable by the system administrator who sets up the eService. In CRM there is an eService console that you can edit which fields to show on the screen and grids, plus attributes like read-only. The following screen shows this page:

clip_image010

There are only two downsides to the choices. You cannot have lookup fields on the page nor can you show the status fields. What I have done in the past is to create three text fields, current user, current customer, and current status. Then I have work flow monitor changes to user, parent customer, and status reason and update the appropriate text fields. These fields can then be put on the screen and grid as read-only. Not perfect, but a workaround.

The other added feature here is that you have the ability to utilize the powerful workflow engine within CRM to have custom case escalations. Example, if a case is opened up as a high priority then email the Customer Service Manager immediately, or if a case is not resolved in 1 day email and escalate to the level 2 support team.

Adding Case Notes

Case Notes are notes that are added to a case record. An eService Case Note can be viewed by all of your users within the account that have access to the case Example, Jane Doe is setup as a User level access for Account ABC Company. She has a case and enters a note. She can see the case, but if Bob Parker is setup as an account level user for ABC Company, then he can also see the note. Also, these notes are viewable within CRM by any who has read access to the case. One of the first questions is can we have private notes within the organization; we do not want the customer to see these notes. The answer is yes, every note on a case that is viewable on the eService portal is prefixed with a *WEB*. So by default, if you are a Customer Service rep and you want to enter a note that is not viewable by the customer, do not start the note with a *WEB* and they will never see it. Use notes to store information, such as comments or ideas, or to share information with the support team working on your case. Web portal customers can easily add Case Notes by simply opening any pre-existing Case, adding their Note and hitting Create New Note.

clip_image012

Summary:

There are several other items that can be performed by the eService Accelerator, they are:

  • Edit Account info (Works like edit Case)
  • Edit Contact into ((Works like edit Case)
  • Search Knowledge Base
    • Key word search through the CRM knowledgebase. There is a built in ability to have the system email you the kb article.
  • Schedule a service activity.
    • If you are using the service piece of CRM you can allow the user to find available times and schedule a service call.

By employing an external website and utilizing the eService Accelerator you can provide a 21 century Customer Service channel to your organization that will increase your effectiveness, help provide metrics, and reduce phone support costs.

 

Bill Owens

www.aresgrp.com

Tags: , ,

CRM 4.0

Microsoft Dynamics CRM Adapter for Microsoft Dynamics GP Released!!

by Bill Owens 31. October 2009 19:02

East Region Microsoft CRM

After months of hard work, a very successful Partner TAP (Technology Adoption Program) as well as a Customer BETA program, this adapter has released and is generally available for US installs of Dynamics GP 10.0 and CRM 4.0.

This is an entirely new adapter redesigned from the ground up to utilize web services and eConnect and provides “…an out of the box, lightly extensible data integration tool.”  The adapter will be offered to registered Microsoft Dynamics GP Partners at no charge, though it must be ordered through the standard Microsoft Dynamics GP ordering process so we can keep track of who is using the adapter and will therefore want any updates and additional information.

Here are the main points:

Easy to Implement

· Wizard driven installation

· System Preparation Tool

· Lightweight footprint that utilizes web services and eConnect

-Web Service to web service integration

Easy to Use

· Eight out-of-the-box CRM to ERP Mappings

Easy to Customize

· Wizard driven custom mapping

Additional Information Regarding the Adapter:

For Partners and Microsoft Team Members (Information will be updated as it is available):

https://mbs.microsoft.com/partnersource/partneressentials/partnerreadiness/resourcing/MDCRMGPAdapter.htm

For Existing Customers (Information will be updated as it is available):

https://mbs.microsoft.com/customersource/worldwide/us/productinformation/factsheets/MDCRMGPAdapter

The first Partner Readiness training class is tomorrow; register at the link below:

https://training.partner.microsoft.com/learning/app/management/LMS_ActDetails.aspx?UserMode=0&ActivityId=551516

Tags: , , ,

CRM 4.0

Page List

About the author

I work for a consulting firm in Dublin Ohio called Affiliated Resource Group. For the last five years I have been spearheading our Microsoft Dynamics CRM practice. I have a deep appreciation for the Microsoft CRM platform and I am very excited about it. You might even describe me as a Microsoft CRM Advocate. I have many battle scars from my experience with the product and I’m constantly being asked questions about CRM and how-to-do something in it. Hence, this BLOG is to help disseminate that knowledge and information to everyone. As of last year I was posting links to many other blogs to help spread the knowledge, but now with the community.dynamics.com doing that for me, I will be following that practice unless a really juicy article catches my eye. Many people have asked where my post are for the first half of 2010, my company had me posting to another blog and maintain two was near impossible. I am now down to just this blog. So good luck and I hope that this blog may help in some way. If you have suggestions or questions, please email me them.

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2012 BillOnCRM