Slack + Microsoft Teams + Webex News

Messaging API Standards for Cross-platform Chat

Blog January 13, 2020
Cross Platform Messaging between Slack and Microsoft Teams is Harder than it Looks
Ed James


Messaging API Standards for Cross-platform Chat

Cross Platform Messaging between Slack and Microsoft Teams is Harder than it Looks

When you first hear about Mio and its messaging platform interoperability, it’s natural to think to yourself, this can’t be that hard of a problem to solve? 

Aren’t you just a middleman between two APIs?

Well, I am here to tell you that for a multitude of reasons, it is much harder than it looks.

The major reason I will be discussing today is a lack of standards.

Messaging Standards are a Thing of the Past

The days of common standards, like XMPP,  for interoperability between messaging platforms are long gone.

In the newest iteration of workplace communication tools, Slack and Microsoft Teams have emerged as the heavyweights.

While both have embraced extensibility, neither has done so in a way that embraces or accepts common cross-platform standards.

Honestly, why would they? 

They are battling each other for a land grab opportunity in a growing market with a winner-takes-all mentality. 

With that mindset driving product development, it’s unlikely either will conform to a common standard in the near future.

Mio to the Rescue

The void of commonality presents our engineering team with a series of challenges while stitching the two platforms together.

Examples of this include non-standard implementations of markdown all the way to “how do I make sure we properly handle translations of Slack custom emojis?”

Custom emoji Slack

Then there is my personal favorite: creating feature parity across platforms for multi-person messages.

To give you some more insight into what it is we do at Mio, I am going to take you through some examples of how we handle a simple cross platform emoji translation.

Emoji Translation from Slack to Microsoft Teams

On Slack, I send a message with an emoji.

Slack emoji

The raw message gets delivered to Mio.

The raw message gets delivered to Mio.

As you can see, Slack represents the thumbs-up emoji as “:+1:”.

Now I send the same message from Microsoft Teams.

Microsoft Teams thumbs up

And Mio receives the raw message.

Mio raw message

There are a couple of things to unpack here…

First, the raw message format is in an HTML format, and the emoji itself extracted from the broader HTML message is: 

Raw data in Mio

Second, the emoji image is a static custom Microsoft image.

You can’t see it in the still static version of the image, but on the Microsoft Teams client, their thumbs up is interactive.

They enable this functionality using HTML/CSS interactions with the span wrapper around the emoji image in the HTML.

One way to solve this would be to create a map linking “:+1:” to that hardcoded HTML block and recreate that for every emoji pairing on each platform.

However, Microsoft gives us a key clue toward a more universal solution in the alt tag.

The thumbs up emoji on Slack translated to Unicode is “U+1F44D”, which just so happens the exact Unicode that Microsoft gives us for alternative usage.

With this information, we can use these Unicode values as a two-way map that translates Slack shortcodes to HTML encoded symbols that can be used on Microsoft Teams and vice versa.


Luckily, for me and the brevity of this example, thumbs up is one of the Unicode universal emojis.

The problem becomes much harder to support when you introduce emojis without Unicode intermediary values, like Slack custom emojis.

At Mio, we’ve spent time carefully solving the edge cases and capturing and mapping the different idiosyncrasies each platform has in this non-standard world.

Before you spend considerable resources reinventing the wheel, make sure you take a look at our solution.

Request demo
Leave a comment

One Comment
  1. […] Our Senior Engineer, Ed James, ran through an example of exactly what is required to translate a message from one platform to another in this blog post. […]