Using single Mailbox Dynamics 365 User to Automatically Track All Outgoing and Incoming Emails from All Users (take 3)

This is the third post in my series about Automatic tracking of all Incoming and Outgoing emails in Dynamics 365 using Exchange Mailflow rules and Server Side Synchronisation.

In my previous post, I showed how we can track all incoming and outgoing emails for all users using 1 single Exchange Rule and for each user, we create 2 Outlook Rules. In this post, I have an even simpler solution with only 1 user and 2 exchange mail flow rules.

But firstly, it is important here to note that the main issue for automtiaclly automatically tracking outgoing emails is that any Outlook Rule for Sent emails is always “Client-only”. That is, the rule will only run if Outlook is open. I have not found a way to have an Outlook Rule that works server side to copy a sent email to a tracked Dynamics 365 folder. Hence, the use of Exchange Online Mail Flow and the direct use of the Exchange transportation layer.

But what if you don’t want to even create the outlook rules as per my two previous posts? The answer is simple: You can literally use 1 single Mail Box and Dynamics 365 user along with 2 Exchange Rules to automatically track all Outgoing and Incoming emails for any email inbox even if this user has not got Dynamics 365 App for outlook configured and even if this mailbox is not a Dynamics 365 user.

The approach is simple: Using 2 x Exchange Mail Flow rules you can Bcc every outgoing and every incoming email to all the mailboxes you want. All these emails are Bcc’ed to a Single Mailbox of a Dynamics 365 User who has App for Outlook configured. This way, all emails are tracked.

So to summarise:

  1. Setup and Configure Dynamics 365 App for outlook for one User: Let’s call it: “D365 Mail User”
  2. Create 1 x exchange rule to BCC all outgoing emails to this “Mail user”
  3. Create 1 x exchange rule to Bcc all incoming emails to the same “Mail user”
    and that’s it.

    Tried and tested – but please let me know if you got other ideas/thoughts.

Automatically Track All Incoming and Outgoing Email Messages in Dynamics 365 with Exchange Online Rules (Abridged Version)

Originally posted on: https://crmtipoftheday.com/1187/automatically-track-all-emails

This post is an abridged / summarised version of my original post about the same subject. To read the full detailed 10 pages long step by step guide, please check the original post on my blog here

Sometimes organisations want to track all incoming and outgoing emails for a number of users at Server Side without having the user to do anything manually and across all devices. The requirement here is to save the user time from clicking on “Track” emails when they are sending them or having to manually move incoming emails into a tracked folder to be tracked. They also want this to work on every email sent from any device and every email received even if Outlook is not open. This what I call “pure Server Side Synchronisation”.

As the name gives it away, Dynamics 365 Server Side Synchronisation and Dynamics 365 App for Outlook can help us achieve this requirement with some help from Exchange Mail Flow Rules that uses the transportation layer directly. Just to re-iterate, we are here using Dynamics 365 App for Outlook (not the client). If you are not sure what is the difference between Dynamics 365 App for Outlook and the Dynamics 365 for Outlook (also known as the Outlook Client), you can refer to this comparison.

My approach is using Server Side Synchronisation between Dynamics 365 Online Cloud and Exchange Online but the same approach may work with other setups to achieve the same requirement: Track all incoming and outgoing emails automatically from any device. I’m also applying all of this on 1 single “test user” but you can apply this on as many users as you want. My test user is called “sales test”.

  1. Configure server-side synchronization
  2. Set up tracked folder
  3. Create the following email flow rules
    1. Outlook rule to copy all incoming email messages to the tracked crm folder except if the message has “crmtrack” in the message header.
    2. Exchange Online Mail Flow rule that works at the transportation layer to “Bcc” every single email sent from the user to themselves and adds the “crmtrack” header value to the sent email message header
      image
    3. Outlook Rule to move all incoming email messages that has the “crmtrack” header to the tracked folder.
      clip_image023

The result of all of the above complicated approach is that ALL incoming emails are tracked in Dynamics 365 automatically as “Received” emails and ALL outgoing emails are tracked in Dynamics 365 CRM automatically as “Sent” emails. As this approach is using Exchange Online transportation layer, this is a pure Server Side Synchronisation of Email messages with Dynamics 365 which means it will work with “ALL Emails” sent from ANY Device and any app as the synchronisation happens at the server side and not on the client side. So if you sent an email from the Outlook for the Web (Web Mail), sent it from an Android device email client, iPhone Mail app, Outlook app on iPhone, Office Outlook or any other medium, all emails sent and received are tracked in Dynamics 365.

