Loading...
Help Center / Getting Started / Direct Messages App Overview

Direct Messages App Overview

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/new opens a Turbo offcanvas drawer with the recipient typeahead
  • Workspace context β€” pass context_workspace_id to tag a thread with its origin workspace
  • Single-recipient links β€” legacy user_id param 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

  1. Open Inbox from the rail
  2. Switch to the Messages folder
  3. Click + New Message, type a name or email, pick 1+ recipient(s), and send
  4. Click any thread row to open the chat side panel

For Managers

  1. Same flow as employees β€” DMs aren’t role-gated
  2. Use group threads (2–10 people) for quick team huddles outside a workspace

For Administrators

  1. Go to Admin β†’ General Settings β†’ Direct Messages
  2. Toggle Allow Direct Messages on or off
  3. 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 @email so 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=:id so 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.



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.

Ask AI Product Advisor

Hi! I'm the MangoApps Product Advisor. I can help you with:

  • Understanding our 40+ workplace apps
  • Finding the right solution for your needs
  • Answering questions about pricing and features
  • Pointing you to free tools you can try right now

What would you like to know?