Emoji Shortcodes: Why :thumbsup: Fails in Slack
Type :thumbsup: in Slack and nothing happens. Type the same thing in Discord or a GitHub comment and you get ๐ immediately. Slack wants :+1: instead, which is a shortcode nobody would guess.
We checked 652 emoji shortcodes across the three platforms. Ninety five of them differ somewhere, which is roughly one in seven. This is the list of which ones, and why the mismatch exists at all.
What a shortcode actually is
A shortcode is a text alias for an emoji, written between colons. The app watches what you type, matches the pattern, and swaps in the glyph before the message is sent.
The important part is that the swap happens on your end. Once sent, the message contains an ordinary emoji character, not the shortcode. That is why a message typed with :fire: arrives as ๐ฅ for someone reading it in a completely different client. The shortcode is an input convenience, never part of the message.
Shortcodes are also not part of Unicode. Unicode defines the characters and their official names. The colon syntax was invented separately, popularised by GitHub around 2011 and then adopted by everyone else, which is precisely why no two platforms agree on the details.
The seven that break most often
If you only remember a handful, make it these:
- ๐ thumbs up: Slack
:+1:but Discord and GitHub:thumbsup: - ๐ thumbs down: Slack
:-1:but Discord and GitHub:thumbsdown: - ๐ค hugging face: Slack
:hugging_face:, Discord:hugging:, GitHub:hugs:. All three differ. - ๐ rolling eyes: Slack
:face_with_rolling_eyes:, Discord:rolling_eyes:, GitHub:roll_eyes:. Again all three. - ๐ฉ pile of poo: Slack and GitHub
:hankey:, Discord:poop: - ๐ค sign of the horns: Slack
:the_horns:, Discord and GitHub:metal: - ๐ oncoming fist: Slack and GitHub
:facepunch:, Discord:punch:
๐ฉ is the one worth pausing on. The code :hankey: comes from the South Park character Mr Hankey, and it survives in Slack and GitHub because GitHub chose it in the early days and it was copied onward. A reference to a 1997 cartoon is still the canonical way to type that emoji into a pull request.
The pattern behind the mismatches
Once you see it, most of the 95 become predictable.
Discord shortens. Where the official Unicode name is long, Discord trims it. ๐ค is :thinking: rather than :thinking_face:, ๐ค is :nerd:, ๐คก is :clown:, ๐ค is :robot:. If a Discord code fails elsewhere, try adding the word back.
Slack keeps the full Unicode name. Slack tends to use the official name verbatim, which is why :face_with_rolling_eyes: works there and reads as absurdly long anywhere else.
GitHub is inconsistent, because it was first. GitHub's list predates the others and contains early choices nobody would make now, including :hankey: and :facepunch:. It has kept them for compatibility with a decade of existing comments.
The exception to all of this is ๐ and ๐. Slack's :+1: and :-1: come from an older convention in code review, where people literally typed plus one to approve something. That usage predates emoji in the workplace entirely.
Where all three agree
The good news is that 557 of the 652 we checked are identical everywhere. The reliable core includes:
:fire:๐ฅ,:tada:๐,:sparkles:โจ,:heart:โค๏ธ,:joy:๐:eyes:๐,:skull:๐,:pray:๐,:clap:๐,:rocket:๐:white_check_mark:โ ,:x:โ,:warning:โ ๏ธ,:bug:๐:crossed_fingers:๐ค,:wave:๐,:muscle:๐ช,:100:๐ฏ
Those are safe to use anywhere without thinking about it. If you are writing documentation that will be read in more than one tool, stick to this group.
The ones where every platform differs
A smaller set where all three disagree, so there is no code that works everywhere:
- ๐ค hugging face:
:hugging_face:,:hugging:,:hugs: - ๐ rolling eyes:
:face_with_rolling_eyes:,:rolling_eyes:,:roll_eyes: - ๐คญ face with hand over mouth:
:shushing_face:,:face_with_hand_over_mouth:,:hand_over_mouth: - ๐ค cowboy hat face:
:face_with_cowboy_hat:,:cowboy:,:cowboy_hat_face: - ๐ค left facing fist:
:left-facing_fist:,:left_fist:,:fist_left:
๐คญ deserves a flag. Slack maps it to :shushing_face:, which is a different emoji entirely in the Unicode naming. ๐คซ is the actual shushing face. If you type that code in Slack expecting a finger to lips, you will get a hand over a mouth instead.
Why this is not just a naming problem
Mismatched shortcodes cause real friction in two places.
Copied text. Paste a block of documentation from a GitHub README into Slack and any unmatched shortcodes stay as literal text. Readers are left looking at a literal :hugs: in the body of your text, which reads as a broken document rather than a platform difference.
Automation. Bots and integrations that post into multiple services with one message template hit this constantly. The usual fix is to put the actual emoji character in the template rather than a shortcode, since the character renders identically everywhere.
That second point is the practical takeaway. For anything automated, programmatic or cross platform, use the glyph. Our copy and paste tool gives you the raw character, and every emoji page on the site lists the shortcodes alongside it.
Most emoji have no shortcode at all
This is the part that surprises people who assume the colon syntax covers the keyboard. It does not come close.
Of the 1,757 emoji in our dataset, only 620 have a shortcode on any of the three platforms. The other 1,137 have none, which means roughly two thirds of the emoji you can type on a phone cannot be typed by name in Slack, Discord or GitHub at all.
The gaps are not random. Counting what is missing by category:
- Flags, 250 missing. Almost the entire set. Flags are built from paired regional indicator characters and the shortcode lists mostly skipped them.
- People and body, 267 missing. Largely the gendered and profession variants, which are joined sequences rather than single characters.
- Objects, 169 missing and travel and places, 153 missing, where the lists simply stopped being maintained as Unicode kept adding.
- Symbols, 124 missing, including a lot of the older monochrome characters.
Even some extremely common glyphs are absent. โบ๏ธ smiling face, โน frowning face and ๐ love letter have no shortcode in our data despite being decades old, because the early lists were assembled by hand and nobody went back.
The practical consequence is that the picker is not optional. For anything outside the core few hundred, you are copying the character. Our emoji meanings index and the flag emoji collection are the fastest routes to the ones the shortcode lists never covered.
Reactions behave differently from messages
Worth separating, because the rules are not the same.
When you react to a message rather than writing one, you are picking from a list the platform controls, so the mismatch problem disappears. The name you see in the reaction picker is that platform's name, and there is nothing to get wrong.
Where it does bite is automation again. A bot adding a reaction through an API has to pass the platform's own alias, and passing GitHub's name to Slack fails silently in a way that is genuinely hard to debug, because the message posts fine and only the reaction is missing.
Reactions also have a separate limitation that catches teams out: most platforms cap how many distinct reactions a single message can carry. Once that ceiling is hit, further reactions are dropped without warning. If a channel uses reactions for voting, that cap is the thing to design around. We covered more of these workplace conventions in emoji in business communication.
Custom emoji, which follow none of these rules
All three platforms let you upload your own images with your own names, and those live in a separate namespace.
Custom emoji are workspace or server specific. A message using one arrives as plain text for anyone outside that space, because the alias means nothing there. This catches people out when screenshots circulate, and it is why a custom reaction that is universal inside one company is invisible everywhere else.
Naming matters more than people expect. A custom emoji that collides with a built in shortcode will usually shadow it, so uploading something called fire can quietly replace ๐ฅ for an entire workspace. Our notes on setting these up sensibly are in the Slack and Discord emoji guide.
Typing them faster
A few habits save real time.
Type the colon and then two or three letters, then stop. All three platforms show a live suggestion list, and picking from it is faster and more reliable than typing the full code and hoping. It also sidesteps the entire mismatch problem, since you are choosing from the platform's own list.
Use the skin tone and variant forms from the picker rather than the code where you can. Shortcodes for toned variants are inconsistently supported and are one of the quieter sources of failed input. The tone system is explained in our skin tone guide.
For reactions specifically, most people are faster using the keyboard shortcut to open the reaction picker than typing anything at all. Slack and Discord both have one, and the picker remembers your recent choices.
Shortcodes outside the big three
The syntax shows up in more places than people realise.
- Notion, Linear and Trello all accept a colon based picker, though their lists are shorter and lean on the GitHub conventions.
- Static site generators such as Hugo and Jekyll support shortcodes in Markdown through plugins, which is how emoji end up in a lot of documentation sites.
- Matrix, Mattermost and Rocket.Chat largely copied the GitHub list, so GitHub codes are the best first guess in any smaller chat tool.
- Browser extensions and keyboards add the syntax to sites that never supported it, which is one route people use to get emoji into form fields. Our guide to online emoji keyboards covers the alternatives.
No standard body governs any of this. There is no committee, no specification, and no mechanism that would make the lists converge. The only thing that is standardised is the emoji character itself, which is the argument for using it directly whenever the destination is uncertain.
A quick reference you can keep
When something does not render, work through this in order:
- Try the short form first. Discord style codes are the shortest and most guessable.
- If that fails, add the category word back:
:thinking:becomes:thinking_face:. - If it still fails, try the full Unicode name with underscores, which is what Slack usually wants.
- For ๐ and ๐ in Slack, remember the plus and minus forms, which follow no pattern at all.
- When none of that works, paste the glyph. It is always correct.
Every emoji page on this site carries its Slack, Discord and GitHub codes together, so you can check a specific one rather than guessing. Start from the hand emoji collection for the gesture codes, which are the ones that differ most, or our typing guide for the non shortcode routes. Developers working with these in code will also want the coding emoji set and the per platform pages for Discord and the laughing faces that dominate most channels.
Frequently Asked Questions
Why does :thumbsup: not work in Slack?+
Slack uses <code>:+1:</code> for ๐ instead. The convention comes from code review, where people typed plus one to signal approval long before emoji were common at work. Discord and GitHub both accept <code>:thumbsup:</code>, which is why the difference catches people out.
How many emoji shortcodes differ between platforms?+
We compared 652 shortcodes across Slack, Discord and GitHub and found 95 where at least one platform disagrees, roughly one in seven. The other 557 are identical everywhere, including common ones like :fire:, :tada: and :sparkles:.
Are emoji shortcodes part of Unicode?+
No. Unicode defines the characters and their official names only. The colon syntax was created separately, popularised by GitHub around 2011 and copied by other platforms, which is why there is no authority making the lists agree.
Does the shortcode get sent with my message?+
No. The app replaces it with the actual emoji character as you type, so the sent message contains a normal glyph. Anyone reading it in a different client sees the emoji regardless of whether their platform knows that shortcode.
Why do custom emoji not work for other people?+
Custom emoji are uploaded per workspace or per server and exist only there. Outside that space the alias has no meaning, so the message shows the plain text name instead of an image. They also shadow built in codes if the names collide.
What should I use in automated messages?+
The emoji character itself rather than a shortcode. Bots that post the same template to several platforms hit the mismatch problem constantly, and the raw glyph renders identically everywhere without depending on each platform's alias list.
About BestEmojis Team
The Best Emojis team is dedicated to helping you find the perfect emojis for every occasion. We provide comprehensive guides, tips, and a vast collection of free emojis for all your communication needs.