This is how it looks like in Dynamics 365: Tracked emails sent from any device and emails received while Outlook is closed:

clip_image025

 

Automatically Track All Incoming and Outgoing Email Messages in Dynamics 365 without opening Outlook and across any device :: Pure Exchange and Dynamics 365 Server Side Synchronisation

Sometimes organisations want to track all incoming and outgoing emails for a number of users at Server Side without having the user to do anything manually and across all devices. The requirement here is to save the user time from clicking on “Track” emails when they are sending them or having to manually move incoming emails into a tracked folder to be tracked. They also want this to work on every email sent from any device and every email received even if Outlook is not open. This what I call “pure Server Side Synchronisation”.

As the name gives it away, Dynamics 365 Server Side Synchronisation and Dynamics 365 App for Outlook can help us achieve this requirement with some help from Exchange Mail Flow Rules that uses the transportation layer directly. Just to re-iterate, we are here using Dynamics 365 App for Outlook (not the client). If you are not sure what is the difference between Dynamics 365 App for Outlook and the Dynamics 365 for Outlook (also known as the Outlook Client), you can refer to this comparison: https://docs.microsoft.com/en-us/dynamics365/customer-engagement/outlook-app/v8/deploy-dynamics-365-app-for-outlook

 

My approach is using Server Side Synchronisation between Dynamics 365 Online Cloud and Exchange Online but the same approach may work with other setups to achieve the same requirement: Track all incoming and outgoing emails automatically from any device. I’m also applying all of this on 1 single “test user” but you can apply this on as many users as you want. My test user is called “sales test”.

In this post, I will not take you in detail through the process of setting up server side synchronisation. You can refer to the official Microsoft Documentation and this comprehensive step by step guide to set server side sync up first before you continue: https://docs.microsoft.com/en-us/dynamics365/customer-engagement/admin/connect-exchange-online

Once you do all the steps in the above guide and you have fully setup server side synchronisation, you will then need to make sure that your test user has setup folder level tracking in their Outlook (Office Outlook or Web rules are fine). To do this, you can follow the step by step guide here: https://docs.microsoft.com/en-us/dynamics365/customer-engagement/admin/track-outlook-email-by-moving-it-tracked-exchange-folder

In summary, before you automate the tracking of all email messages both incoming and outgoing, you must have Server side synchronisation setup, push (i.e. remotely install) Dynamics 365 App for Outlook to your user(s) and you must also setup 1 folder for Dynamics 365 tracking in your user Outlook. This can be a folder under their Inbox which is then configured in Dynamics 365 for tracking (as per the above guide). For your convenience, I have summarised here the steps to setup Folder tracking (refer to the above guide for detailed guidance):

To Set up a tracked folder

  1. In the User “Personalisation Options” or “Personal Option”, click the Email tab, and then under Select the email messages to track in Dynamics 365, select “All Messages”. 
  2. Then Click on Configure Folder tracking Rules. In the Folder-Level Tracking dialog box, under Exchange Folder, click + New Folder Mapping, click the down arrow in the box that appears, and then select the folder you want to track.Where “CRM Tracking” is a folder under Inbox in Outlook, as shown in the following screenshot:

With that, you have Server Side Synchronisation and Folder Level tracking setup for 1 single folder called “CRM Tracking”. Any email message inside this folder will be tracked. Next, we will setup the automation of the tracking of all incoming and outgoing emails, which is the purpose of this post.

To automate the tracking of all incoming email messages, you will need to create an Outlook email rule to copy all email messages received in the user inbox to the “CRM Tracking” folder. Please remember all your outlook email rules must be server side for this to work. If the rule has “Client-only” next to it, emails are moved between folders client side only and not server side which means tracking won’t work.

So, the first rule to create on Outlook is a rule to copy all messages received to the tracked folder. This rule is simple and will look something like this:

 

then

This rule will copy every received message to the “CRM Tracking” folder. But how about sent messages (outgoing email)? Here is the complex part – so follow me to the letter on this one:

If you were to create a new rule via the “Apply Rule on messages I send” that copies every email sent by the user to the same folder “CRM Tracking”, the new rule will always be “Client-only”. This means sent emails are copied on client side only to the tracked folder but not server side – so nothing will appear in Dynamics 365 (remember this is server side tracking not client side).

