We have been there as client, consultant or designers: “We need to have a dashboard to monitor the performance of X.”

Dashboards is the best feature to have a quick grasp on system for accessing information. Effective dashboards are a great asset to any organisation.

Here are 5 tips to effective dashboards in Dynamics CRM:

Choose Performance Indicators that matter

Is the dashboard displaying the appropriate key performance indicators (KPIs) for the target users?”

Ensure you are visualizing the right information for the dashboard users.

Keep it visual

The human brain processes numbers and images as discrete “chunks” of information. As a result, reports and tables filled with numbers are difficult

and time consuming to process. However, a single chart or graph can be comprehended almost immediately.

Are the key performance indicators presented in the most effective possible format?” Could another visual make it easier/faster for the viewer to understand what is happening?

Would another visualization take up less space on the dashboard? Display your data in the most effective/efficient way possible.


Keep it current

Make sure that the data underlying your dashboard is up-to-date and that your selected metrics reflect current business challenges.

Data can be from this quarter, this week, this hour whatever the right timeline is for your business. Stale data can lend a false sense of confidence to decisions.

Make Security related decisions Smartly

This one is critical. It doesn’t matter if you’ve mastered the list above, no one will use

your dashboard if they can’t get to it. The choice to choose which dashboards need to be personal

and which system dashboards are used is most important need here.It should be ideally default tab when users open their CRM system.

Understand your target users and their needs

This one is important as well. The needs for user specific areas for Sales, Marketing, Service or XRM based for some other use.

A good reference is to see the out of box references provides under each Module in CRM.

Hope it helps!


{Advanced XRM DEVELOPMENT}Embedding Audit Log in Dynamics CRM email/text area

Scenario: User wants to see audit trail of record in email for some particular account notifications.

Solution : Custom ribbon button calls plugin(I am only posting code relevant to retrieve Audit Logs) which has following functions:

//The below function returns single Audit Record detail

private static string DisplayAuditDetails(AuditDetail detail)


            // Write out some of the change history information in the audit record.

            Audit record = (Audit)detail.AuditRecord;


            StringBuilder sb = new StringBuilder();


            sb.Append(“\nAudit record created on: {0}” + record.CreatedOn.Value.ToLocalTime());

            sb.Append(string.Format(“Entity: {0}, Action: {1}, Operation: {2}”,

                record.ObjectId.LogicalName, record.FormattedValues[“action”],



            // Show additional details for certain AuditDetail sub-types.

            var detailType = detail.GetType();

            if (detailType == typeof(AttributeAuditDetail))


                var attributeDetail = (AttributeAuditDetail)detail;


                // Display the old and new attribute values.

                foreach (KeyValuePair<String, object> attribute in attributeDetail.NewValue.Attributes)


                    String oldValue = “(no value)”, newValue = “(no value)”;


                    //TODO Display the lookup values of those attributes that do not contain strings.

                    if (attributeDetail.OldValue.Contains(attribute.Key))

                        oldValue = attributeDetail.OldValue[attribute.Key].ToString();


                    newValue = attributeDetail.NewValue[attribute.Key].ToString();


                    sb.Append(string.Format(“Attribute: {0}, old value: {1}, new value: {2}”,

                        attribute.Key, oldValue, newValue));



                foreach (KeyValuePair<String, object> attribute in attributeDetail.OldValue.Attributes)


                    if (!attributeDetail.NewValue.Contains(attribute.Key))


                        String newValue = “(no value)”;


                        //TODO Display the lookup values of those attributes that do not contain strings.

                        String oldValue = attributeDetail.OldValue[attribute.Key].ToString();


                        sb.Append(string.Format(“Attribute: {0}, old value: {1}, new value: {2}”,

                            attribute.Key, oldValue, newValue));





            return sb.ToString();



        //The below function returns complete Audit Detail for a single record

        private static string GetAuditDetails(string entityLogicalName, Guid entityId,IOrganizationService service)



            RetrieveRecordChangeHistoryRequest changeRequest = new RetrieveRecordChangeHistoryRequest();

            changeRequest.Target = new EntityReference(entityLogicalName, entityId);


            RetrieveRecordChangeHistoryResponse changeResponse =



            AuditDetailCollection details = changeResponse.AuditDetailCollection;


            StringBuilder final = new StringBuilder();


            for (int i = 0; i < details.AuditDetails.Count; i++)


                // Display some of the detail information in each audit record.

                if (details.AuditDetails[i].GetType().ToString() == “Microsoft.Crm.Sdk.Messages.AttributeAuditDetail”)




            return final.ToString();



Function call :

string auditText = GetAuditDetails(“account”, new Guid(“A3627A42-5994-E411-80E1-C4346BACCF7C”), service);

//auditText can than be embedded in emails.


Hope it helps!