In the preview for release wave 2020 2 Microsoft is moving the signature to UI. While doing this, they have the possibility to brush up on some old tech. Almost every piece of the old Dynamics moved over has had been given at least a small upgrade, of not a total overhaul. If you want to read about my take on signature in Dynamics, head on over here.
Limitations of the old signature: 1. Personal signature only. Could not define a signature for the organization or group. 2. No images could be added
So what has changed?
Old
The old signature did not have a rich editor, and limited us to primitive text editing. Exactly like the old email editor.
If you tried to enter a picture, you would get an error message. For this example, I just wrote the text “no picture possible”.
The signature would be added to the email as expected if it was defined as default signature, but again with little formatting.
New
The new signature is available in the new UI
I added a picture of the blue color, just to demonstrate that there can be a picture in the signature.
Opening a new email will automatically add the signature as expected, but now with the picture included. 👍
Well?
Does the signature support images? YES, it finally does.
It is stored as a Base64, so no need to consider where the actual image is stored (notes, azure, blob etc etc). Migration from system A – B would work fine.
Can we use the signature multiple users? Well… Yes, but No.. It seems every signature is meant to be personal, but you can search for other signatures if you want to. But in regards to automatic signature added to email, you need to create one for each user.
Thoughts 🤷♂️
As of now, I could only find the signature in the Customer Service Hub, and that confuses me a bit. Why not start off by adding it to the Sales Hub. If the signatures are personal, why not let the sales people use this first. In customer service I would have thought that a organization signature would make more sense.
While this is a great update to the last signature experience, I hope they are able to add global signatures in the future for groups of users. This would make the administrative experience a little better when you have hundreds of users.
If you read my article on signatures, I provide a different way of handling the signature experience. I try to centralize the management of the signature for faster changes. The good thing is that we have both solutions available, so pick and choose what suits your need.
Maybe in the next version we might see some structural changes to the way signatures are connected to users/groups.
This weekend I was so fortunate to talk at the Field Service BootCamp. I have tried to design the Field Service solution to be as simple as possible. I remove most of the logic from view, but keep the essence of the process. What do you think?
This video is how I demonstrate the Customer Service solution based on my blog series. I like to keep things simple, but at the same time functional. Please let me know what you think.
Stay tuned
Next video will be “how to install the solution” from scratch, so you can try it out yourself😀
This is the last post in a long series about Customer Service and Dynamics 365. After several implementations over the years, the following configuration should be a great place to start.
Before we get started
Fire up a new trial of Dynamics with Customer Service, and add an office 365 trial to the same instance. I will not be going in depth on how to create a trial. Navigate here if you need tips
NB! for some steps you need Global Admin privilege
1. Exchange
The first step we need to do is setup a Shared Mailbox in the admin for O365. Navigate to https://admin.microsoft.com <- Make sure you are on the correct org when doing this.
When done you should se the message above. You now have successfully created a new email address for Exchange.
In the video I will explain why UNMANAGED, but I am not an ISV is the short answer. I have written about what’s included, so easy to reverse.
Remember to PUBLISH CHANGES
You will now see a new App called CS
3. Add Team + Security Role
Next you need to add a new team to Dynamics. Open the Advanced Settings in the navigation to the top right. We will be doing the next part in the old client
Open Settings – Security and Team. Add a new team and give it a name. I have chosen Customer Service. This is the team name that will own the Cases before they are assigned.
Also remember to add the security role “Team – Customer Service”. This security role is imported along with the solution
4. Add Queue + assign Team
This is the step where we connect Microsoft Exchange with Dynamics 365
Name of the queue is not important, but make something that is sensible.
When you click save, a new Mailbox will be created automatically by the system. Open the Mailbox, an navigate to the next step.
5. Approve Email and test receive mailbox
This is the point where you need to be Global Admin to continue. Start by approving the mailbox/email address.
Step 2 you test and enable the mailbox. Once this is done, head on over to “alerts”
You might need to refresh this a few times before it displays anything. The refresh button in the upper right corner is the easiest way to update the feed. You should only see information messages now. This should not generate any errors.
6. Email Settings
Next step is really important for keeping the subject logic. All of this will make sense later when you see the reply of the emails you send. Open the Email Configuration Settings and make sure it looks just like below.
7. Create Account and Contact
Now we create an Account and Contact that we use for our demo. The Account name can be whatever you want, but the contact needs to have a valid email address.
8. Send Test Email Outbound
Now it is important to check that emails actually are going out of the system. Open the contact you created with the valid email address. Create a new email activity.
NB! make sure that you substitute the from address to Customer Service (queue you created earlier) before you hit send. This will send FROM the queue to the Contact.
If things go as planned you will see an email appear in the mailbox. Be sure to check you spam if nothing is in the inbox!!!
9. Activate Record Creation and Upadte + add Team to Case Created Owner
Navigate to the Record Creation part Service Management. Before you comment on not choosing the flow way, it’s not working. I have a support case with Microsoft ongoing to fix this now.
First thing you need to update is the queue “Customer Service” for which the rules will run. I prefer the following settings below. You might disagree, but then change to your liking.
Next important step is to update the Record Creation rule. Open the “Create Case” Set Properties.
REMOVE the current customer service, and replace it with the one you created for Owner. This is important so the process assigns the cases to the Team.
When done, activate the rule.
10. Add Signature
Next step we have create a signature for the user. Signatures can be personal or company specific. The signature is located under the setup section. Navigation is at the bottom left of the CS app.
The signature below is HTML. I don’t expect you do this from scratch. I have a great guide here
11. Add User with Signature and Default Queue
Getting close to the end now, we have to add all our hard work to the Customer Service User replying to the emails. In the user form you see 2 fields “Signature” and “Default Queue”.
Update with the queue you created earlier, and the signature you just created. This is what will defines what the email leaving the system will look like.
12. Add Email Warning – New Activity on Case
This last step is optional. I created it in Flow, so beware of possible hitches with a few things regarding the current environment connector.
The purpose is to notify the Agent that a new Email has arrived for the case. If for some reason the system received email to a close case, I reopen the case and notify the agent.
This post confused me way to much. Nothing seemed to make sense, and the only thing I could focus on was the extremely odd name Dataflex.
What about the name….
A quick online search shows that the name is already in use. Not only is it in use, but it is used by a competitive product offering low-code development! How on earth is it even possible to miss out on this?
This sounds like a whole new SkyDrive – OneDrive problem, so I’m going to wait a bit before I rebrand everything to Dataflex
The voice of reason
My mind has been twisting and turning to understand the reasoning of it all of this, and luckily we have Jukka. His post is what Microsoft should have posted originally. It explains everything I was wondering about….. Except the name 😂
How to fix the RegardingObjectID Type field in FLOW
When working with the Current Environment Connector (CDS), you have 2 options for a lookup (Value and Type). For some strange reason only one of them seems to work for me.
The Value is obviously the GUID, and the Type is “incidents, accounts, contacts, opportunities etc”.
Let’s look at the data:
As you see I have values for the GUID and the Type of regardingobjectid.
When adding them to the Compose the TYPE returns blank every time.
Microsoft released a new way to do automatic record creation a few months ago, but I never got around to ckeck it out before now.
The most obvious reason for the new release is creating something that is possible use within new UI. Therefore you can only find this in the customer service app at the moment.
Heads up
At the current moment the new approach doesn’t work, for a contact that is known by the system with an account. I am working with support help them understand the error with the flow. Will update the post when they fix the error. This means that the new solution only works when the contact is not connected to a parent account.
Old
In the “old” days we created everything via settings in the navigation. You start off creating a new record and link it to a queue you want to listen to. I prefered the following setup, and I have explained why in my other post regarding Customer Service
When you created the role for creation of case, it would use the following standard setup. Notice that the contact here would be set if account and contact were known. Contact would be contact, and account would be customer.
New
The new way of doing things is a lot like the old, but there are some differences.
Don’t get fooled by the name in queue to monitor. This is a regular email queue, but I gave it the name “flow”. The first thing we have to create is a new rule for the queue.
Here is where we see the first major difference. The condition for creation seems to use the same visuals as the new advanced find.
At the bottom you choose the rule and click create. This brings you over to Microsoft flow. Instead of the old WF, MS autocreares a new flow for you.
Just like the old flow, Microsoft didn’t want to you touch the details of the flow.
The old flow filled out the contact and customer fields, while the new one for some reason doesn’t (yet). I will try to work with MS on this also.
What to do next?
I honestly don’t know when they expect all of these rules to be transfered over, but I guess it will have to be done in the future when they try to sunset the old WorkFlows.
In the meanwhile I hope they fix the flow, so that it works as expected:)
This post is a part of a series of posts for Customer Service. The complete GUIDE can be found here
Before we complete it all I will clean the form a bit. The demo I will be focusing on is the B2B space. If you use the B2C part of support, you might not need any of this. Just continue to the next post:)
Before
It looks good out of the box, but it doesn’t provide a great amount of value.
Business Process Flow on the top of this case is close to useless. It only indicates that you can have a process that looks nice. The steps don’t make sense, and as always with BPF…. You can’t create a step without a mandatory field present. 😒
The first quick view shows a view of the company information. It takes up a lot of space, and in my opinion displays relatively irrelevant information about the customer. If you want quick info about customer, you can “hover over” the customer field.
The right side is setup with reference panels. I wrote an article about loving them a while back, but Customers seem to prefer normal subgrids when actually navigating. Recent Cases is actually just a quick view, and that doesn’t do us much good. Try opening one of the cases, and you won’t see much. We will have to clean this up for it to actually work. We will also remove entitlements, because it’s too much of a hassle in a simple Customer Service scenario.
I hide the tabs on top for now, because I simply don’t need them. If at one point you want to expand, you can reintroduce them.
Subjects.. Are they staying or going. I am not sure what the future holds for this. It’s quite confusing. At some parts of history it seemed very central for Customer Service and Knowledge Articles. Then Categories came along. I would like some clear information what is what. For simplicity I will use subjects for demo. Personally not to happy about it.
The customer field here is as confusing at the customer field was originally for Opportunity. If you are using Customer Service for B2B this has to be linked to an account and not contact. If you use B2C I guess you can just leave it and never really see it as a problem. In my cases I always have to change this to store Account, and then use the Contact field for Contact. Opportunity has managed to change from Customer field to Account & Contact. Don’t see why Case can’t do the same…
Cleanup
1. BPF – Business Process Flow removal
Start off by deactivating the BPF from customization. Then we have to delete all records of the process running. Open Advanced Find, and look for the table that has the same name as the Business Process Flow
PS: If you happen to have a demo setup, it might also include Field Service demo data. Then you have to repeat the process for “Case to Work Order Business Process”.
2. Quick View
Does not give any extra added value. I am replacing this function with a similar value, but different way of working. I open in form editor and remove.
3. Remove Entitlements in Reference Panel
First make sure to remove the Entitlements
Then make sure that the view is set to Recent Cases. Don’t trust that the name of the subgrid is correct. You actually have to make sure that you have the Recent Cases view here.
Create a new section for Recent Cases, and move the Recent Cases out of the Reference Panel. This way we can actually click on a case and open it from the Quick View.
4. Hide tabs
Just hide it. Don’t need it for now
5. Fix Customer field – B2B scenario
In the B2B scenario we need to make a few adjustments to the customer field, and add some onload logic for the agent. In the B2B scenario we need the customer data to be good, and therefore we can’t accept cases where the contact is unknown.
Let’s just agree that this doesn’t look very exciting, but it does the job. It does the job quite well!
This is how I want it to look. I have hidden a bunch of components that Microsoft includes as standard Customer Service. Normally it is just a little too much. This will lead to an easy training and a simple customer service view for the agent.
Removing the Business process flow we loose a lot of colors, but this is for actual production. Not a fancy demo to excite someone buying.
This post is a part of a series of posts for Customer Service. The complete GUIDE can be found here
Many years ago Opportunity retired the Customer field and replaced it with Primary Contact and Primary Account fields. Case has not yet done this for reasons I can’t really understand. As you will see in this article we achieve the same result when adding the contact field, but the customer field is still a polymorphic lookup.
Email to Case could easily add to the contact field instead of the customer field. Field service is actually dependent on account being in the customer field for it to work properly.
This is how Case has to be setup to make sense in the B2B world:
If the Contact and Customer are known to the system, they will automatically populate. If the Contact is new to the system, the connection to the Account will be missing. In this case we need to alert the Agent, and ask them to update the contact record.
JavaScript
The following JavaScript is added to the Case form. It checks the Customer field to see if it is contact. If this is the case, it will check if the Contact has a Account connected. Most likely it will not have an Account, so we will be prompted “Do you wish to update the Contact?”. Answer YES here, and a quick view of the Contact will appear. Update Account, and then the JavaScript will do the rest for you. ✨MAGIC✨
var formContext = "";
function OnCrmPageLoad(executionContext) {
formContext = executionContext.getFormContext();
//
//You don't need to change this. Just understand that forms have one the following states when opening
//
var FormTypes =
{
Undefined: 0,
Create: 1,
Update: 2,
ReadOnly: 3,
Disabled: 4,
QuickCreate: 5,
BulkEdit: 6
}
runAlways(formContext);
switch (formContext.ui.getFormType()) {
case FormTypes.Create: OnNewFormLoad(); break;
case FormTypes.Update: OnUpdateFormLoad(); break;
case FormTypes.ReadOnly: OnReadOnlyFormLoad(); break;
case FormTypes.Disabled: OnDisabledFormLoad(); break;
case FormTypes.QuickCreate: OnQuickCreateFormLoad(); break;
case FormTypes.BulkEdit: OnBulkEditFormLoad(); break;
case FormTypes.Undefined: alert("Error"); break;
}
}
//
//I only use the RunAlways, OnNewFormLoad and OnUpdateFormLoad, but i keep the others here if i ever would need.
//When looking at this you can always know what funtion is running. Easy to read and debug.
//
function runAlways() { }
function OnNewFormLoad() {}
function OnUpdateFormLoad() {
//
//Clean up Contact Data. If contact has account, but account not in Customer field perform update. If Contact doen's have account ask for update
//
GetAccountInfo();
}
function OnReadOnlyFormLoad() { }
function OnDisabledFormLoad() { }
function OnQuickCreateFormLoad() { }
function OnBulkEditFormLoad() { }
//******************************************************************** */
//CUSTOM FUNCTIONS are added below here. Below this point you add all types of functions you need.
//******************************************************************** */
function GetAccountInfo() {
var CustomerField = formContext.getAttribute("customerid").getValue();
if (CustomerField != null) {
if (CustomerField[0].entityType == "contact") {
var CustomerGUID = CustomerField[0].id;
CustomerGUID = CustomerGUID.replace("{", "");
CustomerGUID = CustomerGUID.replace("}", "");
//
//If the Customer Field contains a contact, I want to change this. I want the Customer Field to be an account. Step 1 is to find out if the contact has account registered.
//
Xrm.WebApi.online.retrieveRecord("contact", CustomerGUID, "?$select=_parentcustomerid_value").then(
function success(result) {
var Id = "{" + result["_parentcustomerid_value"] + "}";
var Name = result["_parentcustomerid_value@OData.Community.Display.V1.FormattedValue"];
var LogicalName = result["_parentcustomerid_value@Microsoft.Dynamics.CRM.lookuplogicalname"];
//
//IF the contact has an account I move the Contact to Case Contact, and receive the Account from the Contact and enter it to Customer on Case.
//
if (LogicalName != null){
formContext.getAttribute("primarycontactid").setValue(CustomerField);
formContext.getAttribute("customerid").setValue([{ id: Id, name: Name, entityType: LogicalName }]);
formContext.data.entity.save();
}else{
//
//Promt if you want to open contact for update?
//https://carldesouza.com/how-to-implement-javascript-confirmation-dialogs-in-power-apps-and-dynamics-365/ - THANK YOU
//
var confirmStrings = { text:"Contact is not connected to Account. Please update!", title:"Data Update Recommended", confirmButtonLabel:"Open Contact", cancelButtonLabel: "Not Now" };
var confirmOptions = { height: 200, width: 450 };
Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(
function (success) {
if (success.confirmed){
//
//If the user chooses to update, I open a small contact form, and make the user set the Account.
//After Save&Close i recall this function, and then I update Account and Contact for case.
//
Xrm.Navigation.navigateTo({pageType:"entityrecord", entityName:"contact", formType:2, formId:"e4206691-b1e3-4e9d-a23a-4865b9511091", entityId:CustomerGUID}, {target: 2, position: 1, width: {value: 20, unit:"%"},height: {value: 50, unit:"%"}}).then(
function success() {
GetAccountInfo();
},
function error() {
alert("The system was not able to save the change. Please reload the page and try again");
}
);
}else{
//Say or do something if the user doesn't update Contact
}
});
}
},
function (error) {
Xrm.Utility.alertDialog(error.message);
}
);
}
}
}