Also, I have been told that you can create another rule that starts with “Move messages from someone to a folder”, select the same user of this inbox as that “someone” and the “CRM Tracking” folder as the target and this could copy sent emails to the tracked folder server side. I have tried this but it didn’t work for me – emails were not tracked. If you tried it and it worked for you, then please let me know what you did.

On the other hand, if the user was to cc themselves in every email message they send, they will receive a copy in their Inbox, which will then be moved to the tracked folder – hence, this message will be tracked in Dynamics 365. However, the email message will be tracked as “Received” not “Sent”. This also means the user will have a copy of every message they send in their inbox and while they can automate the “Cc” of themselves, it looks odd to the receiver of the email to see the user cc’ing themselves. Hence, this is not a good solution either – it’s a possible solution but not so elegant.

So here comes the approach that is complex, elegant and guaranteed to work – I have tried it several times by now and it always works.

Thanks to an excellent tip from my friend and fellow MVP, George Doubinski, I used Exchange Mail Flow to Bcc every sent message our test user sends. Here is how to do it:

 

  1. Go to the Exchange Online Admin Centre (also known as Exchange Control Panel). You can jump directly to it via this link: https://outlook.office365.com/ecp (you need to be Office 365 Admin)
  2. Click on “Mail Flow” from the left hand menu:
  3. Under “Mail Flow” è Rules, click on “+” to create a new rule that does the following:
    1. Bcc every email message sent by this user to “itself”
    2. Set a message header to every sent message with value “crmtrack” or “techlabslondontrack” (or any message header value of your choice)

Your rule will look something like this:

Once you create your rule, you will need to go back to Outlook rules and firstly, update the first rule we created that copies all messages from inbox to the tracked folder, and add an exception to avoid messages that has “crmtrack” in the header. This way, all sent messages that have been Bcc’ed and arrive in the user inbox, will not be copied to the tracked folder. This rule now looks like this:

Instead, we will create a 2nd Outlook email rule to move (move not copy) all messages that arrive in the user inbox and which has the header “crmtrack” to the tracked folder. This rule will look like this:

 

So to summarise, we ended up creating 3 rules in total:

 

  1. Outlook Rule to copy all email messages that arrive in the user inbox to the tracked crm folder except if the message has “crmtrack” in the message header.
  2. Exchange Online Mail Flow rule that works at the transportation layer to “Bcc” every single email sent from the user to themselves and adds the “crmtrack” header value to the sent email message header
  3. Outlook Rule to move all email messages that arrive in the user inbox that has the “crmtrack” header to the tracked folder.

The reason we use copy for all incoming emails is to allow the user to continue to use their inbox as normal keeping all received emails in inbox. The reason we use move (not copy) for sent emails that arrive as Bcc in the user inbox, is to make sure that all sent emails do not stay in the user inbox. They will continue to exist in the sent folder and a copy will be sent to the tracked folder.

 

The result of all of the above complicated approach is that ALL incoming emails are tracked in Dynamics 365 automatically as “Received” emails and ALL outgoing emails are tracked in Dynamics 365 CRM automatically as “Sent” emails. As this approach is using Exchange Online transportation layer, this is a pure Server Side Synchronisation of Email messages with Dynamics 365 which means it will work with “ALL Emails” sent from ANY Device and any app as the synchronisation happens at the server side and not on the client side. So if you sent an email from the Outlook for the Web (Web Mail), sent it from an Android device email client, iPhone Mail app, Outlook app on iPhone, Office Outlook or any other medium, all emails sent and received are tracked in Dynamics 365.

This is how it looks like in Dynamics 365: Tracked emails sent from any device and emails received while Outlook is closed:

Thanks for reading thusfar! I have spent a lot of time researching and writing this up with the aim to help anyone who is trying to achieve full Dynamics 365 incoming and outgoing email tracking on server side fully regardless of which device or client the email was sent from.

I will be posting another blog post about the same subject soon but this time I will achieve the same result using 100% Exchange Mail FLow Rules via the Transportation Layer.

I hope this helps!

New free XrmToolBox Community Plugin: UCI Dashboard Reset

As a new contribution to the Dynamics 365 community, I have just released a new free XrmToolBox plugin that is simple but I believe is important and much needed for Unified Client Interface (UCI) Dashboards.

