Skip to main content
Pinning a conversation keeps it at the top of the logged-in user’s conversation list. The pin is private to that user — nobody else sees it — and it syncs to their other devices.
Pin Conversation requires the features.ux.conversations.pinned.enabled flag, which is not seeded in any plan and must be mapped per app. Until it is, every call rejects with ERR_FEATURE_NOT_ACCESSIBLE. Gate your UI on isPinConversationEnabled() before showing the control.
This is separate from an admin-global pin, which is managed from the CometChat Dashboard and shows for every user. Those cannot be created or removed from the SDK, only observed.

Pin a Conversation

A conversation is addressed by its peer — the other user’s UID for a one-on-one conversation, or the GUID for a group — together with the conversation type.
It resolves with the full updated Conversation, with pinnedAt and pinnedBy set. Pinning is idempotent.
A conversation that has never been messaged, or that is hidden, cannot be newly pinned — the call rejects with ERR_CONVERSATION_NOT_ACCESSIBLE. Pin from a conversation that already exists in the list.

Unpin a Conversation

Unpinning returns the conversation to its recency position. A user cannot unpin an admin-global pin — hide or disable the unpin control for conversations where getPinnedBy() is "app_system".

Fetch Pinned Conversations

The default conversation list is already pin-ordered by the server: admin-global pins first, then the user’s own pins, then everything else. Each row already carries pinnedAt and pinnedBy, so a pinned strip usually needs no separate call. When you do want the pinned set standalone, use setPinnedBy().
The match is exact and case-sensitive, and an unrecognised value is dropped silently rather than raising. setPinnedBy(["Me"]) leaves nothing behind, the pinnedBy parameter is omitted entirely, and you get the full conversation list back — not an error, and not a pinned-only list. Passing an empty array does the same thing. Use the lowercase tokens exactly as written above.
These are plain strings in the React Native SDK — there is no CometChat.PINNED_BY constant to import. The server rejects any other value with ERR_BAD_REQUEST — end users cannot query another user’s pins — so the builder drops unrecognised entries before the request is sent.

Check if a Conversation is Pinned

As with messages, the React Native SDK has no isPinned() helper — the presence of pinnedAt is the boolean.

Keeping the List in Sync

The React Native SDK does not expose a ConversationListener, and there are no onConversationPinned / onConversationUnpinned callbacks. Conversation pins made on another device do not arrive over the socket.
Update your list from the promise on the device that performed the action, and re-fetch the conversation list when the screen regains focus to pick up pins made elsewhere.

Pin Limit

Both resolve to null when the app settings carry no value. getSystemPinConversationLimit() is the separate admin/global cap, enforced independently — system pins do not consume a user’s allowance.
The conversation pin cap and the message pin cap are separate quotas with different values, and both are server-owned and tenant-overridable. Read each one at runtime rather than assuming a number or reusing the other.

Feature Availability

Unlike the two message-level flags, this one is not seeded anywhere and is off by default — treat a false as the normal case for a new app, not as an error.

Next Steps

Retrieve Conversations

Fetch and order the conversation list

Pin A Message

Highlight a message for everyone in a conversation

Save A Message

Bookmark a message privately, across conversations

Delete A Conversation

Remove a conversation from the list