What This Template Is For
Adding chat to a SaaS product sounds straightforward until you start specifying it. Channels or DMs? Threading or flat? Rich messages or text-only? File attachments, reactions, mentions, search, moderation, notifications, mobile sync. Each decision creates downstream complexity. Many teams ship a basic chat that users ignore because it does not fit how they actually communicate within the product.
This template helps you make every chat design decision before writing code. It covers information architecture (channels, threads, DMs), message types and rich content, moderation and safety, notifications, integrations, and mobile-specific considerations. Use it for in-app messaging, customer support chat, team communication, or community features. For the broader collaboration context, see the Real-Time Collaboration Feature Spec Template.
How to Use This Template
- Start with the Chat Architecture section. The channel/thread model is the foundation that every other decision builds on.
- Define message types early. Rich messages (images, embeds, structured cards) require different rendering, storage, and search than plain text.
- Plan moderation before launch, not after. It is far easier to build moderation tooling proactively than to retrofit it after an incident.
- Use the RICE Calculator to prioritize chat sub-features. Not every messaging capability needs to ship in V1.
- Review the filled example, then adapt sections to match your use case.
The Template
Chat Architecture
- ☐ Chat model: channels (group), DMs (1:1), or both?
- ☐ Channel types: public (visible to all workspace members), private (invite-only), or both?
- ☐ Channel creation: who can create channels? Naming conventions or templates?
- ☐ Threading model: in-line threads, side-panel threads, or flat (no threading)?
- ☐ Thread notifications: notify all channel members or only thread participants?
- ☐ Channel limits: maximum members per channel, maximum channels per workspace
- ☐ Archive and cleanup: can channels be archived? Auto-archive after inactivity?
Message Types and Rich Content
- ☐ Plain text with markdown formatting (bold, italic, code, lists)
- ☐ File attachments: supported types, max size, storage quota
- ☐ Image and video: inline preview, lightbox, playback
- ☐ Code blocks: syntax highlighting, language detection
- ☐ Structured messages: cards, forms, polls, action buttons
- ☐ Link previews: unfurl URLs with title, description, thumbnail
- ☐ Message editing: allowed? Time limit? Show "edited" indicator?
- ☐ Message deletion: soft delete (tombstone) or hard delete? Who can delete?
Mentions and References
- ☐ @user mentions: autocomplete, notification behavior
- ☐ @channel or @here: notify all members or only active members?
- ☐ @role or @team mentions: notify entire team
- ☐ Object references: link to tasks, documents, or other product entities inline
- ☐ Cross-channel references: can users reference messages in other channels?
Search and History
- ☐ Full-text search across messages, with filters (channel, user, date range, file type)
- ☐ Message history: how far back is searchable? Retention policy?
- ☐ Pinned messages: who can pin? Pin limits per channel?
- ☐ Bookmarked messages: personal bookmarks for individual users
- ☐ Export: can users or admins export chat history?
Reactions and Engagement
- ☐ Emoji reactions: standard set, custom emoji, reaction counts
- ☐ Read receipts: per-message, per-channel, or none?
- ☐ Typing indicators: show who is currently typing
- ☐ Mark as unread: allow users to flag a message for later
Notifications
- ☐ In-app: badge counts, unread markers, notification center
- ☐ Push notifications: which events trigger push? (DM, mention, all messages)
- ☐ Email fallback: send email if user has not read after X hours
- ☐ Mute options: mute channel, mute thread, mute for N hours
- ☐ Do Not Disturb: scheduled quiet hours, manual toggle
Moderation and Safety
- ☐ Content moderation: automated filtering, manual review, or both?
- ☐ Banned words or patterns: configurable by workspace admin
- ☐ Report mechanism: how do users flag inappropriate messages?
- ☐ Admin tools: delete messages, ban users, lock channels
- ☐ Rate limiting: prevent message flooding
- ☐ Data retention: auto-delete messages after configurable period
Integrations
- ☐ Bot/webhook support: can external services post messages?
- ☐ Slash commands: custom actions triggered by /command syntax
- ☐ App cards: structured messages from integrations (e.g., deploy status, CI results)
- ☐ API access: REST or WebSocket API for programmatic message sending/reading
Mobile Design
- ☐ Notification behavior on mobile vs. desktop (avoid double-notifications)
- ☐ Offline message queue: compose messages offline, send on reconnect
- ☐ Push notification grouping: collapse multiple messages into summary
- ☐ Image and file handling on mobile: compression, upload from camera roll
- ☐ Keyboard and input: quick reactions, swipe actions, voice messages
Performance and Scale
- ☐ Message delivery: WebSocket for real-time, fallback to polling
- ☐ Message storage: database model, pagination strategy for history
- ☐ Target: message delivery latency < 200ms P95
- ☐ Load testing: target concurrent active chatters per workspace
- ☐ CDN for media: images, files served from edge
Analytics and Success Metrics
- ☐ Daily active chatters / monthly active chatters
- ☐ Messages per user per day
- ☐ Thread reply rate (signals threading adoption)
- ☐ DM vs. channel ratio
- ☐ Search usage and success rate
- ☐ Notification opt-out rate (signals over-notification)
Filled Example: In-Product Team Chat
Chat Architecture
| Field | Details |
|---|---|
| Model | Channels + DMs |
| Channel types | Public and Private |
| Threading | Side-panel threads (Slack-style) |
| Channel limits | 500 members per channel, 200 channels per workspace |
| Archive | Channels auto-archive after 90 days of inactivity; admins can archive manually |
Message Types
The chat supports markdown text, file attachments (up to 25MB, all common types), inline image previews, code blocks with syntax highlighting, and link unfurling. Structured cards from integrations (CI/CD status, task updates) render inline with action buttons. Messages can be edited within 15 minutes of posting. An "(edited)" indicator appears next to the timestamp. Deleted messages show a tombstone: "This message was deleted."
Moderation
Workspace admins can configure a banned-words list. Messages containing flagged content are held for review and not shown to the channel until an admin approves or removes them. Users can report any message via a three-dot menu. Reports create a moderation queue item visible to admins. Rate limiting caps messages at 30 per minute per user.
Notifications
| Event | In-App | Push | Email (after 1hr unread) |
|---|---|---|---|
| DM received | Badge + toast | Yes | Yes |
| @mention in channel | Badge + toast | Yes | Yes |
| New message in channel | Badge only | No (unless unmuted) | No |
| Thread reply | Badge + toast | Only if participating | No |
Users can mute individual channels and set global DND hours. Mobile push notifications are suppressed while the user is active on desktop (5-minute activity window).
Success Metrics
| Metric | Baseline | Target (3 months) |
|---|---|---|
| DAU using chat | 0% (new feature) | 40% of workspace members |
| Messages per active user/day | 0 | 8 |
| Thread reply rate | 0% | 25% |
Tips for Specifying Chat Features
- Do not build Slack. Your chat exists to support collaboration within your product's context. Tie messages to product objects (tasks, documents, customers) so conversations happen where the work is, not in a disconnected sidebar.
- Threading is not optional for team chat. Flat chat in channels with 10+ active users becomes unreadable within a day. Ship threading in V1 or plan for user complaints about noise.
- Design notifications first, messaging second. Chat that interrupts users constantly gets muted. Chat with no notifications gets abandoned. The notification model determines whether anyone uses the feature. Review the notification feature template for detailed patterns.
- Plan for search from the start. Chat generates enormous volumes of content. If users cannot search effectively, valuable context gets lost. Index messages on write, not as a batch job.
- Spec moderation tools before public launch. One harassment incident with no moderation response erodes trust across the entire community. Build report, review, and action workflows before opening chat to users. The Technical PM Handbook has guidance on designing safety-critical systems.
Key Takeaways
- Choose your threading model (inline, side-panel, or flat) before designing anything else. It affects notifications, search, and mobile UX
- Tie chat to product objects so conversations happen in context, not in a disconnected messaging app
- Ship moderation tools and notification controls in V1. Both are prerequisites for a healthy chat experience
- Plan for search and history from the start. Chat generates high-volume content that users need to retrieve
- Measure thread reply rate and notification opt-out rate alongside basic usage metrics
About This Template
Created by: Tim Adair
Last Updated: 3/5/2026
Version: 1.0.0
License: Free for personal and commercial use
