Skip to content

Category: Dynamics 365

Best practices for ClickDimensions deployment

Posted in Dynamics 365, ClickDimensions, and Power Platform

Table of content

  1. Basics
  2. Deployment
  3. Customizing
  4. Transport
  5. Updates
  6. Redeployment

1. Basics

ClickDimensions is only accessible and configurable through Dynamics 365 Customer Engagement. This is achieved through CRM records (forms, templates, emails, etc.) that are linked by their GUID and the CRM instance specific ClickDimensions account key to an ClickDimensions editor/designer that stores its content in the ClickDimensions cloud infrastructure on Azure.

Like Microsoft, ClickDimensions provides its customers sandboxes and additional production instances for their Dynamics 365 CE environment.
A sandbox instance is hereby fully functional and can send out an email blast to your CRM records like any production instance. It’s not a safe playground if your test environment is a copy of the productive data.

2. Deployment

After purchase, you register for a ClickDimensions cloud instance(s) with your CRM instance(s). Afterwards, you will receive an email with a download link for a Dynamics 365 solution for each of your registered ClickDimensions instances. Make sure not to mix up them with your CRM instances, because the ClickDimensions account key fix embedded in the ClickDimensions solution. The same applies later to updates.

Create a backup solution in Dynamics 365 save ribbon customizations on account, campaign, contact, lead, list, opportunity, team and systemuser. Add only the required entities with their metadata to keep the solution as clean as possible.

If you have Dynamics 365 CE instances that will have no ClickDimensions Instance – like a development environment, you can import any of the ClickDimenions solutions to have the same customizing for all Dynamics 365 instances

3. Customizing

The CRM parts of ClickDimensions can be customized like any other CRM elements. Avoid customizing of views and form sections, they could be overwritten during an update.

Don’t forget to publish the metadata to the ClickDimensions cloud if you created fields that should be accessible through ClickDimensions.

Processes that you build on top of ClickDimensions processes, will have no influence on the ClickDimensions cloud. A campaign automation instance that has a posted form as an entry point, will still run with the same contact from the start, even if you updated it on the posted form in CRM.

4. Transport

The ClickDimensions Export and Import let you transport Domains, Email Templates, Form Fields, Landing Pages and Survey Questions.

All other configuration records must be transported manually. I prefer the XrmToolBoxDataTransporter to create records across all CRM instances. Pay attention to only transport the fields that you can edit in CRM. Exclude the CRM GUID and any other ID/Key from ClickDimensions (except for redeployment).
Web content and campaign automations must be rebuilt manually.
Check also the linked web content in email templates to prevent submissions to wrong CRM instance.

Those of you who are willing to experiment can try to capture and modify the body of the web request that is submitted when you save a web content.

5. Updates

ClickDimensions has a 4-week release cycle.
In the Release Notes, you find detailed information of what has changed and if a solution update is required to receive new features or bug fixes.
Most of the changes take place on the server, and a solution update is recommended by ClickDimensions once a quarter.

I prefer the manual update of the ClickDimensions solution, because I can determine when the system changes.
As the release cycle is really short, I advise to download the solutions for all instances at once. Otherwise, it could happen that you download different versions. Don’t forget your backup solution and the import in your CRM instances without ClickDimensions the have the same customizing over all.

During the update, you have to choose the settings that are “not recommended” by Microsoft to overwrite the existing ClickDimensions customizations.

It makes sense again to have a backup solution in with ribbon customizations from account, campaign, contact, lead, list, opportunity, team, systemuser and additional customizations on ClickDimensions entities.

ClickDimensions deployment

6. Redeployment

Make sure to have a ClickDimensions solution of the system that you overwrite and a backup of the ClickDimensions records with all attributes from that system.

The redeployed CRM instance will still try to connect to ClickDimensions environment of the source CRM.


Disable all the ClickDimensions plugins, the redeployed CRM instance will still try to connect to ClickDimensions environment of the source CRM and could delete your productive data in the ClickDimensions cloud.

Delete the copied ClickDimensions records from the redeployed system. Delete also the records in the “Execute Send” table through the advanced find.

To restore the ClickDimensions records, you can import the backup of these records, with all keys and the original GUID of the records.

Reconnect the CRM instance to the correct ClickDimensions cloud instance, by importing the ClickDimensions solution from the first redeployment step.
This will restore the account key, enable the plugins, and you are able again to create new records and open the restored records in the redeployed system.

Understand email statistics in ClickDimensions

