When building chat bots with the Bot Framework, we are in a great position of being able to target many channels with a single bot. However, that doesn’t mean you should simply enable your bot on multiple channels without considering how you can optimise the experience for users of individual channels.
In this and the next couple of posts I am going to be looking at a few ways you can optimise your bot for use with the Facebook channel.
In this post I am going to start off with looking at enabling a better on-boarding experience for your users using the ‘Get Started’ button.
Why?
Before we talk about the how, lets quickly touch on the why. On-boarding is a super important thing to consider when building a bot. The worst possible experience in most cases is a bot that doesn’t set any expectations for the user and simply starts with a blank message window. This can lead to confusion and even the user thinking that they are going to be messaging a human, which is usually not what you want. Think about it, if your users are talking to a bot (and they know it) and it gets things right 9 times out of 10, they are going to be pretty impressed because they are getting serviced instantly and in return are likely to be more forgiving of a few mistakes. However, if they think they are talking to a human and the ‘human’ gets simple things wrong 1 times out of 10, they are likely to get frustrated.
On-boarding is also a great way to set users expectations about what a bot can actually do. By providing a welcome message to your users, greeting them and listing a few features and maybe some examples of how they can get started with your bot, you are reducing the chance of the user asking the bot to do something it cannot do and therefore reducing the chance of errors and poor experience.
Can I not use conversation updates and the Facebook greeting message?
Under normal circumstances, on most channels, we can use the Conversation Update activity, special types of activities sent to your bot when events like a user starting the conversation occur. Unfortunately these do not work consistently across all channels and whereas you can use something like this to send a welcome message in web chat, the same doesn’t work for Facebook – so we need to find another way of getting our welcome message to the user.
You also have the option of using the Facebook greeting message, which is shown to users before they send their first message to your bot. As you can see in the image below on the Walt Disney World bot I released recently (more on that in another post), I have started to set the user’s expectations of what my bot can do using this message. This is absolutely something you should use and is a useful tool in and of itself, but it has it’s limitations. Namely you don’t get a lot of characters to work with and sometimes users may just ignore it and simply start talking to your bot, at which point it’s gone.
Enter the Facebook Get Started button
Thankfully, Facebook have thought about this and have given us a way of knowing when a user is starting a conversation with our bot. The Get Started button can be enabled on your Facebook Messenger bot so that a user must click it before they are able to send a message to your bot. When they do click it, we receive specific Facebook channel data on the Activity that is sent to our bot, meaning we can look out for it and respond appropriately.
Before you can handle the Get Started button in your bot, you need to enable it. To do this you need to send a Curl request like the one below, replacing the page access token with your own (you will have generated this when you registered your bot with the Facebook channel).
1 2 3 4 5 |
curl -X POST -H "Content-Type: application/json" -d '{ "get_started":{ "payload":"GET_STARTED_PAYLOAD" } }' "https://graph.facebook.com/v2.6/me/messenger_profile?access_token=PAGE_ACCESS_TOKEN" |
Once enabled, when a user first chooses to message your bot, they will see the Get Started button. Here it is in action on my bot. Hint: If you have already started a conversation with your bot through Facebook, you can click the settings icon in Messenger and delete the conversation. Next time you start a conversation, you will get the Get Started button as if it was the first time.
Handling the Get Started button in your Bot Framework code
When a user clicks the Get Started button and the resulting Activity reaches your bot, you need to do two things;
- Check if the incoming message is from the Facebook channel
- If it is, check for the Get Started button postback payload (you can read more about channel specific data over at the excellent Bot Framework docs site
Below is an example of how you can achieve this by altering your Post method on your bots MessagesController.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public async Task<HttpResponseMessage> Post([FromBody]Activity activity) { if (activity.Type == ActivityTypes.Message) { var message = activity.AsMessageActivity(); if (message.ChannelId == "facebook") { var postBack = message.ChannelData != null ? message.ChannelData.postback?.payload.ToString() : ""; if (postBack == "GET_STARTED") { await SendWelcomeMessage(activity); return Request.CreateResponse(HttpStatusCode.OK); } } await Conversation.SendAsync(activity, MakeRoot); return Request.CreateResponse(HttpStatusCode.OK); } await HandleSystemMessage(activity); return Request.CreateResponse(HttpStatusCode.OK); } |
If the Get Started payload is found, you can then call another method to send a welcome message to the user, which could look something like this.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private static async Task SendWelcomeMessage(Activity activity) { var connector = new ConnectorClient(new Uri(activity.ServiceUrl)); var getStartedReply = activity.CreateReply(); getStartedReply.Type = ActivityTypes.Message; getStartedReply.Text = "Hi! I am WDW Buddy, here to make your life easier when you go to Walt Disney World."; await connector.Conversations.ReplyToActivityAsync(getStartedReply); getStartedReply.Text += "You can ask me about wait times, show times and park hours."; await connector.Conversations.ReplyToActivityAsync(getStartedReply); getStartedReply.Text += "You can ask things like, 'how long is the wait for Tower of Terror?'"; await connector.Conversations.ReplyToActivityAsync(getStartedReply); } |
You could even send the user a choice prompt so that they can simply choose an option to get started with your bot!
Summary and what’s next for Facebook optimisation for your bot?
Hopefully this post has given you a good tool to add to your armory when building bots with great user experience in mind. I encourage you to always consider what channel specific capabilities you can take advantage of. Don’t forget, in many cases users will already be used to such channel capabilities, like the Get Started button, from their interactions with other people and bots on the platform.
In the next post I will be discussing the Persistent Menu and how you can use it to give your users access to quick actions anytime during their conversation. Here’s a peek of what it looks like.