Messages
Private one-to-one and small-group mail that lands in the recipient's Notifications — asynchronous, like email, governed on their own track.
MangoApps
Overview
Messages is the async, on-the-record counterpart to MangoApps Chat: private one-to-one and small-group messages that behave like email rather than real-time chat, surfaced in the same Notifications inbox as every other notification, task, and approval — not a separate app to remember to check. Start a private thread with a teammate, manager, or a group of up to ten people directly from the user directory, the org chart, a profile, or a performance self-assessment.
Because it's governed separately from MangoApps Chat's real-time channels, an admin can turn Messages off, restrict who's allowed to start a thread, or set its own retention window without touching Chat at all. Voice notes are transcribed automatically, so a reply can be skimmed as text instead of played back.
Private one-to-one and small-group messaging governed on its own track — rich text, @mentions, attachments, and auto-transcribed voice notes delivered live into Notifications.
Highlights
Capabilities
Conversations & Threads
-
One-to-one messages Auto-deduped per pair — messaging someone you already have a thread with reopens it (ThreadService#find_or_create_one_on_one).
-
Small-group messages Up to 10 participants per thread (GROUP_PARTICIPANT_LIMIT); admin-toggleable via group_dms_enabled.
-
Archive a conversation Per-participant hide (participant.archived_at) — a new message from anyone resurfaces it for everyone; the thread is never destroyed.
Messaging & Content
-
Rich text with @mentions MentionParser resolves @[Name](mention:id) against thread participants; mentioned users get a platform_dm_mention notification.
-
File attachments Per-message Drive-backed attachments (Drives::OwnerAttachable); admin-toggleable via file_uploads_enabled.
-
Voice notes with transcription Record-and-send voice messages; audio + Whisper transcript stored on VoiceTranscript, rendered under the message body.
-
Emoji reactions Fixed 5-emoji reaction set (👍 ❤️ 😂 🎉 ✅) toggled per message (Platform::Reactable / InboxReactionsController#toggle).
-
Edit and delete your messages Author-only; delete is soft (deleted_at) so read/unread accounting and thread structure survive. Edits re-broadcast live.
-
Per-thread saved drafts Unsent text is saved per thread (inbox_drafts#save) and restored when you reopen the conversation.
Inbox, Delivery & Discovery
-
Live delivery via Action Cable Platform::DirectMessageChannel broadcasts message_created / _updated / _deleted to every participant in real time.
-
Per-participant read state last_read_at per participant drives accurate unread badges — independent of the Notification read flag.
-
Unified Inbox 'Messages' folder The end-user surface: the Inbox 'Messages' folder lists active threads for the signed-in user.
-
Search across threads Inbox search matches DM threads by participant name/email or message body (capped at 50 results).
-
New-message + mention notifications Offline in-app Notifications per message, throttled to one unread per thread per recipient; body text is never included (lock-screen safe).
-
Cross-platform entry points 'Message' button on the user directory, org chart, profile side panel, and an EPMS self-assessment — all gated by can_start_new_message?.
-
Mobile runtime Dedicated phone surface at /m/apps/messages (list, new, thread); desktop admins auto-redirect there on mobile.
Group Management
-
Rename a group conversation Group-only (ThreadService#rename, 120-char cap); 1:1 titles are always the other person's name and can't be renamed.
-
Add people to a group Strict business-scoped resolution; re-adding an existing member is a no-op; enforces the 10-participant cap (ThreadService#add_participants).
-
Leave a group Removes your own participant row; remaining members keep full history. 1:1 threads can't be left — archive instead.
-
Mute / unmute a conversation Per-participant muted_until; muted threads are excluded from the unread badge and skip new-message notifications.
Admin & Governance
-
Enable / disable messages org-wide The Messages app's enabled state is the master switch — turn off private messaging while keeping Chat channels (Teams 'No Private Chats' parity).
-
Restrict who can start a message Everyone, managers and above, app admins only, or named groups — enforced in ThreadService#can_initiate? and mirrored in the entry-point buttons.
-
Toggle group messages group_dms_enabled gates 3+-participant threads; 1:1 messaging stays available when off.
-
Toggle attachments & voice notes file_uploads_enabled gates files/voice notes; the composer hides the controls and the service fails loudly on stale posts.
-
Retention window retention_days soft-deletes messages older than N days via the daily Messages::RetentionPurgeJob, and the nightly platform purge destroys them permanently 30 days after that (0 = keep forever). Governed separately from channels.
-
Usage analytics dashboard The Messages app home is an admin surface: message volume, conversation counts, active-30d threads, senders, reactions, and a 30-day trend chart.
-
Hard purge for compliance Two automatic stages: the daily job soft-deletes messages past the retention window (their author can restore one from Trash for 30 days), then the nightly platform purge destroys the row and its voice notes for good — effective lifetime is retention_days + 30. Files a message carried stay in Drive under Drive's own retention; on-demand purge and legal hold are post-v1.
Limits & Specs
-
Conversation types: One-to-one and small-group
-
Group size cap: 10 participants per thread
-
Real-time transport: Action Cable (Platform::DirectMessageChannel)
-
Message storage: PostgreSQL (platform_direct_message* tables, tenant-isolated)
-
Reaction set: Fixed 5 emoji (👍 ❤️ 😂 🎉 ✅)
-
Default retention: Forever; per-tenant retention window configurable
-
Surfaces: End users: unified Inbox → Messages folder + /m/apps/messages. Admins: the Messages app dashboard.
-
Pricing: Included with MangoApps Workforce
Use cases
Resources
FAQ
Messages owns private one-to-one and small-group conversations that land in your unified Inbox. The Chat app owns real-time channels and group rooms. Splitting them lets an admin govern private messaging independently of public channels — disable messages while keeping channels, or vice-versa.
Yes. Disabling Messages turns off private messaging everywhere without affecting channels. Admins can also restrict who may start a thread, disable group threads or attachments, and set a retention window.
No. Messages is included with MangoApps Workforce as a platform-included capability — it is not metered and not sold as a standalone line.