Overview
Pusher-powered real-time chat with one-to-one DMs, group rooms, @mentions feeding the existing Notification system, per-room presence, and PostgreSQL full-text search. Built on the same business-scoping and authentication patterns as the rest of the platform — every message is searchable, auditable, and tenant-isolated.
Highlights
Capabilities
Conversations
-
One-to-one direct messages
-
Group rooms with role-based admin/member
-
Public business channels Phase 2
-
Threaded replies Phase 3
-
Message edit and delete
Real-time Delivery
-
Sub-second message fan-out via Pusher Channels
-
Per-room presence (Pusher presence channels) Phase 2
-
Typing indicators Phase 3
-
Global online status (cache-based heartbeat) Phase 3
Notifications & Discovery
-
Unread message counts per room Phase 2
-
Read receipts Phase 2
-
@mention notifications via Notification Phase 2
-
PostgreSQL full-text search Phase 2
-
Semantic search via pgvector Phase 3
Files & Reactions
-
File attachments via Active Storage Phase 3
-
Emoji reactions on messages Phase 3
Admin Controls
-
Toggle direct messages globally
-
Toggle group chats globally
-
Configurable retention policy
-
Configurable max attachment size
-
Per-business feature flags
Limits & Specs
-
Real-time transport: Pusher Channels (Premium / Growth tier)
-
Message storage: PostgreSQL (single non-partitioned table — partitioned at ~100M rows)
-
Default retention: Forever (admin-configurable in days)
-
Default max attachment size: 25 MB (admin-configurable)
-
Mobile support: iOS & Android via the same Pusher endpoint
-
Pricing: Included with MangoApps Workforce
Use cases
FAQ
Pusher Channels handles fan-out. The browser subscribes to a per-room private channel; Rails authorizes the subscription against business and room membership before signing the auth response.
Messages still persist to PostgreSQL via the standard HTTP request/response. Real-time delivery resumes when Pusher recovers; a refresh shows the missed messages.
Yes. Pusher's Premium and Growth tiers handle 10k+ concurrent connections per cluster. The Rails layer only handles auth at subscription time, not the WebSocket itself, so it scales independently.
Three layers: channel-name regex, business membership check, and room membership check — all run inside the Pusher auth endpoint before signing. Pusher itself never touches business data.