Lessons Learned from Beep Boop’s new Slack bot

Mike Brevoort
Slack Platform Blog
7 min readOct 20, 2016

--

Today we are happy to share our most recent development: a brand new Beep Boop Slack bot 🎉. It allows you to manage projects, subscribe to notifications from any channel, and chat with us from the comfort of your own Slack team.

The Beep Boop Slack app runs as a standard Beep Boop project and is built with Slapp, our open source node.js library . It uses the Events API, message buttons, Slash Commands, and a bot user.

The socket based Realtime Messaging API has its advantages but imposes an impedance mismatch between the rest of the Slack platform, which is HTTP based

We favor the Events API because it makes it easier to develop and deploy Slack integrations at scale. The socket based RTM API has its advantages but imposes an impedance mismatch between the rest of the Slack platform, which is entirely HTTP based.

Six Lessons and Recommendations

With the new Beep Boop Slack app, we pushed the boundaries of what is possible, acceptable, and pleasing. We wanted to provide a balance between complexity and convenience for the user while gracefully conforming to Slack’s formatting and interaction guidelines.

There were six key lessons and recommendations that guided our approach, thinking, and design.

1. Stay out of the uncanny valley

The “uncanny valley” was coined in 1970 by robotics professor Masahiro Mori. Mori postulated that as the human likeness of a robot increases, our familiarity and empathy for it increases as well, until a sharp inflection point where our empathy almost instantly turns into revulsion. The distance between the points of familiarity that are “barely human” and “fully human” is known as the “uncanny valley”.

The uncanny valley, the proposed relation between the human likeness of an entity and the perceiver’s affinity for it.

A Slack app may be a chatbot, a notification deliverer, a command interface, feel more like a traditional application, or be a combination of each. Applications typically have more structure with views and prescribed actions in the form of UI elements. Chatbots, on the other hand, are natural language interfaces, more fluid and open ended.

An appbot is minimally conversational, structured messaging bot agent application

Our new bot is decidedly inhuman. It doesn’t chatter, exchange pleasantries, or try to convince you it is intelligent. Instead it guides you down a predictable path. It is an “appbot” with personality consistent with our brand, but first and foremost users should identify with our Slack app as an application and not as a humanlike robot. As an appbot, it is minimally conversational and exhibits application-like qualities.

2. Buttons can be used for navigation

Buttons are perfect for triggering actions but also create a new opportunity for navigation. Notice in the recordings below that navigation is performed almost exclusively with buttons. With each button invocation, the previous message (aka view) is replaced with a new view. There is also a back button at the bottom of each view that takes you to the previous view. This simple ontology should be familiar to Beep Boop users.

Buttons, buttons and more buttons!

3. Mind historical relevance and take out the trash

Be mindful of the channel trash you create. It’s irritating when a person fills the channel with a tsunami of messages, but it is untenable when those messages are system generated. Spam the channel and the love for your bot will quickly sour. You will either be relegated to the sideline (e.g. #bot-spam) like Woody and Buzz being sent to the attic in Toy Story 3, or even worse, uninstalled and shipped off to Sunnyside Daycare.

Sunnyside Daycare was once a great place for bots to be played with until Lotso arrived.

Ask yourself: would the message be useful in search results? Is it just noise? Does the sequence of conversation tell a story that should be retained? If a message has no historical value, then delete it or replace it if you can. For example, we may replace a message with a completely different view when navigating with buttons.

Replacing the message with the next view.

Or we may replace it with a message that is contextually relevant.

Indicating a selection for contextual relevance.

And sometimes it makes sense to remove the message entirely. For this we provide a “Dismiss” button which feels right since we are positioned as an appbot.

You are the weakest message, goodbye.

4. Don’t forget about ephemeral messages

Use ephemeral messages judiciously. Ephemeral messages can be sent in response to a message action or a slash command and are only visible to the user who initiated the event. They are the perfect way to share information, like an error message in response to a user-initiated event, that’s valuable to a single user and not a group.

With Beep Boop we use ephemeral messages to reduce noise and keep private information private. When you browse your personal list of projects or lookup your account information, we can safely assume that you don’t want to share this information with anyone else. For this reason, we send the Beep Boop menu, which is initiated from the “/beepboop” slash command, as a ephemeral message.

Ephemeral messages are only visible to one user

If you subscribe a channel to a particular project, those messages are normal messages visible to anyone. We assume you subscribe a channel because the project is relevant to that cohort of people. In the future, we’ll provide a way for you to share some views (e.g. log history) with the channel by replacing the ephemeral message with a normal message.

If there is a predictable action to be performed in response to a notification, provide an inline button

5. Make notifications actionable

If there is a predictable action that may be performed in response to a notification, provide a button inline with the notification. For example, when a build fails for your Beep Boop project, you receive a build failure notification with a retry button. In truth, we wanted to provide an option on each notification to unsubscribe or quiet notifications but the presence of buttons on each notification message felt too heavy.

’Cause if you liked it, then you shoulda put a button on it.

6. Act on behalf of each user

The first step to using the Beep Boop bot from Slack is to link a new or existing account. We map your identity in Slack (Team ID + User ID) to your Beep Boop user and use your OAuth credentials for any derivative calls. In the above example, if you click retry on a failed build notification for a project you don’t have access to, you will receive an appropriate error response.

Keeping things on the up and up 🙅.

Slack helps people work together regardless of location or device. It connects groups, systems and data under purposeful contexts, and is the application that has improved my working life most significantly.

We created Beep Boop to make it easy for people to bring their business applications, workflows and data into Slack. Beep Boop is an end to end development, management and hosting platform for Slack integrations. And we think Slack is a human-first operating system that allows people to collaborate with systems, much like they do with each other.

Slack is a human-first operating system.

Not all Slack integrations are created equal, so these recommendations that guided our thinking may not work perfectly for you. At a minimum, we hope this sparks some creativity for your next project. For us, 🐶 dog-fooding Beep Boop and Slapp to build this integration was incredibly valuable.

If you are interested in creating Slack apps for yourself or others, I hope you give Beep Boop, Slapp, and the Events API a try. And if you need any help, the Beep Boop and Robots & Pencils team is here to give you a boost. 👋

Special thanks to Maaike Van Lambalgen for her illustration talent 💕

--

--

Mike Brevoort
Slack Platform Blog

Just like you but different. Runner, cyclist, parent. Engineering @Slack