Over the past couple of months, we planned and implemented a move from a Slack group to a Discord server. There are many pros and cons of both platforms, and in fact, we covered them in detail, along with Discourse, in our blog post Slack vs Discord vs Discourse: The best tool for your community.
But as our community grew, we began feeling the limitations of Slack as a community platform, and generally felt the need for more flexibility. That’s why we made the switch to Discord.
In this post, I’ll share our playbook for the move, along with several ideas and gotchas for anyone else considering setting up Discord for their own community.
As of this writing, the total number of members in Discord is smaller than the user count in Slack, but it’s catching up fast.
In that sense, we did take a short-term hit in terms of the gross user count. But as you know, not all user accounts represent actual engaged humans, so we’ve paid closer attention to the frequency and quality of conversation on the new platform, more than the simple total count of members.
Since the migration, we’ve received positive feedback form the community, and our community activity overall has increased, with more conversations happening across more channels.
In sum, the move has proven a success on all accounts, and I’m glad we made the move now rather than in the future.
Alright, how did we do it?
Here’s the TLDR on our process
Before digging into the specifics of each step, let’s look at a few key points that drove our decision in the first place.
There were several reasons, from tactical issues related to message history, to higher level concepts, like wanting more flexibility as the community grows.
Most communities, including ours, are on Slack’s Free plan, which only allows you to see and search for the 10,000 most recent messages. More specifically:
Members can send unlimited messages in Slack, but only the most recent 10,000 can be searched and viewed in your workspace. (source)
10k may sound like a lot, but by the time your community hits 250–300 members, you’ll blow right past the limit. We certainly did.
Discord enforces no such messaging limit, which means we don’t have to worry about losing context and conversations as the community grows.
In addition to the usual chat channels, Discord offers voice channels, which can be used for everything from casual chats to support to live discussions. These rooms also offer one-click video and screen sharing, making impromptu conversations fast and easy.
As the community grows, moderation and permissions will become more important. Discord offers better capabilities along these lines.
Discord offers more options for channels and groups, allowing for a fine-grain architecture of channels. For example, we’ll be able to spin-up private chat and voice channels for customers inside of the server, while creating standalone public channels for events and more.
If you decide to make the move, here are my recommendations for planning and implementing the migration.
As we thought about switching to a new platform, it was important for us to get community input and buy-in. After all, our members had been sharing ideas with each other and getting support in the Slack group for months.
And ultimately, there are way more community members than there are Orbit team members, so we didn’t want to just unilaterally impose the change.
Most agree that transparency should be a core value of any community, and this seemed like a great way to put that idea into action.
To do that, we drafted a proposal outlining our rationale, and left the Google Doc open to comment, so folks were able to add questions and ideas right in the doc. Check out the proposal (now read-only) here ››
We then shared a post in the existing channel giving folks a heads-up.
The comments were generally positive, with some asking questions about longevity and discoverability of discussions.
While we worked to secure community buy-in, we also got to work setting up our Discord server.
Discord offers loads of flexibility for configuring your server, but with power comes complexity. In other words, there are lots of ways to fine-tune your server, but more thought and effort is required versus spinning-up a Slack instance.
By the way, in Discord world, "server" is just Discord's word for "workspace."
To help us wrangle the moving parts of our server, we worked with Domitrius Clark, who’s helped set up Discord servers for communities like Apollo GraphQL, Black Tech Pipeline, Open Sauced, Streaming in Color, and Rebuild Black Business, and for events like GraphQL Summit.
Working with Dom gave our team a huge head-start.
There are many things to keep in mind with your server setup, and the specifics probably warrant a separate post.
That said, let’s go into the weeds a bit on these points, since a broad understanding here will provide helpful context for the rest of the post.
On a Discord server, permissions are associated with roles. A member can have multiple roles, affording them different abilities to do things like send messages, create channels, use voice and video, invite other members, and more.
Practically, here are few things to keep in mind:
Here are some of the high-level roles and permissions we created:
This role is reserved for members of the Orbit team. With this role, all community members know immediately who actually works for Orbit.
From a safety perspective, this means it’s impossible for a nefarious actor to impersonate us. More often, though, it just means folks know who to turn to for help.
You can also configure roles to allow anyone to @mention everyone with that role. This is another quick and easy way to get the attention of all users with a certain Role.
In addition to a special color for our usernames, Orbit team members always appear at the top of the users list:
We work with a small subset of the community for quick feedback and iteration on new features and ideas. To facilitate easy discussion, we created a Beta Program category with two channels.
We also created a Beta Program role, which has access to the private channels.
With an understanding of Roles, let’s talk about the next key concepts: categories and channels.
Setting up Categories and Channels
Like Slack, Discord lets you create public and private channels, and group them into Categories. The two types of channels are chat and voice.
The interesting thing about voice channels is that they can also turn into streaming and live video channels with a click or two. This facilitates super simple meetings and screen sharing, which can be great for general hangouts or to quickly troubleshoot an issue.
At the outset, we created several public and private categories and channels.
Our Core categories include #random, #general, and #orbit-model, where folks discuss concepts about the Orbit Model. There are also two special channel types in Core.
The first is #announcements, which is a read-only channel where we share product and community updates. The second is #voice-chat, where anyone can drop-in for an impromptu conversation. This is also where we hangout on community game days.
When someone joins the server, they land in the #getting-started channel, which is read-only:
We encourage folks to say Hello in #intros. Here are a few other key categories and channels:
Product & Support - channels for getting help and for talking about potential features
Collaboration - for sharing integrations and apps built on top of Orbit
Beta Program - a private category for folks in, well, the beta program
With your channels in place, there’s one more configuration choice you probably want to consider.
Configure your server as a Community Server
Discord offers a special designation for community servers, which unlocks several features highly relevant for you if you’re reading this article. This setting is not enabled automatically, but easy to do in Server Settings.
The first benefit is Membership Screening, which lets you require new members to verify their email for joining, and asks them to accept your guidelines before entering. This screen is fairly customizable and lets you spell out your expectations for behavior on your server. Here’s what ours looks like:
Additionally, community servers offer a customizable welcome screen, which lets you set context and point new members in the right direction upon joining. As your community grows, you’ll add more categories and channels, so the welcome screen will help reduce any feeling of overwhelm for new users joining for the first time. Here’s ours:
Alright, you now have many of the key Disord concepts in mind. Let’s return to the implementation plan.
To kickstart the move to Discord, we planned to offer several incentives to encourage early adopters to join us on Discord.
First, we created a limited-run sticker commemorating the move. To get one, members had to join the Discord by February 1. Turns out, people like stickers! Here's our space canary, commemorating the migration 👇
Second, we hosted a community game day in #voice-chat, and invited community members to join us for a few rounds of skribbl.io. I can’t imagine trying to facilitate this kind of experience without Discord; setting up a Zoom call just feels too heavy.
Finally, we worked with Domitrius to host a handful of Discord Q&A sessions to make sure folks had ample time to understand the platform and to raise any questions or concerns.
With our incentives designed and planned, we were ready to begin the rollout.
As we planned, we knew we wanted to avoid two potential outcomes.
First, we wanted to avoid the ghost town vibe many newer communities have at the beginning. People are more likely to ask questions and start discussions when others have already done so, so we knew it would be important to kickstart the conversation early.
Second, we wanted to make sure the cultural DNA established in our Slack community would emerge in Discord as well.
To do that, we defined cohorts of community members, then phased the rollout across them. That meant the “launch” actually happened over the course of a couple of weeks.
Here’s what worked for us:
Share a limited preview with a very small group.
The day before the big rollout, I messaged a handful of folks in Slack to preview the new server and highlight any areas that were confusing or unclear. This gave us the chance to seed some initial conversation in the new #general channel, and generally make sure everything made sense.
Can folks find their way around? Do you have any misspellings in channel descriptions? Do the invite links actually work? This preview will help uncover issues like that.
Invite those who are currently active in your existing community.
For us, that meant making a lot of noise in the #general channel in Slack to engage with the folks who are already active there.
For one, we knew these folks are early adopters and love trying new things. We guessed that their pioneering spirit coupled with the incentives would be enough to get our community flywheel spinning and avoid the community ghost town effect.
Additionally, as members of our Orbit community, these members were all core community contributors. By involving them on the new platform early, we hoped to transfuse much of the culture and norms from the Slack group before inviting a more general audience.
Finally, there were active discussions already in-flight in Slack, so we just asked folks to pick up where they left off, or just start over, in Discord.
Tactically here’s how that looked: I posted a message in #general, pinged @channel, and included all the details on how to join the new server and upcoming events, like game day and training sessions.
The result: about 30% of the members of our Slack group joined our Discord server within 24 hours of the announcement in #general.
Next, email everyone with an account on the existing platform
Three days after the invite in #general, we emailed everyone with an account in our Slack who hadn’t already joined Discord.
Since the core group had already moved over, most of the channels already had conversations going and things looked fairly active.
Within a couple days of the email, around 40% of the folks from Slack had joined us on Discord.
Then, go broad, inviting all users (if you haven’t already)
We’d kept the community invites fairly narrow over the past year or so, opting to go deep with a small group of early users, but given the maturity of both the product and community, we wanted to broaden the circle.
At the time, there were around 5 times as many Orbit users as there were folks in the Slack group, so the next step was to send an email inviting all those users to join the community on Discord.
Unlike the prior batches of invites, though, these users wouldn’t yet be familiar with community norms and tactical things, like the structure of the channels.
For that reason, we held off on this email until about two weeks after the initial migration day. By then, the #intros channel was super active, there were discussions happening in various channels, and those of us on the Orbit team had time to tweak various settings based on observation and input.
In the coming months, we plan to expand the community even more broadly, beyond Orbit customers to include folks starting and building communities of all types. By then, permissions and moderation will be in place, so we’ll be able to scale the community safely and deliberately.
Here’s the the rough planning and migration timeline we followed:
T-30 - secure community buy-in
T -30 to -5 - configure server, design incentives
T-5 - team testing of the server
T-1 - very limited preview with a few members
T0 - launch migration with core members
T+3 - expand to others
T+3–14 - encourage conversation and connections; tweak server settings; host events
T+14 - invite the next cohort
Even before we invited our super small preview group, the Orbit team spent a week or so playing around with the channels, trying to break stuff, and generally getting the hang of things. We even hosted our weekly meeting in the voice channel.
I highly recommend having your team put the server through its paces to build confidence and knowledge across your team before launch.
While activity picks up in our various channels, we’ve used #intros as a place to jump-start activity and conversation. We ask folks to share a few things about themselves upon joining, like their pronouns, where they’re based, what they’re working on, and one fun fact.
For the first several weeks, I’d personally make sure folks posted this message, within a day or so of joining in the interest of building momentum and establishing cultural norms.
Discord is powerful out-of-the box, but you can upgrade your server to unlock features like a custom server banner and, more importantly, higher quality audio and video capabilities.
Originally, boosting allowed individual community members to chip-in to upgrade a server, and Discord offers increasing benefits the more boosts it’s received.
For folks coming from Slack world, boosting may seem like a curious holdover from Discord’s gamer days. Indeed, the business model here is clearly different from Slack’s, which assumes a single company is paying for everyone’s seats.
We wanted the upgrades, but didn’t want to ask community members to pay up, so we just pay for 15 total boosts per month.
Several weeks in, we’re happy with Discord, but there are several things we miss from Slack.
Well, threading isn’t really great on any chat platform, but I’ve come to appreciate Slack’s approach, which allows thread to stay out of the flow of the main channel.
In Discord, however, threads appear inline in the flow of the channel, which gets super noisy in busy channels:
I personally really enjoy Slack’s “Remind me about this…” feature, which makes it a snap to come back to an important or interesting conversation later. Discord does not yet offer this feature.
It does offer Mark Unread, however.
Typically, if you create a new public channel in Slack, members must be invited, added, or stumble upon the channel to know it exists, and it won’t show up in the sidecar until one of those things happens.
In Discord, however, any channel created will immediately be visible to anyone with the permissions to see it.
This could be considered a feature or a bug, but one outcome is a crowded channel list for members who don’t care about whatever’s happening in that channel. Unlike Slack, Discord doesn’t allow users to opt-out on a per-channel basis.
On the other hand, Discord does offer users fine-grained rules for what kinds of notifications they receive on a per-channel basis, so the onus is really on the user to configure things to their liking.
Now that we’ve completed our move to Discord, we plan to focus on programs and activities that take advantage of the platform and provide even more value to the community. That means fireside chats in the voice channels, and deeper discussion about how to implement and apply the Orbit Model.
Have questions about our process? Hit us up on this thread on Twitter.