Currently, if a Dynamics 365 user sets a Dashboard as their default, they can’t change this back to none. They can change their default dashboard but it will always have a value. It cannot be set to “none” without writing some code to reset it.

The implications of this is that if you have multiple dashboards that you want to display as separate links in the Sitemap of any UCI App, users with default dashboard set, will always go to their default dashboard regardless of where this link is pointing to.

For example: if you have in the sitemap a sub-area / Link pointing directly to dashboard 1 and another sub area pointing directly to dashboard 2, then a user with a default dashboard set to dashboard 3, will always go to their default dashboard (dashboard 3) every time they click on dashboard 1 or dashboard 2.

This is because UCI apps will always prioritise default dashboard over the direct link to a specific dashboard.

 

The solution: Re-set default dashboard to none for some / all users. This can only be done via code but now it is a simple click in our free XrmToolBox plugin.

 

This plugin is offered free as a community solution delivered to you by Mohamed Mostafa and Mark Alber from TechLabs London.

 

Please leave a comment below and/or give us a positive review on XrmToolBox website if you found this XrmToolBox plugin helpful.

 

Thanks!

Disappearing Record Level Team Access security permissions and Manual Record Shares Dynamics 365 v9

Our team at TechLabs London have recently faced a fairly complex and bewildering issue on Dynamics 365 v9. We have setup access team templates against the Contact entity to manage access to Contact records individually. If you haven’t used Access Teams before, you can read more here, but in essence it is a way to control which user can see which contact at a record level.

