This will be a quick post, as the connector doesn’t take a lot of configuration.
The Business Scenario
Big Energy has a lot of sales people, all over the country, which make a lot of calls, usually on their mobiles, to potential or current customers, arranging opportunities and resolving any issues.
The Sales Director at Big Energy is concerned about the number of calls that the sales people don’t always log those calls, only when they deem it important and have no traceability about how many calls an individual has made.
Could a solution be found that would log every call a sales person makes to a number D365 knows about?
IFTTT (IF This Then That) is a free web service that allows users to create applets to connect their devices with their services. There are lots of sample applets to automate tasks, my favourite is linking Alexa’s shopping list with Tesco to add everything I add to Alexa to my Tesco order. Simples.
IFTTT works with a lot of devices and it has a stand alone app for smart phones, allowing interaction with the device.
Log in to IFTTT and go to My Applets, then New Applet. Hit the big blue this
Search for phone, and select Android Phone Call (sorry think this is only Android users)
This presents you with several triggers, the IF part. Select Any Phone Call placed. You will have to make another App for received, but same logic.
The next step is to tell IFTTT what you want to do, select the big That button
IFTTT lets you search for all the available services that you can trigger from your data. Search for Web and select Webhooks.
The only option here is to make a web request.
Create the Flow
As in the previous articles, start with a generic http trigger in Flow. Firstly, select HTTP trigger, and enter a default body for the JSON. This is generic enough to allow the call so the schema passed from IFTTT can be created.
As the action, send yourself an email, with the Body of the email being the body of the request.
Hit save and go back to the trigger. This URL is the bit you need to pop back into IFTTT.
Connecting Flow and IFTTT
Back in the IFTTT Web Request, paste in the URL. I have changed the Method to Post, content type to json and included in the Body 3 ingredients (data returned by the call placed method trigger into the body. This is formatted appropriately to become a valid JSON Request
This is now ready for testing.
For testing to commence, a call needs to be logged. This means you need to install the IFTTT app on your phone, log in and check the app you created is available.
Once this is done, make a call.
If successfully, your Flow should run, sending you an email. If not, you can look in the IFTTT log by checking the activity log.
The log highlights what happened for each run, when it was updated etc. Not as user friendly as Flow, but at least you get an error code. I found I was getting 400 errors, as the format for the JSON wasn’t correct.
My email also has the information sent from the request, this is used to tell Flow properly what is expected, allowing access to the properties.
Is the Contact known?
The assumption is that not all calls made by the user will be to known contacts. Either unknown to D365 or personal calls. The first thing that is required is to find the contact. Using the List Records component, use a filter query to return all contacts that match the data coming from IFTTT with any of the phone numbers held against contact. Be careful here, as the number as entered by the user in the contact on their phone or as dialed is used here.
The next step is to check if any contacts were found. As previously, check the length of the return from the previous step has one or more contacts in it. Add the contact id to a variable if contacts were returned, terminate with grace if not.
Create the Phone Call
Creating the phone call is a straight forward call to the CDS Create Record action.
Couple of formulas here, firstly the timestamp that comes from IFTTT looks like
May 01, 2019 at 05:50PM
Flow doesn’t like this, so the expression for Due is
replace(triggerBody()?[‘occuredat’], ’ at ‘,’ ‘)
Duration from IFTTT is in seconds, in D365 is minutes. A simple divide by 60 puts in the right value
Flow is complete.
Can it be be recorded better?
The call that Flow creates is missing 2 key components, the From and To
The CDS connector doesn’t support activity parties (these fields are both party fields, the user can type and search for multiple contacts, users, leads etc to populate this normally). You can get at these via standard API calls, so back to the custom connector.
My previous post on LUIS used a custom connector to close the incident using an action. This walks through creating the connector, so I won’t repeat myself.
I will step through the specific action for creating the call, as it isn’t straight forward. Further, Postman is still your friend. The only way I managed to get this configured is relying on this great tool.
Using Postman, the format of the JSON can be defined, based on the API reference for Phonecalls. This highlights that activity parties are created, and associated with the call to create the phonecall.
Take this JSON body and copy into a new action in your custom connector.
Enter details in the general page, just enough to uniquely identify your action. Of course, you need to be a bit more descriptive if you plan on shipping out the connector.
Select Import from Sample, Select Post, the URL should be just PhoneCalls, paste the JSON above into the body
Flow does some magic and now you can update your connector. I tried testing this, but got a little confused (me of little brain) so I assumed that Flow is good and would handle it and went straight to using the connector in Flow.
Back in Flow, select a new action, custom connector, the new one you just created and the action established.
The populate as below. I know the parameters are not the best names, someone with a bit more time would have tidied this up.
These are the same formulas that were used earlier. You need to add the “/contacts(” etc to each GUID as the data bind requires it.
Run the Flow and just like that, the Phone Call is created in D365 with a Call To correctly established.
Call From is missing, IFTTT doesn’t let the Web call know who called it. I have searched, but IFTTT is meant for home grown activity, so if you have registered the app, you should know the call. The easiest way around this is to pass in a hardcoded value (email) specific to the end user so a System user can be looked up and populated in the parties field.