diff --git a/lib/shared/markdown.js b/lib/shared/markdown.js
--- a/lib/shared/markdown.js
+++ b/lib/shared/markdown.js
@@ -232,6 +232,26 @@
   return match;
 }
 
+type ParsedUserMention = {
+  +content: string,
+  +userID: string,
+};
+
+function parseUserMentions(
+  membersMap: $ReadOnlyMap<string, string>,
+  capture: Capture,
+): ParsedUserMention {
+  const memberUsername = capture[2];
+  const memberID = membersMap.get(memberUsername.toLowerCase());
+
+  invariant(memberID, 'memberID should be set');
+
+  return {
+    content: capture[0],
+    userID: memberID,
+  };
+}
+
 function parseChatMention(
   chatMentionCandidates: ChatMentionCandidates,
   capture: Capture,
@@ -348,6 +368,7 @@
   parseList,
   createMemberMapForUserMentions,
   matchUserMentions,
+  parseUserMentions,
   stripSpoilersFromNotifications,
   stripSpoilersFromMarkdownAST,
   parseChatMention,
diff --git a/native/markdown/rules.react.js b/native/markdown/rules.react.js
--- a/native/markdown/rules.react.js
+++ b/native/markdown/rules.react.js
@@ -387,9 +387,8 @@
       userMention: {
         ...SimpleMarkdown.defaultRules.strong,
         match: SharedMarkdown.matchUserMentions(membersMap),
-        parse: (capture: SharedMarkdown.Capture) => ({
-          content: capture[0],
-        }),
+        parse: (capture: SharedMarkdown.Capture) =>
+          SharedMarkdown.parseUserMentions(membersMap, capture),
         // eslint-disable-next-line react/display-name
         react: (
           node: SharedMarkdown.SingleASTNode,