Our customer has converted from another vendor (a.k.a SF) to our iProperty Cloud solution (http://iProperty.Cloud) built on Dynamics 365 v9 and the new Unified Client Interface (UCI). As part of our data migration, we imported thousands of contacts to Dynamics 365 Customer Engagement and allocated a number of users for each contact record based on a predefined list and set of rules. This was a custom data migration process to create these record level access records using our own TechLabs London propriety migration solution.

Once our data migration into Dynamics 365 was complete, we checked Access Team security and everything looked absolutely fine. The next day after going live, Team access security disappeared for few thousand contacts – but NOT all contacts. Upon looking at the POA table (Principle Object Access Table) where security is set, we found that about 4K access records have disappeared. Literally disappeared!

Apologies for the long story but I want you to be aware of everything we tried to resolve this issue as one of these steps may help you fix your issue (which may or may not be similar to ours).

Basically, we spent the following few days trying lots of different resolutions to try to find out the issue.

  1. First we re-imported Access team records using our migration App – everything went back working fine until the next day in the morning – 4K access records disappeared again!
  2. We tried setting the record level security using “Share” not Access Team (manually and programmatically). While we know that Access Teams are “hidden share” and both get created in POA table, we thought this may solve the issue. It didn’t – next day, everything disappeared.
  3. One possible cause of these record level access security issues could be triggered by re-parenting. For example if contacts are associated to an account and you give ownership of this account to a team while the relationship behaviour is set to cascade all, then the child contact records will become accessible to this team. We removed any cascade relationship behaviour – but still didn’t help. Next day, all access disappeared.
  4. We then Disabled all our custom plugins that remotely affect security and access – we had few automation on security between different entities and teams. No luck.
  5. Also we disabled our own security roles synchronisation process (Azure function) which synchronises security between Dynamics 365 and SharePoint security. Nope! Not even that.
  6. We deleted and recreated the team access template then re-imported all access records. Still same issue. All 4k access records were deleted from POA table the next morning.
  7. We setup an hourly extraction routine to extract Access records from POA table to a separate Azure SQL. We monitored and tried to find out the issue or the cause – still nothing.
  8. After blaming ourselves and our code for good few days, we raised a ticket to the Dynamics 365 Support and Product Team.

Finally, the issue was found to be related to the Table: SubscriptionTrackingDeletedObject table and an associated cleanup process that runs every day in the morning (our UK time) in the Dynamics 365 Platform. Apparently this table includes a list of GUIDs for records that need to be deleted from the POA table (and other locations). This table is not exposed via API (or at least we are not aware of a way to).

Basically, it came down to the fact that we imported contacts before go live the first time with these contacts original GUIDs as they were coming from an older CRM system and we wanted to maintain the relationship between entities and records. This is normally fine, however, at one point before going live we had to make some changes to the structure so we deleted those imported contact records and re-imported them with the same GUIDs again. When we did that, apparently these records and all their related security access records were marked for deletion from the POA table. When we re-imported, these contact GUIDs and their related access records were still marked for deletion. Hence, every day in the morning the good old record deletion clean up process SubscriptionTrackingDeletedObject would delete our access records and drive us crazy.

The fix was a script created and run by the Dynamics 365 support team which permanently fixed the issue for us but not before we have learnt a few hundred ways of how to try to fix such issues!

Are you watching Dynamics 365 Fortnight Fridays?

No – I’m not referring to the current craze – Fortnite by Epic Games – I’m referring to Microsoft Dynamics 365 Fortnight Fridays.

A very interesting Microsoft webinar takes place every 2 weeks is called Dynamics 365 Fortnight Fridays. The webinar is presented by members of the Microsoft Dynamics 365 Product Group and it covers all the latest and greatest about Dynamics 365 features and capabilities. In my humble opinion, I think it is a must watch webinar for 1 hour on a Friday every fortnight.

Here is a link to register for this free online event:

Welcome to Dynamics Fortnight Fridays

 

Dynamics 365 Testing Frameworks – open source GitHub Microsoft Dynamics CRM Testing Tools

I have been asked by several Dynamics 365 consultants and customers about which test frameworks or Dynamics 365 Testing tools that are available. Hence, I thought I create this post to list all Microsoft Dynamics CRM Customer Engagement testing tools I trust. I will continue to update this post with more tools and if you have a tool that I missed which is worth checking, please let me know and I’ll try it out then add it to the list if I found it useful to the Power Platform community.

First on my list is EasyRepro by Microsoft. EasyRepro is an automated UI testing API for Dynamics 365. This is a Dynamics 365 Testing library that aims to help teams of consultants and developers with UI Testing of Dynamics 365 solutions. EasyRepor API’s provide an easy to use set of commands that make setting up UI testing quick and easy. The functionality Microsoft provided covers core CRM commands that end users would perform on a typical workday and which can be extended to cover more functionality.

Here is where you can find Microsoft EasyRepro on GitHub:

https://github.com/Microsoft/EasyRepro

Next on the list is Fake XRM easy by my friend and fellow Microsoft MVP Jordi Montana. Fake XRM easy provides developers and consultants with a framework to run tests on an in-Memory context and allows you to do mocks or fakes for testing you Dynamics 365 components.

Here is where you can find FakeXRM easy on GitHub:

https://github.com/jordimontana82/fake-xrm-easy

There is also Wael Hamze’s xRM CI Framework which provides tools to automate the build and deployment of Dynamics 365 Customer Engagement CRM Solution. Using the framework to implement a fully automated DevOps pipeline will allow developers to deploy more frequently with added consistency and quality. It is also important here to mention that continuous deployment and a fully automated DevOps processes, provides a robust approach for development, testing and deployment and will deliver tangible savings to projects and programmes via efficiencies in development, testing and deployment

Here is where you can find xRM CI Framework on GitHub:

https://github.com/WaelHamze/xrm-ci-framework

Webhooks to Dynamics 365 Serverless Integration using Azure Functions

Recently I needed to create an integration between a cloud platform and Dynamics 365 Customer Engagement Cloud. This Cloud Application (Unbounce) allows you to register Webhooks which you can use to send data across from that platform to any other web application.

Please note that this article already assumes that the reader understands the basics of Webhooks and Azure Functions.

Webhooks sends data when a server event occurs typically to a web application. They are lightweight HTTP pattern with a publish/subscribe model which sends POST requests with JSON payload. This means Webhook POST requests can be consumed by any programming language or web application anywhere.

So when our 3rd party Cloud application (for example Unbounce) sends out the webhook POST message, how can Dynamics 365 receive this POST message? The answer is: Azure Functions.

It’s not the first time that Microsoft Azure Serverless Inegration capabilities, namely Azure Function Apps, come to the rescue. Azure Functions are becoming more and more the default preferred option for many Dynamics 365 related integrations.

So Unbounce sends out the webhook POST message to the Azure Function which in turn sends this data to Dynamics 365. To do this, you need to create an Azure Function that is triggered by Webhook and in your function, you can write the code that sends Data to Dynamics 365. Below are 6 steps that show case the process for adding an Azure Function App triggered by a Webhook POST call. Please comment below if you require the code in the Azure funciton (It’s standard Dynamcis 365 call to create a field so nothing fancy).

1) First, create your Azure Function App:

