Issue
Rank tags, display-name colors, or prefixes appear for some messages but disappear for others.
Cause
Message decoration must be returned through TextChatService callbacks, and replacing properties incorrectly can discard existing metadata.
Fix
Use OnIncomingMessage to return TextChatMessageProperties. Preserve the original prefix and append escaped formatting instead of rebuilding every field blindly. Keep permission and rank lookup cached so every message does not trigger a web or DataStore request.
Verify
Check public, team, whisper, and system channels with ranked and unranked accounts.
Official Roblox chat migration update
#1
Original Heliotrope guidance with authoritative Roblox sources.