Messages
Private one-to-one and small-group messages that land in the recipient's Inbox — asynchronous, like email, governed on their own track.
MangoApps
Overview
Messages brings private one-to-one and small-group correspondence to MangoApps Workforce as a first-class, separately-governed surface — the asynchronous, inbox-resident channel that complements real-time Chat. Users message a teammate, manager, or small group from anywhere in the platform: the Inbox's Messages folder, the user directory, the org chart, or a performance review. Threads carry rich text, @mentions, file attachments, and voice notes; deliver live over Action Cable; and track read state per participant. Because messages are governed on their own track, admins decide whether private messaging is allowed at all, who can start a conversation, and how long history is retained — independently of channels and announcements. That separation matches how Microsoft Teams and Slack treat private messaging for compliance, and gives regulated and frontline organizations the control to disable ungoverned back-channels or retain message history for eDiscovery without touching the rest of their communications.
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 who_can_initiate = all | admins_managers — 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 daily Messages::RetentionPurgeJob (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.
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 (the Platform::DirectMessage primitive) that land in your unified Inbox and hang off the user directory, org chart, profile cards, and performance reviews. 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.
In the unified Inbox under the 'Messages' folder, which lists your active threads with search across participants and message bodies. You can start a new message from the user directory, the org chart, a profile side panel, or an EPMS self-assessment, and there's a dedicated phone surface at /m/apps/messages. The Messages app tile itself opens an admin-only governance and analytics dashboard, not a mailbox.
Rich text with @mentions, Drive-backed file attachments, and voice notes (recorded and auto-transcribed via Whisper). You can react with a fixed set of five emoji (👍 ❤️ 😂 🎉 ✅), edit or delete your own messages, and everything delivers live over Action Cable with per-participant read state.
Yes — a thread can hold up to 10 participants (GROUP_PARTICIPANT_LIMIT). You can name a group, add or remove people, and leave a group you no longer need; remaining members keep the full history. Re-adding an existing member is a no-op, and every add is business-scoped so a stale or foreign user can't be pulled in. Admins can disable group threads org-wide (group_dms_enabled) while keeping one-to-one messaging on.
Both. Muting a thread (per-participant muted_until) drops it from your unread badge and stops new-message notifications without leaving the conversation. Archiving hides it from your list, but it's a per-participant hide only — the thread is never destroyed, and it resurfaces for you the next time anyone posts. One-to-one threads can't be left, so archive is the 'hide this' affordance there; group threads can be left outright.
Yes. Unsent text is saved per thread and restored when you reopen that conversation, so switching between conversations doesn't lose what you were writing. Drafts are per-thread and local to your account.
Yes. Disabling the Messages app turns off private messaging everywhere — the Inbox folder hides, the 'Message' buttons disappear, and the composer is blocked — without affecting channels. Admins can also restrict who may start a thread (anyone vs. managers and admins only), disable group threads or attachments, and set a retention window. This mirrors Microsoft Teams' 'No Private Chats' policy.
A daily job soft-deletes messages older than the configured number of days (0 = keep forever) — they drop out of every view and unread count while attachments and thread structure stay intact, so the action is reversible. True hard-purge (row + attachment deletion) for strict eDiscovery, plus information-barrier controls, are on the roadmap.
The Messages app tile is an admin surface, not a mailbox — non-admins who open it are sent to their Inbox instead. It reports tenant-scoped usage: total message volume, messages in the last 30 days, conversation and active-thread counts, distinct senders, total reactions, and a 30-day daily-volume trend chart. It's oversight over aggregate activity, not the content of anyone's private threads.
No. Messages is included with MangoApps Workforce as a platform-included capability — it is not metered and not sold as a standalone line.