2) Make sure that the function is triggered by Webhook + API and using C#:

3) Then once created, create a Function within your Function app

4) Following that, we need to reference Dynamics 365 CRM SDK Core Assembly package. To do this, add a file called project.json as below:

5) then input your code inside the run.cx function which will receive JSON POST message and writes it to Dynamics 365:

6) then finally, run a test on your Azure Function App to see a record created in Dynamics 365 (a Lead in our case):

Please note that in step 5 above, you will definitely need to write code to receive the JSON payload that will come in the POST request message. So in our example, if this is coming from Unbounce, we have parse the Unbounce JSON data sent in the POST message so we can then use this data to create our lead (or contact) in Dynamics 365.

Please comment below if you require this code and I’ll be happy to share it.

Note: I’m delivering this session at a number of Dynamics 365 Saturday events starting tomorrow in London (7th July 2018). Hence, I’ll be updating it regularly (and apologies for rushing the post!)

Your feedback via comments below is invaluable and will encourage me to update it and write more about this subject.

Free GDPR Add-on Solution for Microsoft Dynamics 365 CRM Customer Engagement

Today 25th May 2018 is the day GDPR goes live! To “celeberate” this important day, and as a contribution from me to the Microsoft Dynamics 365 community, I’m offering my Dynamics 365 GDPR Add-on Solution free to the community both Customers and Partners. You can find a link to download the solution for free at the end of this post.

The solution delivers the following functionality and Data Subject requests:

  1. Consent Management
  2. The Right to be Forgotten (anonymising contacts information)
  3. Personal Identifiable Information (PII) Management

The solution includes the following components:

  1. “Consent” Custom entity with relationship to Contact entity
  2. New form for Contact entity called GDPR and few additional fields on Contact
  3. “Configuration Settings” entity for capturing config information
  4. A Plugin Assembley for the Anonmisation function
  5. A Workflow for creating tasks to renew Consent at 30, 7 and 0 days from consent end date.

For the solution to work properly, once you import the solution, you will need to do the following:

  1. Create a Queue called “GDPR” so that tasks for consent renewal created by the workflow can be added to this queue.
  2. Create a Configuration Setting record called “GDPR Contact” as the screenshot below. You need to enter names of fields you want to be anonymised separate by semicolons.

The solution takes the approach of anonymising the contact information without actually deleting the contact record. This means everything stays the same, attributed to the same contact record but the record itself will no longer hold any personal identifable information (PII) of the customer.

Here are screenshots on how the “Anonymise” button works:

GDPR Contact Form:

Click on “Anonymise” button:

Anonymised Contact record:

I hope this solution helps many in the Dynamics 365 community. If you find this solution helpful, please review and/or vote on this solution. I’ll be happy to support the solution where I can (and based on its popularity).

N.B. The solution is provided as is with no warranty. It does not guarantee GDPR compliance and your organisation will still need to ensure they are compliant.

Dynamics 365 v9.0.2 Spring 2018 Release prcing and licensing guides and information sheets

With the new release of Dynamics 365 v9.0.2 Spring 2018, I thought I’ll share links to all the new licensing guides and information sheets that are available for Dynamics 365 Microsoft Partners with access to Microsoft Dynamics Partner source, they can get the same information here:

and here is what I believe a publicly available version of the Dynamics 365 Spring 2018 (v9.0.2) licensing guide:

https://mbs.microsoft.com/Files/public/365/Dynamics365LicensingGuide.pdf

Finally, you can find all detailed documents, guides and information sheets/videos on Partner Source here:

Microsoft Dynamics 365 Licensing Guide – Spring launch updates

Microsoft Dynamics 365 Existing Customer Transition Guide​​

Microsoft Dynamics 365 Licensing Guide – Addendum for Case Management​​

Microsoft Dynamics 365 Business edition Licensing Guide​​

Microsoft Dynamics 365 Pricing and Licensing Videos​

Microsoft Dynamics 365 Licensing and Pricing Deck​ – Spring launch updates

Microsoft Dynamics 365 Pricing and Licensing FAQ​ – Spring launch updates

MICROSOFT DYNAMICS 365 ON-PREMISES DOCUMENTATION

​​​​Microsoft Dynamics 365 On-Premises Licensing Guide

​Microsoft Dynamics Field Service On-Premises Planning Guide​

Microsoft Dynamics 365 On-Premises FAQ

Hope this helps!