Direct Messages App Overview
Send 1:1 and small-group direct messages (Pings) to anyone in your organization, right from the unified Inboxβwith real-time delivery, mentions, attachments, and full admin control.
What is the Direct Messages App?
Direct Messages is the platform-wide private messaging layer of MangoApps Workforce. Conversations live inside the unified Inbox alongside notifications and broadcasts, so users have a single place for everything that needs their attention. Threads are tenant-isolated, real-time, and can be turned on or off organization-wide by administrators.
Core Value Proposition:
- π¬ One Surface β Direct messages live inside the same Inbox as notifications, broadcasts, and action requests
- β‘ Real-Time β ActionCable delivery pushes new, edited, and deleted messages to every participant instantly
- π₯ 1:1 or Small Group β Pairwise threads or group threads up to 10 participants
- π‘οΈ Admin Controlled β A single toggle enables or disables Direct Messages org-wide
How It Works
Conversation Flow
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DIRECT MESSAGE FLOW β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β PICK 1+ ββββΆ β THREAD ββββΆ β MESSAGES β β
β β RECIPIENTS β β CREATED β β POSTED β β
β β (typeahead) β β (1:1 idemp. β β (body + β β
β β β β or group) β β attachments)β β
β ββββββββββββββββ ββββββββββββββββ ββββββββ¬ββββββββ β
β β β
β βββββββββββββββββββββββββΌββββββββββββββ β
β βΌ βΌ βΌ β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββ
β β ACTIONCABLE β β MENTION β β INBOX ββ
β β BROADCAST β β NOTIFICATIONβ β UNREAD ββ
β β (every part. β β (platform_ β β BADGES ββ
β β user stream)β β dm_mention) β β ββ
β ββββββββββββββββ ββββββββββββββββ ββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Where Conversations Live
βββββββββββββββββββββββ
β UNIFIED INBOX β
β /inbox β
ββββββββββββ¬βββββββββββ
β
ββββββββββββββββββββββββββΌβββββββββββββββββββββββββ
βΌ βΌ βΌ
ββββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββ
β Notifications β β MESSAGES β β Broadcasts β
β & Actions β β (Pings) β β & Digests β
ββββββββββββββββββ βββββββββ¬βββββββββ ββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β Side Panel (offcanvas)β
β β’ Thread header β
β β’ Scrollable messages β
β β’ Compose at bottom β
ββββββββββββββββββββββββββ
Key Features
π¬ 1:1 and Group Threads
| Feature | Description |
|---|---|
| One-on-one threads | find_or_create_one_on_one is idempotent β opening a DM with the same person reuses the existing thread |
| Group threads | Start a group with 2+ recipients; capped at 10 participants per thread |
| Multi-recipient picker | Typeahead search of users in the current business; pick one for 1:1, two or more for a group |
| Thread context | Threads can be tagged with origin (e.g. workspace_id) via the context JSONB field |
| Thread title | Group threads can carry an optional title; otherwise display name is derived from participants |
Use Case: From a workspace member popover, click βSend a Ping.β A drawer opens with the recipient pre-filled. Send the message β the existing 1:1 thread is reused if you already have one with that person.
β‘ Real-Time Delivery
| Capability | Description |
|---|---|
| ActionCable channel | Platform::DirectMessageChannel streams to user_#{id} for every participant |
| Live message events | message_created, message_updated, message_deleted events broadcast to all participants |
| No refresh needed | New messages appear in open threads without reloading the page |
π Rich Messaging
| Feature | Description |
|---|---|
| Attachments | Active Storage has_many_attached :attachments on every message |
| Mentions | @email@domain.com mentions parsed from body and tracked in mentioned_user_ids |
| Mention notifications | Mentioned users receive a platform_dm_mention notification with a 160-char preview |
| Edit your own | Authors can edit their own messages; edited_at timestamp records the change |
| Soft delete | Authors can delete their own messages; tombstone preserved for audit |
Use Case: Drop a screenshot into a Ping with @manager@acme.com, post it, and your manager gets a notification in their Inbox plus a real-time push to any open thread view.
π₯ Unified Inbox Integration
Direct Messages render inside the unified Inbox β there is no separate βmessagesβ page anymore.
| Behavior | Description |
|---|---|
| Messages folder | /inbox?folder=messages lists all your DM threads, sorted by last activity |
| Side panel chat | Clicking a thread row opens a sticky-bottom chat layout in an offcanvas side panel |
| Auto-open | Linking to /inbox?folder=messages&thread=:id opens that thread directly |
| Unread pills | Per-thread unread counts and a global unread badge |
| Read receipts | Opening a thread calls mark_thread_read, updating last_read_at for the participant |
| Date dividers | βTodayβ / βYesterdayβ / formatted date markers between message groups |
| Search | Inbox search matches DM threads by participant name/email or message body |
π― Multiple Entry Points
Direct Messages can be started from anywhere in the product:
- New Message button β top of the Inbox messages folder
- Drawer flow β
/messaging/newopens a Turbo offcanvas drawer with the recipient typeahead - Workspace context β pass
context_workspace_idto tag a thread with its origin workspace - Single-recipient links β legacy
user_idparam supported for βSend a Pingβ buttons on profile / mention popovers
π‘οΈ Admin Controls
| Setting | Description |
|---|---|
| Org-wide toggle | direct_messages_enabled boolean on the businesses table β defaults to enabled |
| Read-only mode | When disabled, existing thread history stays visible to participants but compose forms are turned off |
| Hard enforcement | MessagingController and InboxController#post_thread_message block new threads and replies when disabled |
| Settings page | /admin/general_settings/direct_messages β single switch with status banner |
Use Case: During a quiet period or compliance review, an admin disables Direct Messages. Users see a lock icon and βDirect Messages are disabled for your organizationβ instead of the compose box; existing conversations remain viewable.
π Security & Tenancy
| Layer | Enforcement |
|---|---|
| Business scoping | All three models (DirectMessageThread, DirectMessage, DirectMessageParticipant) include BusinessTenantScoped |
| Recipient validation | create filters recipients to current_business.users only β cross-tenant DMs are impossible |
| Participant gate | MessageService#post rejects with βnot a participantβ if the actor isnβt in the thread |
| Author-only edit/delete | Edit and delete checks return βnot your messageβ for any other user |
| Soft delete + audit | Deleted messages keep deleted_at and deleted_by_id for compliance |
π€ AI-Ready Storage
Each message stores a content_embedding (vector(1536)) column with an IVFFlat cosine-similarity index, so messages are indexed for future semantic search and AI retrieval features.
User Roles & Permissions
| Role | Capabilities |
|---|---|
| Employee | Start 1:1 or group threads with anyone in the business; post / edit / delete own messages; mark threads read |
| Manager | Same as Employee β DMs are not gated by role |
| HR / Admin | Same as Employee for messaging, plus access to the org-wide enable/disable toggle |
| System Admin | Full configuration via /admin/general_settings/direct_messages |
How We Compare
See how MangoApps Workforce Direct Messages stacks up against standalone messaging tools:
| Feature | MangoApps Workforce | Slack | MS Teams Chat | Workplace Chat |
|---|---|---|---|---|
| 1:1 + small-group threads | β | β | β | β |
| Real-time delivery | β | β | β | β |
| Mentions + notifications | β | β | β | β |
| Attachments | β | β | β | β |
| Unified inbox (DMs + notifications + broadcasts) | β | β | β‘ | β |
| Org-wide on/off toggle | β | β | β‘ | β |
| Built-in to HR / Workforce platform | β | β | β | β |
| Per-message vector embeddings | β | β | β | β |
| Legend: β Included | β Not Available | β‘ Limited / Admin-only |
Why MangoApps Workforce?
- π One Inbox β DMs sit alongside notifications, broadcasts, and action requests β not in a separate app
- π‘οΈ Tenant-Isolated by Design β Recipients are filtered to your business; cross-tenant DMs arenβt possible
- ποΈ Single Switch Control β One admin toggle turns messaging on or off org-wide
Getting Started
For Employees
- Open Inbox from the rail
- Switch to the Messages folder
- Click + New Message, type a name or email, pick 1+ recipient(s), and send
- Click any thread row to open the chat side panel
For Managers
- Same flow as employees β DMs arenβt role-gated
- Use group threads (2β10 people) for quick team huddles outside a workspace
For Administrators
- Go to Admin β General Settings β Direct Messages
- Toggle Allow Direct Messages on or off
- Confirm the status banner reflects the new state
Best Practices
- β Use DMs for short, person-to-person threads β use Workspaces for longer-running team work
- β
Mention people by
@emailso they get an Inbox notification, not just a real-time push - β Keep groups under the 10-participant cap β for larger groups, use a Workspace
- β
When linking to a conversation, use
/inbox?folder=messages&thread=:idso the side panel auto-opens - β Admins: leave the toggle on by default unless compliance review or a quiet period requires otherwise
Frequently Asked Questions
Q: How many people can I add to a group message?
A: Up to 10 participants per group thread, including yourself. The cap is enforced by the model and the thread service.
Q: What happens to my existing conversations if an admin disables Direct Messages?
A: Existing thread history stays visible to participants, but the compose form is replaced with a βDirect Messages are disabled for your organizationβ notice. New threads canβt be started and replies are blocked until itβs turned back on.
Q: Can I message someone in another business?
A: No. The recipient picker is scoped to current_business.users, and the create action filters out any IDs that donβt belong to your business.
Q: Can I edit or delete a message after sending?
A: Yes β but only your own messages. Edits record an edited_at timestamp; deletes are soft (the row is kept with deleted_at / deleted_by_id for audit).
Q: How do I know if I have unread messages?
A: The Inbox shows per-thread unread pills and a global unread badge. Opening a thread automatically marks it read.
Related Resources
- Apps Overview β All apps and extensions in MangoApps Workforce
- Workspace App Overview β For longer-running team conversations
- Ask AI Overview β Conversational AI assistant inside MangoApps Workforce
Direct Messages keep one-to-one and small-group conversations in the same Inbox as everything else that needs your attention β fast, private, and under admin control.