personalized customer experience with voice bots and Dynamics 365 Customer Service

do not ask things you already know.


Imagine calling a company you have a contract with and doing regular business with. From the beginning, their automated self-service platform knows anything related to your last transaction.
No need to say your name, customer number, or anything else more than once to verify your identity.
It sounds like a dream, no, just reality, if the company would combine Dynamics 365 Customer service and Power Virtual Agents with the phone channel and use some 1st party extensions and variables in your voice bot.


All you need, besides you already have Dynamics 365 Customer Service & Power Virtual Agents and the Voice Channel via Azure communication services installed, is installing three extensions to Power Virtual Agent:
Power Virtual Agents telephony extension
Omnichannel Power Virtual Agent extension
Omnichannel Voice Power Virtual Agent extension

If you struggle with the D365. PVA or the Voice Channel, look at my previously released articles.
Dynamics 365 Customer Service with Power Virtual Agents - Part 1 (automation with text chat)
Dynamics 365 Customer Service with Power Virtual Agents - Part 2 (automation with voice/voice bots)
Dynamics 365 Customer Service Voice Channel


After installing the three extensions, you can use variables and actions to retrieve information about the caller stored in Dynamics 365.

Use of variables

With Power Virtual Agents telephony extension, you can use the caller ID (the caller's phone number) to identify the user. Consider using a second factor (voice fingerprinting or a question to verify the customer number, etc.) for authentication if required.

With the other extension, you will get "bot.msdyn_" variables with all information about the caller. You can find them in your PVA variables.

Figure 1: Available variables after installing the extensions

Figure 1: Available variables after installing the extensions.

Example 1: Personalized greeting based on caller id

Right after sending the first greeting, you can check if the bot.CustomerPhoneNumber is not empty.
If it's empty, the caller is not sending one, or we are not in the phone channel if you use the same bot for text and voice.

Figure 2: personalized greeting

Figure 2: personalized greeting

If there is a phone number, and the caller is a returning contact (number in your database), you can use bot.msdyn_CustomerName to greet the caller by name.

Please consider handling exceptions like:

  • no caller ID, but we are in the phone channel,

  • caller ID is present, but a new caller is calling,

  • etc.

Example 2: callback without asking for the phone number

If you want to offer a callback, a phone number is stored in the variable bot.CustomerPhoneNumber, as the caller transmitted the caller id. Just ask for confirmation that the caller wants to have the callback on the number currently used for dialing in.

Figure 3: Confirmation of user for callback

Figure 3: Confirmation of user for callback

Figure 4: Message to the user with phone number

Figure 4: Message to the user with phone number

Available variables

You can use a whole list of variables, which are well-documented in Microsoft documentation. If your agents filled the data in their customer CRM data, the preferred language (to create a language routing) and the survey consent (to avoid bothering the caller) are available.


It is easy to provide personalized customer service with data you have already collected, making your customer feel more welcome without a tailored response.

Did you find this article valuable?

Support Holger Imbery by becoming a sponsor. Any amount is appreciated!