I have recently been helping a company in Texas implement Microsoft’s new Omnichannel voice channel. They presented me with an “interesting” requirement … as call centers in Texas may be located in tornado alley! Meaning they might need to suddenly leave as a twister is due. This got me thinking as to be able to quickly alert customers that you have closed due to an emergency might be a common use case. For example, what will happen if the fire alarm rings, and everyone must suddenly vacate the building?

Obviously, customers who are currently in conversation with agents will quickly be told “sorry we urgently need to leave the building”. But what will happen to anyone who calls whilst the agents are away. Well, if all the agents have chance to set their presence as do not disturb, that might trigger a stock message as no agents are available.

But it might be better to start to terminate all calls with a custom message. How could we achieve this? And also, how could the maintenance of that message be simple and fast. We don’t want to be hanging around in a burning building waiting for customizations to publish. Or for a change in the Omnichannel config to apply (as that takes 15 minutes).

My idea was to get the IVR BOT to query the Dataverse and if an emergency message record existed to read it to the customer and terminate the call.

In this post I will explain how I have achieved this … as the design pattern maybe useful in many situations.

The changes I made are as follows.

  1. I created a custom table
  2. I added a new topic to my IVR BOT
  3. I created a Power Automate
  4. I altered my greeting topic to redirect to my new topic

I will describe my change below. I will be assuming you have a reasonable understanding of how Omnichannel IVR BOTs operate and a basic understanding of the Power Platform. But that said this is a pretty simple change.

Step One – Custom Table

Maybe keep in mind that I have created this solution as a proof of concept. You could have more fields on your custom table or additional logic in your IVR.

I called my table “Emergency Message”. I renamed the “name” column to be “Message” and I added just one new column. That was a yes/no field, that I called hang up.

My logic being if the hang up field is set to yes. Then the message will be read by the IVR BOT and the call will terminate.

I ended up with a very simple form! It contained just these two fields.

Finally, I simply added my new table into the “Omnichannel admin center” app. As this was a proof of concept!

For a real implementation you could do something more creative! Like have a Power Automate that is triggered from a button which will create your emergency message. As you could then have that available on a phone. It might better to vacate the building and then press the “emergency button” once you are safe!

Step Two – new topic in my IVR BOT

Next, I started to amend my IVR BOT. I created a new topic that I called “Twister Check”. (Obviously you can use a better name.)

My new topic first calls a Flow. (I will give more details on that in the next section.)

My Power automate will return two values “Message” and “Hangup”.

If hang up is false, then the twister topic will redirect to my next topic. Which in my case is one called “How can I help you”. In that the BOT will ask the nature of the query and transfer the caller to an agent.

But if hangup is true, then the emergency message will be read to the customer and the call terminated. Notice that I have used a “SendUninteruptableMessage” action. As I wanted to be sure the message was heard by my caller without any chance that they might interrupt the BOT and therefore stop this process.

Step Three – Power Automate

As you saw my Twister Check topic triggers a Power Automate Flow.

My Power Automate was quite simple. I initialize (and default) a couple of variables. Then I read my custom table. If a row is found the variables are updated based on the record in the table. And finally, the values are returned to my IVR BOT.

Below you can see that I have expanded the actions that initialize my variables. The first is “Hangup”. Notice that it is of type boolean and I have set a default value of false. Meaning by default we won’t hang up on our customers! The second is “Message” and is of type string.

Next, I used a “Dataverse List rows” action. In my simple proof of concept I would only ever have one or no emergency messages. So, I could simple select my custom table “Emergency Messages” and set the row count to 1. As the maximum rows to be returned would be one.

Next, I added two “Set Variable” actions. And as I added values from my list action they get added into a “Apply to each” block. You can see that Hangup and Message have been set to the values held in my “Emergency Messages” table.

And finally, I amended my “Return value(s) to Power Virtual Agents” action to include my two variables. Messages as a text field and Hangup as a Boolean.

Step Four – Greeting Topic

All that remained was to alter my greeting topic. It used to redirect straight to my “How can I help you” topic. But instead it now welcomes the customer and diverts to my newly created “Twister Check” topic.

I am sure you will agree this was a simple enhancement! But one that hopefully gives a useful example of how a Power Automate can be used with an IVR BOT to query records in the Dataverse and return results. Enjoy and keep away from tornadoes!!