Posted in ClickDimensions, Dynamics 365, and Power Platform

Email statistic calculation

If you’ve ever wonder why the count of your marketing lists members differs from the email statistic that ClickDimensions has sent, then the following list will help you to understand how ClickDimensions calculates the email delivery.

Email statistic report from ClickDimensions
  • + LISTED RECIPIENTS
    • + Recipients – leads, contacts and accounts that are connected to the ‘cdi_emailsend’ as recipient, directly or via marketing lists
    • – Duplicate email addresses over the recipients
  • – EXCLUDED RECIPIENTS
    • + Recipients without an email address
    • + Email addresses that are already blocked
      • + Email addresses with a previous hard bounce
        • + DNS failures
        • + Generic Bounces: No RCPT
        • + Invalid Recipients
      • + Email addresses with 4 soft bounces within a 90-day period
      • + Email addresses that were blocked in a previous email
    • + Recipients with unsubscribed email addresses
      • + Recipients ‘donotemail’ setting is ‘Do not allow’
      • + Recipients ‘donotbulkemail’ setting is ‘Do not allow’
      • + Recipients whose email address is listed in the ‘Unsubscribe’ records
      • + Recipients whose email address is opted-out from the related subscription list
      • + Recipients whose email address have no opt-in for the related subscription list (only in opt-in model)
    • + Suppressed recipients
      • + Email addresses from leads, contacts and accounts that are connected to the ‘cdi_emailsend’ via a suppressed marketing list
  • = MESSAGES SENT
  • – BOUNCES
    • + Hard bounces
      • + DNS Failures
      • + Generic Bounces: No RCPT
      • + Invalid Recipients
    • + Soft bounces
  • = EMAILS DELIVERED

Queries for email statistic in D365CE

This list contains the OData 4.0 queries to collect all the data for email delivery and interactions for reporting purposes.

