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.

  1. 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.
  2. 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.
  3. 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).
  4. 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).
  5. 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?

  1. 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.
  2. 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.
  3. 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.
  4. 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

Tipster truckThe 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:

Azure backup

Blob storage in Azure also gives us an insight how backups are organized:

Backup blob

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.

Tip #983: Why Excel templates are better than dynamic spreadsheets

With the deprecation of the Outlook Client, some users are wondering about dynamic spreadsheets. If you are moving to the cloud or have IFD on premises, you need to run Dynamics 365 for Outlook (the Outlook client, not the new app) to use dynamic spreadsheets.

I’ve had this conversation with multiple clients, and while they have been initially disappointed that they won’t be able to use dynamic spreadsheets after they go to the new Outlook App, once they get their hands on Excel templates, they aren’t so sad anymore. Some say they are actually a better solution.

The big value of Dynamic spreadsheets is that you can export data to Excel from CRM with an embedded query. Every time you open the spreadsheet, you can refresh the data from CRM, without having to log in to CRM.

That can be a nice timesaver; however, the thing about people who are Excel junkies is they typically don’t want to just get the data in Excel–they want to do something with it. Add formulas, pivot tables, charts, calculations. And while you could add these items to a dynamic spreadsheet on a separate tab, it was never a truly supported feature, and you definitely couldn’t change the table in a supported manner. If you got your dynamic spreadsheet extended with charts and pivot tables and then you needed the same spreadsheet with a different query, you would need to re-export a second copy of the spreadsheet from a different view.

Enter Excel templates.

First thing to note, Excel templates are NOT dynamic. They don’t refresh each time you open them.

But what they do is give you the ability to export data from Dynamics 365, modify the export table (add columns, calculations, totals, etc) and pivot tables, charts, and anything else your little Excel loving heart desires. Then you can upload that template back into Dynamics 365 and run it from any view of the selected entity in Dynamics 365. Even if the view doesn’t include all of the fields in your template, it will work with the view.

So as a trade-off for giving up the dynamic query, you get the ability to more extensively modify the spreadsheet, including the table, you can run it with any view from the entity, and (IMO) best of all, you can run it from mobile.

Fair trade I would say.