Skip to content

Tag: ClickDimensions

ClickDimensions Quick Send from any entity

Posted in ClickDimensions, Dynamics 365, and Power Platform

Last year I had a customer requirement to start a ClickDimensions Quick Send on a custom entity. By default, QuickSend is only available on lead, contact and opportunity. ClickDimensions has already an article on how creating a Quick Send like dialog to send a single email from any entity, but dialogs are deprecated. Therefore I made a deep dive into how the Quick Send button works and will share my findings with you.

The button

I will only focus on the command, I think button labels and button icons should be no problem for customizers.

Rebuild the command and use your own javascript in yellow marked areas.

The javascript

The following is just to give you a starting point. You need to fill it with additional logic to refer it to a contact or lead.

function openQuickSendForm() 
   var type = 2;
   var typeName = "contact";
   var id = "{332514B1-14F7-E711-A95F-000D3AB6ED20}";

   var accountKey = getAccountKey();
   var region = getRegion();
   var crmVersion = getCrmVersion();
   var orglcid = parent.Xrm.Page.context.getOrgLcid();
   var orgName = Xrm.Page.context.getOrgUniqueName();
   var lcid = Xrm.Page.context.getUserLcid();
   var userId = Xrm.Page.context.getUserId();

   var params = 
      '&id=' + id + 
      '&orglcid=' + orglcid + 
      '&orgname=' + orgName + 
      '&type=' + type + 
      '&typename=' + typeName + 
      '&userlcid=' + lcid + 
      '&userid=' + userId;
   var url = 
      'https://app' + region + '' +
	  '/MSCRM/v' + crmVersion + '/pages/quicksendemailtemplateForm.aspx' 
	  + '?accountKey=' + accountKey + params;
   _security.CreateSecuritySession(function (sessionId) 
      url += '&sessionId=' + sessionId;

Mask query strings

Posted in ClickDimensions, Dynamics 365, Dynamics 365 Marketing, and Power Platform

Email marketing tools automatic add query strings at the end of urls of your hyperlinks. That’s a common way to pass additional informations to the target website inside of hyperlinks. Mostly these are informations about which channel the visitor came and to which campaign the visit is related to.


The target website should validate the passed query strings and ignore them if it don’t know what to do with. But sometimes you a have target website that crash painfully with a 404 error.

Solution – Mask query strings

Instead of trying to fix the targets understanding of the query strings, you can mask the query strings when you create the hyperlink in your email marketing tool.
Just put the anchor identifier “#” at the end your link url. By that way the recipients web browser interprets the query string as an anchor within the target website. As there is no anchor text with that name on the target website, it has no effect. That’s in the specification of HTML since version 4.01 from 1999 – yes that was is in the last century.

You see how important it is to test your mailing with real recipients.

Filter freemail provider on ClickDimensions forms

Posted in ClickDimensions, Dynamics 365, Power Platform, and Revive

Currently I have the request to filter freemail provider on ClickDimensions forms, because the customer wants only B2B contacts in his database.

ClickDimensions already provides a setting to filter freemail provider and it would be great first step to met the requirement if the editor would save the setting correctly.

At the moment, everytime you reopen the editor the above setting is unchecked and it doesn’t work in the form.

Apart from that, only four freemail providers are offered to filter.
That’s why I took a look into the Javascripts of ClickDimensions and found and extended the original code for it.

The following code will override the original code to add an additional validation. You can add other or even more freemail providers to met your requirements. Just insert it in the CodeEditor of the forms designer.

// enable or disable the filter functionality
var filterFreemail = "true";

// customize the message provided to the user when a freemail address has been entered
var clickd_MSG_FREE_EMAIL = "We accept only business email addresses.";

// customize the array of blocked freemail providers to met your requirements
var blockedFreeEmail = ["", "", "", ""];

// default ClickDimensions function, extended with our own validation
function FormValid()
    var isValid = true,
        isAllowed = true,
        reqFieldList = clickd_jquery("input[name='reqField']", "#clickdimensionsForm");

    for (var i = 0; i < reqFieldList.length; i++)
        // default validation
        isValid = ValidField(clickd_jquery(reqFieldList[i]));
        if (!isValid)

        // custom validation
        isAllowed = AllowedField(clickd_jquery(reqFieldList[i]));
        if (!isAllowed)
            isValid = false;
    return isValid;

// own validation, copied and modified from ClickDimensions original
function AllowedField(hidden)
    var fieldType = hidden.attr("alt");
    var fieldID = hidden.val();
    var fieldString = "";

    var field = clickd_jquery("#" + fieldID);
    if (clickd_jquery("#cont_id_" + fieldID).attr("wasskipped") == "1")
        return true;

    var infoId = "required_info_" + fieldID;
    infoId = infoId.replace("f_upload", "f");
    var info = clickd_jquery("#" + infoId);

    var infoText = clickd_jquery(info).text();
    if (infoText != "")
        Un_SelectNotValidInput(info, field);

    if (fieldType.toLowerCase() == "email")
        fieldString = clickd_jquery(field).val();

        if (fieldString.length > 0)
            fieldString = fieldString.replace(/\s+$/gm, '');
    if (fieldType.toLowerCase() == "email" && fieldString.length > 0)
        var domain = fieldString.split("@")[1].toLowerCase();

        // set field invalid for freemail provider
        if (filterFreemail.toLowerCase() == "true")            
            for (var i = 0; i < blockedFreeEmail.length; i++)
                if (domain == blockedFreeEmail[i])
                    SelectNotValidInput(info, field, clickd_MSG_FREE_EMAIL);
                    return false;
    return true;