Conversation Experience

Inside the conversation is where the magic happens. There are many opportunities for brands to delight users with well-thought-out details—but only after the basics are covered.

Sending Messages

Users all want messages delivered at the speed of light, but network conditions and other technical factors can make that challenging. A great in-app messaging experience will always make users feel like instant gratification is possible. The trick is not in the actual time to send a message from the device, but in the perceived speed from tapping the send button to showing an actual message in the conversation. It’s crucial to show this visual hint without waiting for the message to actually be sent from the device, as speed can be influenced by a lot of factors.

Sorting Conversations

When a user engages in more than one conversation, it is helpful to list all conversations in one view. Conversation lists are usually sorted by most recent activity, but in some use cases it might make sense to sort them differently — i.e. to keep conversations with unread messages, or new conversations (matches) without any messages in the conversation on top of the list. If you ‘star’ a channel or person on Slack, for example, you will see that conversation appear at the top.

Always render the message bubble in the conversation as soon as the user presses send.

Do not
Do not wait until the message has actually been successfully sent to display it in the conversation.

Receiving Messages

On the receiving end, a fast and performant messaging experience covers two different scenarios:

Foreground receive: The first scenario is when the user is in the application with the conversation open. We usually refer to this as a foreground state. In this scenario, typing indicators provide a sense of presence on the receiving end, and then seamlessly transition into a new message.

Background receive: The second scenario is when the app is in the background and the user receives a notification. We’ve all experienced in-app messaging where the user has to wait for several seconds before the message is actually displayed. This happens frequently with poor connectivity. It turns out there are ways to limit the number of such situations by delivering messages in the background, before the user even opens up the app. The difference in the quality of the experience is significant.

Make sure to load new messages in the background so that they are waiting for the user when they open the app.

Don’t wait until the user has opened the app or the conversation in question to fetch new messages.

Delivery & Read Receipts

Knowing that a message has been delivered and read builds user trust and confidence in the service. Specifically in time-sensitive applications and marketplaces, the difference between a message that has been read or just delivered can be of crucial importance. When one party is waiting on another to respond, this extra information helps keep everyone on the same page. There are some situations, like a dating app, where being thoughtful about what kind of receipt information users are able to see about each other. It may be that showing the read status of messages in an application like that may create undue pressure to respond or anxiety around someone’s lack of response.

As we’ll touch on later, being able to track the exact status of a message also enables either the service or the user to send a message through a fallback channel, like SMS or email, if a message is not delivered or read in time.

Typing & Activity Indicators

Making the recipient aware of the fact that the sender is typing adds a real-time component and keeps users engaged in the conversation. A typing indicator sets an expectation and builds anticipation because the recipient knows a message is about to arrive. Some applications like Snapchat even send push notifications when someone is typing. This makes users come back to the conversation view even before a message arrives. It hastens the perceived speed of delivery and eventual reply, closing the conversation loop even faster.

Where appropriate, display a dynamic indicator when one user is typing so that the other user knows to expect a message.

Avoid surprising the recipient with a message out of nowhere if they are present in the conversation.


Information about presence lets users know how quickly to expect a reply. When the other party is present in the conversation, users on average wait a bit longer to see if the typing indicator is going to appear. This translates into longer sessions with more engagement, and often results in a tighter loop of communication.

Present in Application

Green, yellow, red dot. We all know them from desktop IM applications that had ‘online’, ‘away’ and ‘offline’ states. A combination of delivery/read receipts and last seen presence made this construct less needed, but it can still provide value in cross-platform messaging applications or concierge commerce use cases, where the green dot can serve as an indicator to the user that the agent is actually there and ready to help. It should be noted that when this expectation is set, the response needs to follow promptly, otherwise a user might feel ignored.

This type of presence indicator is also useful in scenarios where the user eventually transitions from asynchronous messaing to a synchronous voice or video call.

Active or Last Seen

The ‘last seen’ information shows when a user has most recently opened the application. On mobile this is a much more valuable piece of information than if the user is ‘online,’ as was displayed in old-school desktop IM and chat applications. If a user enables push notifications for messaging on their device, they are always present in the sense that they can receive notifications and reply to them. In cross-platform applications, a combination of last seen and other types of presence indicators yields the best results.

Present in the Conversation

This is a new concept of presence that has been popularized by Snapchat. Users can easily tell if the other party in the conversation is currently looking at the same view. This enables interesting scenarios like fluid transitions between asynchronous and synchronous communication, but most importantly it sets an expectation that the other party will reply promptly, consequently expanding the engagement time with the conversation view in the application.

Indicate when in the channel at the same time.

Current status is displayed in the header.

Show when both parties are in the channel together.

Poor Connectivity, Offline and airplane mode

One of the most irritating experiences you can have as a user is when messages don’t send due to poor connectivity. Applications usually show an annoying pop-up and you have to re-send the message manually. Sometimes you’re not even sure if the message went through and end up sending a duplicate. This is a common scenario for commuters that travel with the underground, or people in areas with spotty data connectivity (? much of the US).

Always insulate the user from connection issues by having the message show up in the conversation immediately while the application retries behind the scenes.

Never require the user to tap to retry sending when there is a connection issue.

Offline History

Another common annoyance is not being able to access your message history while offline or in airplane mode. Users expect to have access to their most recent messages offline. Imagine using a service to find a place to stay, having the code to unlock the door in the conversation with your host, and then not being able to access that critical information when your device is offline. Not a great experience.