The Ajax control for Bing Maps in Dynamics CRM 2013-2016 on premises has reached end-of-life. Sometime in the next few weeks, maps will stop rendering, leaving you with a blank area where the map used to be.. You can find an update for your environment in support KB 4038205.
Tip #992: Updating customer data from survey responses
Can I use Voice of the Customer surveys to keep client contact data up to date in CRM
Yes you can, with the help of a workflow.
Let’s say you send a survey to clients and want them to let you know if their address or phone number have changed. You could create a survey containing fields for street, city, postal code, and phone number, then create a workflow to update the contact record with the data provided.
Here’s a “no code” way to do this. First thing you need to know is survey responses are stored in an entity called Survey Response. Answers to questions are stored in the Question Response entity, which is a child of Survey Response. When a customer responds to a survey, the customer is referenced in the Account or Contact lookup field in the Survey Response entity, and all of the customer’s answers are stored in related Question Response records.
So you could create a workflow that runs on create of Question Answer.
First step, do a check condition step to see if the related survey response is from a contact. If it isn’t, stop the workflow.
The first challenge we are going to hit is that since the answer doesn’t have a direct relationship with contact, we can’t easily update the Contact record from a question response workflow. One way to resolve this is to add a relationship between question response and contact, and if the response is related to a contact, update the contact field on the question response to link it to the contact.
Next, check condition to validate which field should be updated.
You may also want to check to see if the response contains data, so you don’t overwrite data with blanks. Then update that field of the contact record.
Add a conditional branch for each additional question that you want to update the contact record.
Warnings and considerations
This is just a simple example of how you can use VOC surveys to update customer information. While this is possible, I would think twice before using this approach in production.
- It’s not efficient.
- Depending on your volume of responses, having a workflow fire on each one (and even if the response doesn’t meet the check condition, the workflow is still running for each create) might cause performance issues.
- Having clients update their contact information can be convenient, but it can also be risky. Somebody might update their email address to be noemail@yahoo.com or put all zeros in their phone number.
- A more efficient way to do this might be to use a batch job with KingswaySoft rather than having a workflow fire for each question.
- Better options might be to use a ClickDimensions form or Dynamics 365 portal.
Tip #991: Survey snippets
Dynamics 365 Voice of the Customer lets you copy a snippet to embed in a CRM email template to invite customers to take your survey.
But if you hit the (…) button, you will see three additional snippet options:
- Face Snippet
- NPS Snippet
- Rating Snippet
This allows you to actually embed a question in the template, which can improve your response rate. But if you have tried these snippets, you may have found them not to work, and some error message saying you have to have a question with a query parameter set to “a.” What does that mean?
The answer is if you want to use one of the special snippets, you must have a question of that type on the survey (smiley face, rating, or net promoter score), and in the advanced options for that question, you must put an ‘a’ in the Pre Populate Query String” field.
Once you do that, your survey recipients will see this in their email.
Tip #990: New ways to consume tip of the day
With only a handful of tips left before the extra digit kicks in, we thought it’d be a good idea to quickly tell you the new ways to consume tip of the day.
- If you are a proud owner of a device running iOS 9 or later, you can now subscribe and read tip of the day in Apple News.
- For Facebook addicts we now push the tips to our channel https://facebook.com/crmtipoftheday as Instant Articles. Just open it up in Android or iOS Facebook app to see the difference.
- Our urls have been completely redesigned and you can now refer to the tips simply by their numbers. For example, one of our most popular tips on the “first thing first” woman simply becomes https://crmtipoftheday.com/68/. And you can search by the tip number too – type a number and search will take you straight to the tip (if one exists, that is).
- Better and shorter urls, plus Twitter built-in link handling mean that you do not have to use shorteners anymore. All they do these days is add useless redirects (and you can get clickthrough stats from Twitter, if that’s what you’re concerned about).
- Last but not least. For the tip consumers who use good old browsers we’ve added a tip roulette button (look on the very top under the title). Keep pressing – hours of entertainment guaranteed!
Did we miss anything? Do you have any suggestions how to improve the site? Please let us know in the comments or email jar@crmtipoftheday.com.
Tip #989: Cross-survey reporting with Dynamics 365 Voice of the Customer
Consider this scenario: you are conducting 4 different surveys, each of a different industry. But you want to be able to report on Net Promoter Score across all industries. What are the options to optimally group and report the the NPS responses across all four surveys?
- On the question record, there is a field called “reporting text.” This allows you to add an ID/text tag to questions for grouping purposes on reports. For example, you could add “NPS” to all of the NPS survey questions, then group the responses by the question reporting text.
- Word the questions in the same way on on all surveys, then group by question text. One way to do this and prevent “fat finger” errors messing up your reports is to create a template survey that contains the questions you want to be on all surveys, then use the clone feature to copy the template survey to create each of the other surveys.
- The linked question feature allows you to link related questions on different surveys to a common question for reporting purposes. For our example, you could relate all of the NPS questions to the same linked question, then group by the linked question field in your report.
- Response routing lets you conditionally display fields or sections from another survey based on response rules. This is the one option to actually reuse questions on multiple surveys and have them share the same question ID/GUID. While this option works, you will have to think of some question to ask first to trigger the shared questions to appear on the survey.
A final option is to not group responses, but instead to score your survey responses. Voice of the Customer allows you to assign point values to responses to calculate an overall survey response score. You can then report on customer satisfaction across multiple surveys by tracking survey response scoring.
So the takeaway is, there are multiple options to configure your surveys so responses can be grouped and reported on across surveys. They important thing is planning for analysis before you distribute the surveys, and ensuring that once you get your 2,400 responses per day you will be able to use the data.
How do you track your customer satisfaction across multiple surveys?
Tip #988: Tracking confidential emails
Tip of the day reader Christian Schulte shares the following tip about tracking emails flagged “confidential” with Dynamics 365 for Outlook (the “Outlook client”).
Let’s say you get a mail with a confidential-flag with sensitivity level set. It is not important which sensitivity-level it is (private, personal, confidential).
If you decide to track this mail, it will get tracked and created just like any other mail. But: There will be no body in the CRM-mail.
Christian uses CRM for Outlook (8.2.1.176). It is also referenced in a CRM idea.
This feature can be a good or bad thing. If you are in a highly confidential industry, tracking the email without tracking the contents of the conversation can be a benefit, as you can record that an interaction took place without risking revelation of sensitive details. But if this doesn’t apply to you and you want to capture the contents of the email, finding out the body was not tracked may be an unwelcome surprise.
So what happens in the Outlook App?
Microsoft does not document this behavior, so there is no official “how it should work” documentation. Based on our preliminary tests, it appears that if you track an email with sensitivity level of private or confidential and track it with the Outlook app, the contents of the email body is tracked in Dynamics 365.
Tip #987: Kill a few millions async jobs
When Jonas “Surströmming MkII” Rapp said that “someone should probably get fired”, he was careful to qualify the statement with “asking for a friend”. Sure, we’re here to help, friend or foe.
Jonas
Some integration job happened to touch fields that should not have been touched, and triggered a few async plugins a couple of million times. Async server is short-cutting from sweat, SQL ready to commit suicide, UI taking a nap while her friends are busy staying alive.
The only thing I can think of to fix it in reasonable time is to stop async service, run SQL update on all jobs to set status to cancelled, and then restart async service.
Any ideas or advice for me?
Truck to the rescue
The replies came thick and fast. Below is the readers digest version. Thanks to Joel, Mitch Milam, Andrii Butenko, and David Jennaway for their throughtful contributions.
Supported option or not, if on premises, then the first thing you’d want to do is to stop async service. Regardless where your instance is, take a backup for a good measure, you might need it if things go pear-shaped.
Supported
For supported approach you’d need to cancel the jobs then delete them. You can cancel in bulk without any code by using a third-party SSIS package. If coding does not scare you then use an Update to change the status of the asyncoperations, and you’d get the best performance by wrapping this in an ExecuteMultiple. To minimise latency, run the code directly on the CRM server, also run multiple instances in parallel (code should need to be able to handle concurrency).
Once all jobs are cancelled, use bulk deletion job to mop up. Don’t sweat writing code for that – bulk delete is already very efficient.
Unsupported
On-premises only, of course. Everyone seems to agree that direct SQL will be by an order of magnitute faster though it probably should be the very last resort. Some say that there are too many variables to use it safely while others were “a bit more gung-ho” as far as canceling the jobs is concerned. But everyone seems to agree that deleting records using SQL is not a good idea.
To determine what script T-SQL should be used to cancel the job, run SQL Profiler and cancel a single job while capturing the trace. This trace should give you a solid starting point for the script.
Again, use bulk deletion job to delete the canceled jobs.
Joel: Using bulk delete to kill asynchronous jobs is like a science fiction story where they build a robot that gets out of hand, so they have to build another robot to kill the first robot. Wonder how Asimov’s three laws apply?
Tip #986: Specify language for Online Management API
As soon as the word got out that I managed to use Online Management API to create backups in Azure, Marius Agur Pedersen reached out to me about the support case with Microsoft that he had in the limbo for a number of weeks.
Basically, Marius was able to retrieve instances but any attempt to backup was failing with the error 500. My code, however, was working just fine. After couple hours of joint efforts (plus whopping 50+ days for Marius), success! Long story short, accept-language header is a must have for some operations but not the others.
After a bit more digging, it turned out to be a well-hidden case of RTFM. As documented in getting started (highlight mine):
Standard headers
The Online Management API has following standard request and response headers.
Request headers
Header | Type | Description |
---|---|---|
Accept-Language | “en,” “es,” etc. | Specifies the preferred language for the response. Services are not required to support this, but if a service supports localization it MUST do so through the Accept-Language header. |
Authorization | String | Authorization header for the request. See Authenticate to use the Online Management API |
All problems went away after this line of code:
request.Headers.AcceptLanguage .Add(new StringWithQualityHeaderValue("en-US"));
(While you’re at it, check out his admin api project. It’s early days but looks promising).
In Marius defence:
- How do we tell if a service supports localization? What is so locale-specific about the backup, for example?!
- Is that such a big deal to assume the language of the instance or imply en-US and issue a warning but without failing the entire operation?
- Would it kill to return something better than a non-descriptive error 500?
The reason it worked for me was that I used a wrapper class that automatically inserted that header. To confusing everyone even further, for quick testing I was using Postman extension while Marius was using the desktop version. Former would add the language header automatically just for giggles.
Current advice? Always add accept-language header – no harm done if it’s not needed.
Tip #985: Use Azure for permanent instance backups
In the tip 759 we suggested keeping a sandbox instance as your persistent backup because Dynamics 365 Management Center provides no control over the backup lifetime. Later, we were excited about introduction of the Online Management API and, as it turned out, all for the right reasons.
Using the API, administrators can now backup a Dynamics 365 instance into Azure blob storage using Backup Instance request. The expected request data are json, you will need an Azure account and typical request would look like:
POST /api/v1/InstanceBackups HTTP/1.1 Host: admin.services.crm.dynamics.com Authorization: Bearer token-here Content-Type: application/json Cache-Control: no-cache { "InstanceId":"affff7e4-dead-beef-dead-7dbe5ffff4df", "Label" : "Blob it is!", "IsAzureBackup" : true, "AzureStorageInformation" : { "ContainerName": "foo", "StorageAccountName": "bar", "StorageAccountKey": "baz" } }
After backup completes, it is properly recognized by the admin center:
Blob storage in Azure also gives us an insight how backups are organized:
As you can see, full backup of an [almost] empty instance takes just over 850Mb, followed by transaction log backups every 15 minutes. And no, I wouldn’t waste time trying to restore that on premises.
Tip #984: App confusion
Following the word “insights,” the most overused word in Dynamics 365 is “app.” App is used in multiple contexts, and can create confusion when discussing Dynamics 365. I find it helpful to use the following terminology to add clarity when discussing Dynamics 365 apps.
- Mobile app: The official Dynamics 365 mobile app, available for iOS, Android, and Windows.
- App for Outlook: The Outlook integration for Dynamics 365, not to be confused with Dynamics 365 for Outlook, the now deprecated legacy Outlook client.
- Dynamics 365 App Modules: modular business applications that provide access to a subset of Dynamics 365 Customer Engagement. Built in the Dynamics 365 App Designer, app modules break the monolithic application into smaller business apps that address specific line of business scenarios, and only include the dashboards, entities, views, and forms needed by users for those scenarios.
- PowerApps: Mobile applications built in Microsoft PowerApps that can include Dynamics 365 data and processes, as well as data from other Microsoft and third party platforms.
- There are also apps for field service, project service, and third party mobile apps like Resco.
Where it gets confusing
If I go to a Dynamics 365 user group meeting and ask if anybody uses the Dynamics 365 app, any user of any of the above “apps” might raise their hand. This is why it is important to be precise.
Consider that in version 9, business apps built with Dynamics 365 App Designer will be recognized by the Dynamics 365 mobile app. If you are leading CRM training (and want users to understand what you are saying), saying “CRM mobile app recognizes Dynamics 365 apps” will only confuse your students. Instead, you will want to say something like “The mobile app for Dynamics 365 allows users to select a specific app module when configuring the mobile app, and users can switch to other business app modules if they work with multiple app modules.”
Hopefully this tip has provided some insight into Dynamics 365 apps.
Speaking of apps, have you checked out our new CRM Audio app for iOS? Get notified when there are new episodes, download and mark your favorites, and even an alarm to wake you up to Dynamics 365 podcasts.