Seven Deadly Slack Sins (And How to Solve Them with Automation)
Tags: slack, node, javascript, bots
Published: 2020-07-07 23:02:12

_All names are fictional and any similarities to any person, living or dead, are purely coincidental, profile pictures are from Unsplash._

_You can read the original version [here](https://blog.gbougakov.dev/posts/slack-sins)_

Looks like some offices will be staying remote until the end of the summer, [or even permanently](https://twitter.com/tobi/status/1263483496087064579?s=21). That means that for some, Slack will become the center of all business processes and communications.

![](https://storage.yandexcloud.net/gb-assets-hot/blog-assets/slack-sins/main.png)

We at Skyeng started building a remote team long before COVID-19 happened and probably ran into most of the issues of communicating remotely with colleagues and realized that we could solve most of them with bots, so we did!


## Sin 1. Asking dumb stuff and posting memes in #general

Have you ever accidentally hit “Reply All” on a company announcement sent to you and hundreds of your coworkers? If you did, that was probably a very fun and unforgettable experience :)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/fl20h1fsplm1w2kbr0m0.jpeg)

In Slack there’s a better version of this sin - post something irrelevant to most people in #general. Bonus points for tagging @channel.

And here you are, sitting peacefully, working away and hear a notification chime... “Surely, that’s something important” — you think, because you fine-tuned your notifications so that you get them only when someone DMs or mentions you. And then you see a completely irrelevant notification, get mad and put an angry emoji under the message.

We made a list of people that we trust to make relevant announcements, and for others we applied these moderation rules:

- If you attempt to post in #general, our bot deletes the post instantly, so that people don’t get a notification
- Our bot reminds what is the purpose of #general
- If the author still thinks that their message is relevant, they can click a button and the message will be sent to a private channel for moderation
- After that, a moderator from the internal communications team will review the message and either approve it or explain where is the best place for the message to be posted

## Sin 2. Not reading the pinned message

Cool, we’re done with #general! But there are still lots of channels with similar names. We, for example, have dozens of channels for each project with a prefix (usually the name of the project or the Jira project key) and a suffix (usually the name of the subteam)

Here’s an example - you found a bug in the mobile app and want to report it, so you hit Cmd+K and type in #mobile. Here’s what you see:

![](https://storage.yandexcloud.net/gb-assets-hot/blog-assets/slack-sins/mobile-channels.png)

More channels! (P.S. We now have a bot that automatically archives channels if they’re left dormant for more than 90 days)

Trust us - if you have a lot of similarly named channels, people will get lost and ask questions in wrong places.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/sfll19hy43zmsg67xwxa.jpeg)

Before, we put a guide where to ask which question in the pinned message. Nobody reads it. Even the people who put stuff in the pinned message. And again, we solved this problem with a bot!

- You add it to a channel
- When someone joins a channel, the bot sends an ephemeral (“Only you can see this message”) message with all the relevant information
- It only helps sometimes, but sometimes is better than never… I guess :)

## Sin 3. Asking questions that were already answered

We actually have a whole army of bots dedicated to solving this mess. Everything began with teachers - they, as contractors doing work for Skyeng, are granted limited access to our Slack so that they can talk directly with our support team. They even have a very detailed and always up-to-date wiki. It even has a special page where we explain how to handle “emergencies”, for example, when the video call cuts out.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/gyo783kp7acm58bnk01y.jpeg)

When an emergency happens, teachers panic. When teachers panic, they forget stuff and ask questions in their support channels.

We thought of a simple solution: integrate our wiki with Slack. When someone asks a question in a support channel, our bot takes the text, deletes “hellos” and “pleases” and puts it into the wiki search. After that, it just sends the top 5 articles and 90% of the time one of them answers the question

## Sin 4. Forgetting to move tasks to task trackers

At Skyeng, we have a channel where our infrastructure team can help you out with all of your IT questions. Most of the questions can be answered right then and there, but some require some work. And let’s be honest — unless you move that ticket to Jira, you will forget about it in about two hours.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bsn5as9b5hb323gpjfig.jpeg)

Now we have a bot that automatically creates a ticket for every single message in support channels, then the support team can use reactions or the Jira UI to move tickets to other statuses or close them. Also, we automatically match the sender to their Jira profile and mark them as a reporter on the ticket, so that they can track it in Jira

We even have a bot that… supervises this bot (I know, that’s confusing, but hang in there) - it counts messages, who answered them and asks people to “rate the service”. All this data is collected in our data warehouse and is being used to continuously improve the support experience (that just sounded like a privacy policy, sorry)

## Sin 5. Spending unjustified amounts of time gathering and posting data from other systems

Every development team leader at Skyeng has an arsenal of bots that save them time (and money for the company). Here are some of them:

- Burndown delivers daily sprint burndown charts to motivate developers
- Arseny gathers data from Jira, reminds about pending code reviews and deploys and reminds people to log their time
- Jake saves team leaders an hour a day by simplifying the process of selecting tasks for the next sprint. It automatically gathers all tickets with a specific status and sends a poll to the team channel. Then, team members vote on tickets they would like to discuss and Jake generates a plan for the team meeting so that the time is not wasted

Oh, and our email support team uses a bot that brings emails into Slack, so that our agents can easily consult with their leaders on specific cases and forward all relevant information to the designated teams.

## Sin 6. Not making sure that urgent messages reach their recipient

{% vimeo 436253009 %}

This bot can wake up our CTO

Stuff happens. Servers go down. Even at night. For emergencies and major outages we have a designated channel. We also use OpsGenie to automatically alert our DevOps team about any outages by paging calling them on their mobile phone.

- If the on-call engineer doesn’t acknowledge the message within 30 seconds, our bot calls them via OpsGenie and tells them that everything is bad and asks them to press 1 if they acknowledged the alert.
- If the on-call engineer doesn’t pick up or picks up and doesn’t press 1, the alert is immediately escalated to their team leader
- If the team leader doesn’t pick up, rinse and repeat until you reach the CTO

## Sin 7. Making typos

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/d8i9geijsvocbx2737q1.jpeg)

When all communication in the company is text-based, you start to understand why you had to take that English class. Slackbot has a built-in function when it watches for keywords in messages and replies to them with a custom text message. With one Typeform and two hours we turned Slackbot into a Grammarnazi, but after a month people started asking us to disable it. It was fun while it lasted :)

P.S. And this is far from over. We have dozens of bots doing different things in our Slack. For example, we recently built one that turns links from annoying screenshot services into simple attachments