Email statistic data  stored in D365CE
GET [Organization URI]/api/data/v9.1/
  • Excluded recipients
    cdi_excludedemails?$filter=_cdi_emailsendid_value eq {ID}
  • Recipients without an email address
    cdi_excludedemails?$filter=_cdi_emailsendid_value eq {ID} and cdi_reason eq 4
  • Recipients with already blocked email addresses
    cdi_excludedemails?$filter=_cdi_emailsendid_value eq {ID} and cdi_reason eq 5
  • Recipients with unsubscribed email addresses
    cdi_excludedemails?$filter=_cdi_emailsendid_value eq {ID} and (cdi_reason eq 1 or cdi_reason eq 7
  • Recipients that are connected via a suppressed marketinglist
    cdi_excludedemails?$filter=_cdi_emailsendid_value eq {ID} and cdi_reason eq 6
  • Messages sent
    cdi_sentemails?$filter=_cdi_emailsendid_value eq {ID}
  • Hard bounces
    cdi_emailevents?$filter=_cdi_emailsendid_value eq {ID} and (cdi_type eq 10 or cdi_type eq 15 or cdi_type eq 9
  • Soft bounces
    cdi_emailevents?$filter=_cdi_emailsendid_value eq {ID} and cdi_type eq 3
  • Emails delivered
    cdi_sentemails?$filter=_cdi_emailsendid_value eq {ID} and cdi_bouncescount lt 1 and cdi_deliveriescount gt 0
  • Interactions
    cdi_sentemails?$filter=_cdi_emailsendid_value eq {ID} and (cdi_clickscount gt 0 or cdi_openscount gt 0)
  • Unique opens
    cdi_sentemails?$filter=_cdi_emailsendid_value eq {ID} and (cdi_openscount gt 0)
  • Total opens
    cdi_emailevents?$filter=_cdi_emailsendid_value eq {ID} and cdi_type eq 2
  • Unique clicks
    cdi_sentemails?$filter=_cdi_emailsendid_value eq {ID} and (cdi_clickscount gt 0)
  • Total clicks
    cdi_emailevents?$filter=_cdi_emailsendid_value eq {ID} and cdi_type eq 4
  • Unsubscribes
    cdi_emailevents?$filter=_cdi_emailsendid_value eq {ID} and cdi_type eq 6

Inferred opens

An inferred open is counted when a recipient clicks a link in an email or unsubscribes, but does not download the images (and also the tracking pixel) in the email.

The unique opens in the email statistics in Dynamics 365 CE do not include inferred opens.
The ClickDimensions email report includes the inferred opens in its unique opens count.


KPIs calculation from email statistic values

Basics for marketeers but maybe not for Dynamics 365 folks and of course it is also handy to have all in one place.

  • Bounce rate
    Bounces / Message sent * 100
  • Soft bounce rate
    Soft bounces / Message sent * 100
  • Hard bounce rate
    Hard bounces / Message sent * 100
  • Delivery rate
    Deliveries / Messages sent * 100
  • Interaction rate
    Interactions / Messages sent * 100
  • Open rate
    Unique opens / Messages sent * 100
  • Click rate
    Unique clicks / Messages sent * 100
  • Unsubscribe rate
    Unsubscribes / Messages sent * 100

ClickDimensions Release Notes – All-In-One Edition

Posted in Dynamics 365, ClickDimensions, and Power Platform

ClickDimensions has a monthly release cycle with a yearly major release. Surely you can imagine that most of the customers don’t prefer the automatic update and of course nobody makes manually updates on a regular basis.
The result of this combination is that I get often the question from customers: “What has changed since our last update?”.

The release notes of ClickDimensions are public available as single articles, starting from Feb 2018 – v9. These article contain the changes for each single version.

ClickDimensions Release Notes

Therefore, I started my own document that combines these releases notes articles, and I want to share it with you.

Features of my ClickDimensions Release Notes All-In-One Edition

Or in other words: “Benefits of bringing them in all together in an Excel file.”

  • Filter by date (EU release) or ClickDimensions version
  • Filter by ClickDimensions feature (Campaingautomation, Email, Analytics, etc.)
  • Filter by type (new features, improvements, changes and fixes)
  • Filter by update type (instant update or solution update required)
  • Search for a defect number
  • Versions that are not supported anymore are greyed out

RetrieveTotalRecordCount Bookmarklet

Posted in Dynamics 365, and Power Platform

Counting records in CRM can be tricky and time consumption when there are more than 5.000 records in the table. There are several ways and tools to do this that are already well described in the community.

When you are fine with the fact that the numbers you receive are static from a count last night, you can use the RetrieveTotalRecordCount function.
There are descriptions in the community on how to use it, too:

I combined both and created a bookmarklet, so that you don’t need to to memorize the url path or modify a bookmark everytime when you are in a different system or need another table (entity).

The RetrieveTotalRecordCount Bookmarklet

Create a normal bookmark in you browser and replace its url with the following code:

javascript:function proc(){var r = JSON.parse(this.responseText).EntityRecordCountCollection,t = [];for (let i = 0; i < r.Keys.length; i++) {t.push(r.Keys[i]+"="+r.Values[i])}prompt("Result", t.join(","))} etn = prompt("EntitySchemaName as CSV?", "account,contact").split(",").map((str) => str.replace(/\s/g,''));var oReq = new XMLHttpRequest();oReq.addEventListener("load", proc);oReq.open("GET","api/data/v9.1/RetrieveTotalRecordCount(EntityNames=['"+etn.join("', '")+"'])");oReq.send();

You can use it at any place inside of D365 CE. You only need to write in a SchemaName of an entity (table) or several, comma separated SchemaNames and it answers you with the EntitySetName and the number of records in it (counted last night).

EntitySetName Bookmarklet

Posted in Dynamics 365, Power Automation, and Power Platform

Almost six years after my last post about bookmarklets, I’m proud to present you a new bookmarklet for Dynamics 365 CE.

It can be used to retrieve the EntitySetName for for an entity (table).

In case you don’t know what the EntitySetName, here is what Microsoft writes about it.

This value is used in the resource path for this entity in the Web API. For custom entities, you can change the name of the entity set used. By default it is the same as the LogicalCollectionName.

Source: Microsoft Docs

In other words, you need when you use the WebApi or the Common Data Service (current environment) connector in PowerAutomate.

The EntitySetName Bookmarklet

Create a normal bookmark in you browser and replace its url with the following code:

javascript: etn=prompt("SchemaName?","account");var xhr=new XMLHttpRequest;xhr.open("GET","/api/data/v9.0/EntityDefinitions(LogicalName='"+etn+"')?$select=EntitySetName",!0),xhr.onload=function(t){4===xhr.readyState&&200===xhr.status&&prompt("EntitySetName:",JSON.parse(xhr.responseText).EntitySetName)},xhr.send();

You can use it at any place inside of D365 CE. You only need to write in the SchemaName of an entity (table) and it answers you with the EntitySetName from the EntityDefinitions.