Kyle Seyler
October 17, 2025

Table of contents
In This Article
What is a Notification Center?
The Build vs. Buy Decision for Notification Infrastructure
Implementing a React Notification Center with Courier
React Native Mobile Notification Center
Multi-Channel Notification Routing
Advanced Features for Production
Implementation Best Practices
Courier vs. Building Custom or Other Solutions
Getting Started with Courier
FAQ: React Notification Center
Conclusion: Build Production-Ready Notification Centers in Days, Not Months
Modern users expect real-time updates across every channel—but building a notification center from scratch can consume 3-6 months of development time. Between managing state across push, email, SMS, in-app, and toast notifications, implementing WebSocket infrastructure, and coordinating multi-channel delivery, notification systems quickly become one of the most complex features in your application.
This guide shows you how to implement a production-ready notification center with multi-channel support in days, not months. Using React, React Native, iOS, Android, Flutter, or vanilla JavaScript, you'll learn how to build everything from basic in-app notification feeds to advanced features like cross-channel synchronization, user preferences, and mobile push notifications across all platforms.
Developers are actively researching notification solutions, with over 6,700 monthly searches for terms like "how to build a notification center?" The question isn't whether to build a notification center—it's how to build one efficiently.
A notification center is a centralized hub within an application where users can view, manage, and interact with all their notifications. This pattern has become ubiquitous across modern applications—think of the notification bells you see on Facebook, LinkedIn, GitHub, and Slack.
Every effective notification center includes these core components:
In-app notification feed/inbox: A persistent list of notifications that users can scroll through, search, and manage. This is typically the centerpiece of your notification system, providing a historical record of all communications.
Real-time updates: Notifications appear instantly as events occur, typically powered by WebSocket or Server-Sent Events (SSE) connections. Users expect to see new notifications without refreshing the page.
Toast/banner notifications: Transient, non-intrusive messages that appear briefly to alert users of new events. These complement the persistent inbox by providing immediate awareness without disrupting workflow.
Badge counters: Visual indicators showing the count of unread notifications, creating urgency and drawing attention to new content. The badge counter synchronizes across all instances of your application.
Read/unread state management: Tracking which notifications have been viewed, with the ability to mark messages as read or unread. This state persists across sessions and devices.
User expectations have fundamentally shifted. A decade ago, email was sufficient for most notifications. Today, users expect:
Without a robust notification center, you risk user churn. Research by Dot Com Infoway found that 71% of users will uninstall an app due to annoying or excessive notifications. Additionally, CleverTap's survey revealed that 28% of users cite too many notifications as their primary reason for uninstalling apps. On the positive side, approximately 70% of users report that well-managed notifications keep them engaged with apps, while sending notifications 2-5 times weekly results in the highest engagement rates.
The challenge is striking the right balance. Users need timely, relevant information—but remember, your app isn't the only one competing for their attention. Every application on their device is sending notifications, creating a constant stream of interruptions. This is precisely why a well-designed notification center is essential: it provides a persistent, organized space where users can review updates on their own terms, reducing the pressure to interrupt them with every alert. By combining selective real-time notifications with a comprehensive in-app inbox, you give users control over their experience while ensuring important information is never lost in the noise.
When building a notification system, development teams face a critical decision: invest months building custom infrastructure, or leverage an existing platform. Let's examine both approaches.
The custom approach requires building and maintaining multiple interconnected systems:
Custom React components: Design and implement UI components for the notification inbox, toast messages, badge counters, and preference panels. This includes responsive layouts for desktop and mobile web.
WebSocket or SSE infrastructure: Set up real-time communication between your backend and frontend. This requires managing connection states, handling reconnections, implementing heartbeats, and scaling WebSocket servers.
State management architecture: Implement Redux, Zustand, or another state management solution to handle notification data, read/unread status, loading states, and optimistic updates across your application.
Backend API for notification CRUD: Build REST or GraphQL endpoints to create, read, update, and delete notifications. Include filtering, pagination, search, and bulk operations.
Push notification service integration: Integrate with Firebase Cloud Messaging (FCM) for Android, Apple Push Notification Service (APNS) for iOS, and web push services. Each requires separate implementation and testing.
Email and SMS provider integration: Connect with services like SendGrid, Twilio, or AWS SES. Implement template management, delivery tracking, and bounce handling.
Cross-channel synchronization: Build logic to track user engagement across channels and synchronize state. For example, if a user opens an email, the in-app notification should mark as read.
Delivery tracking and analytics: Implement systems to track delivery, opens, clicks, and conversions across all channels.
User preference management: Build UI and backend systems for users to control which notifications they receive on which channels.
Development timeline: Based on feedback from engineering teams, a production-ready custom notification system typically requires 3-6 months with a team of 2-3 engineers, plus ongoing maintenance and provider costs for message delivery.

Courier provides a complete notification infrastructure platform designed specifically for product teams:
Pre-built UI components: Drop-in React components for notification inboxes, toast messages, and preference centers. Fully customizable to match your brand.
Unified notification API: With Courier, a single API call sends notifications across all channels—in-app, email, SMS, push, Slack, and more. No need to manage multiple provider integrations.
Built-in state management: Courier automatically manages notification state, read/unread tracking, and cross-channel synchronization. Your React components stay in sync without additional code.
Multi-channel routing: Intelligent routing sends notifications to users' preferred channels based on urgency, user preferences, and delivery rules.
Real-time infrastructure: Managed WebSocket infrastructure delivers notifications instantly without you managing servers or connections.
Analytics and tracking: Built-in delivery tracking, engagement metrics, and analytics across all channels.
Implementation time: Most teams ship their first notification in under an hour, with production implementations complete in days.
Let's build a production-ready notification center step by step. We'll start with the core inbox component, add real-time toast notifications, and then explore customization options.
Install the Courier React SDK via npm or yarn with a single command—the package supports React 18+ out of the box, with a dedicated package available for React 17 projects (@trycourier/react-inbox-17).
The simplest implementation requires just a few lines of code. Here's a basic notification center that mirrors the pattern you see on Facebook and LinkedIn:
Copied!
import { useEffect } from 'react';import { CourierInbox, useCourier } from '@trycourier/react-inbox';export default function App() {const courier = useCourier();useEffect(() => {// Generate a JWT for your user (do this on your backend server)const jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';// Authenticate the user with the inboxcourier.shared.signIn({userId: 'user-123',jwt: jwt,});}, [courier]);return <CourierInbox />;}
That's it. This code gives you:
The CourierInbox component handles all the complexity: WebSocket connections, reconnection logic, state management, and UI rendering.
For navigation bars and headers, use the CourierInboxPopupMenu component which provides a bell icon with badge counter that opens a dropdown feed—following the same pattern you see in GitHub and Slack. The popup menu integrates seamlessly into existing navigation components and automatically manages state, positioning, and responsive behavior. View popup menu examples in the Courier Web repository.
Courier components are fully themeable with simple configuration objects. Customize colors, fonts, spacing, and borders to match your brand's design system. For deeper customization, you can override entire sections like headers, footers, or individual list items while keeping all built-in functionality like real-time updates and state management. The theming system supports light/dark modes, responsive breakpoints, and custom CSS classes.
View customization examples in the repository, or read the full theming documentation for complete API reference.

Toast notifications provide immediate, non-intrusive alerts for time-sensitive events. They're perfect for confirming user actions, alerting users to new messages, or showing real-time updates.
Courier Toast integrates seamlessly—simply wrap your app in CourierProvider and add the <Toast> component. Toasts and inbox automatically synchronize, giving users immediate awareness plus persistent history. Configure position (top-right, bottom-left, etc.), auto-dismiss timing, and theming to match your application. When a new notification arrives, it appears as both a temporary toast and a permanent inbox entry, with automatic badge counter updates.
One of Courier's most powerful features is automatic cross-channel state synchronization. Here's how it works:
When you send a notification to multiple channels (in-app, email, push), Courier tracks user engagement across all channels and synchronizes state automatically.
Example scenario:
inbox and email channelsThis synchronization happens without any code on your part. Courier tracks events across channels and updates state in real-time using the same WebSocket connection powering your inbox.
You can customize sync behavior per integration. For example, you might want email opens to mark inbox messages as read, but not vice versa. Configure this in the Courier Integration Manager.
The useCourier hook provides programmatic access to fetch messages, manage read/unread states, track interactions, and handle preferences—giving you full control for custom implementations. You can fetch messages with filtering and pagination, mark messages as read or unread, archive or delete messages, track user interactions, and manage notification preferences. This is useful for building custom UI, implementing analytics, or integrating notification data into your existing application logic. See the SDK reference for complete API documentation.
Mobile applications require notification centers just as much as web applications. Courier's React Native SDK provides the same drop-in experience for iOS and Android:
Copied!
import { CourierProvider, Inbox } from '@trycourier/react-native-inbox';function App() {return (<CourierProviderclientKey={process.env.COURIER_CLIENT_KEY}userId="user-123"><Inbox /></CourierProvider>);}
This gives you a fully native notification center for both iOS and Android with native UI components following platform design guidelines, real-time delivery over WebSocket, offline support with local caching, cross-platform state synchronization, and deep linking from notifications.
React Native push notifications require platform-specific configuration for Firebase Cloud Messaging (Android) and Apple Push Notification Service (iOS). Courier handles device token registration, token refresh, deep link routing, badge synchronization, and notification action buttons automatically. Simply register tokens and handle tap events—Courier manages the complexity of FCM and APNS. See the React Native implementation guide for complete setup instructions.
Courier provides native SDKs for multiple platforms beyond React Native:
All SDKs share the same API design and synchronize state through Courier's backend. A notification sent to a user appears simultaneously across web, iOS, and Android with consistent state.
Mobile notification centers have unique requirements that Courier handles automatically:
Offline queueing: When users lose connectivity, Courier queues notifications locally and synchronizes when connection restores.
Background sync: Notifications synchronize in the background, so the inbox is up-to-date when users open your app.
Native gestures: Swipe-to-dismiss, pull-to-refresh, and other platform-specific gestures work out of the box.
Adaptive layouts: Courier's mobile components adapt to different screen sizes, orientations, and accessibility settings.
The real power of a modern notification system isn't just the in-app notification center—it's coordinating notifications across all channels where your users exist.
Courier's unified API lets you send to multiple channels with a single request:
Copied!
import { CourierClient } from '@trycourier/courier';const courier = CourierClient({ authorizationToken: process.env.COURIER_AUTH_TOKEN });// Send to all channelsawait courier.send({message: {to: {user_id: 'user-123',},content: {title: 'New comment on your post',body: 'Sarah replied: "Great insight! I have a follow-up question..."',},routing: {method: 'all',channels: ['inbox', 'push', 'email', 'sms'],},},});
This single API call:
Different notifications warrant different delivery strategies. Courier supports sophisticated routing logic like fallback delivery (try inbox first, then email), urgency-based routing (push for critical alerts, inbox for standard updates), and preference-based selection. You can configure channel-specific overrides for priority, sound, badges, and other platform-specific settings. Courier evaluates routing rules at send time based on user preferences, channel availability, and your configuration.
Courier supports every major notification channel:
In-App Notifications (Inbox): Real-time feed updates that persist in the notification center. Perfect for activity feeds, updates, and any content users may want to reference later.
Web Push Notifications: Browser notifications that reach users even when they're not on your site. Requires user permission.
Mobile Push Notifications: Native iOS and Android push notifications delivered through APNS and FCM. Mobile push has higher engagement than web push, with 7% average click-through rate.
Email Notifications: The most universal channel, supporting rich content, attachments, and complex layouts. Email works for users who prefer less frequent, batched updates.
SMS Notifications: Time-sensitive alerts delivered via text message. SMS has a 98% open rate, making it ideal for urgent notifications like security alerts or delivery updates.
Slack Notifications: Team-based notifications delivered to Slack channels or direct messages. Perfect for collaborative workflows and team updates.
WhatsApp: Direct messages to users on WhatsApp, a critical channel for international audiences.
Microsoft Teams: Enterprise team notifications, useful for business applications.

Courier can automatically route notifications based on user preferences, urgency, and channel performance. Configure time-based fallbacks where notifications escalate to more urgent channels if not acknowledged—for example, trying email first, then SMS after 5 minutes if unopened. This pattern reduces notification fatigue while ensuring critical messages reach users.
Learn more about routing strategies in the multi-channel onboarding cookbook.
Production notification systems require more than basic delivery. Here's how Courier handles advanced requirements.

Users need control over which notifications they receive and how. Courier provides pre-built preference UI components where users control notification categories (marketing, security, product updates), channel preferences (email, push, SMS, in-app), quiet hours (do not disturb periods), and digest mode (batch notifications daily or weekly).
Preferences are automatically enforced at routing time—your application code doesn't need to check preferences manually. Courier stores preferences per user and applies them when routing notifications. You can also manage preferences programmatically via the API for custom integrations or admin interfaces.
Define templates in Courier's visual designer with variable substitution, conditional content, and channel-specific variations. Send notifications by template ID with dynamic data—no hardcoding content in your application. Templates support Handlebars syntax for variables, conditional logic to show/hide sections, channel-specific content (different versions for email vs. push vs. in-app), brand variations for multi-tenant applications, and internationalization with multiple language versions. The visual designer lets non-technical team members manage notification content without code deployments.

Courier automatically tracks notification events including delivery, opens, clicks, reads, archives, and dismissals. The analytics dashboard shows delivery rates, open rates, click-through rates, channel performance comparisons, and time-to-engagement metrics. Access delivery logs via API for custom analytics or integration with your existing monitoring tools. These metrics help you optimize notification timing, content, and channel selection based on actual user behavior.

High-volume applications can overwhelm users with notifications. Courier supports intelligent grouping using grouping keys to cluster related notifications together (e.g., all activity for a specific project). Configure digest mode to batch notifications—collecting messages throughout the day and sending a single summary at a specified time. This dramatically reduces notification fatigue while keeping users informed. Users can configure digest preferences per category, choosing daily or weekly summaries instead of real-time delivery.
Building a production notification system requires attention to performance, reliability, and user experience. Here are key best practices:
Courier handles WebSocket infrastructure automatically, including connection management with exponential backoff, periodic heartbeat messages to detect stale connections, multiplexing multiple message types over a single connection, and offline tolerance with local queuing. You can hook into connection events for monitoring and debugging. See WebSocket implementation details in the SDK source.
Courier's SDK implements virtual scrolling (only renders visible notifications), pagination (fetches in batches as users scroll), local caching (stores recent notifications in memory), and debounced updates (batches rapid state changes). These optimizations keep the DOM small and responsive even with thousands of notifications.
Push notifications (web and mobile) require user permission. Best practices: request permission contextually when users enable a feature (not on first launch), explain the value before requesting, and offer graceful fallback to in-app or email if users deny permission. The permission flow should be non-intrusive and value-focused.
Courier's React (and cross-platform) notification components are designed with accessibility in mind, including ARIA labels, live regions for screen readers, keyboard navigation, and focus management—aiming to satisfy WCAG AA standards. For custom notification UI, it's best practice to ensure:
aria-label="3 unread notifications").For the most current details on Courier component accessibility support, refer to the Courier documentation and test for your use case as requirements and implementations can evolve. Implementing accessibility best practices is ultimately the responsibility of your development team, especially if you build customizations or integrate with other UI frameworks.
Test notification state management with unit tests, end-to-end flows with integration tests, real device behavior for push notifications (both iOS and Android), and performance with thousands of notifications under load. View test examples in the repository.
When evaluating notification infrastructure, consider the total cost of ownership, not just upfront costs. Here's how different approaches compare:
| Feature | Courier | Novu | OneSignal | Build Custom |
|---|---|---|---|---|
| In-app notification center | ✓ Drop-in React component with full UI | ✓ Pre-built notification center components | ✓ In-app messaging (limited inbox) | ✗ Build yourself (3-4 weeks) |
| Multi-channel support | ✓ All channels unified (in-app, push, email, SMS, Slack, Teams, WhatsApp) | ✓ Multi-channel (email, push, SMS, in-app, Slack, Teams, Discord) | ✓ Push, in-app, email, SMS (push-focused) | ✗ Integrate multiple services separately |
| Pre-built UI components | ✓ React, React Native, iOS, Android, Flutter, JavaScript | ✓ React, Vue, Angular notification center components | Limited (push and basic in-app only) | ✗ Design and build yourself |
| Notification state management | ✓ Built-in with automatic cross-channel sync | ✓ Basic state management (no cross-channel sync) | ✓ Basic state management per channel | ✗ Build Redux/state system |
| User preference management | ✓ Full support (per-category, per-channel, quiet hours, digest mode) | ✓ Subscriber preferences (channel and category level) | ✓ Channel preferences and segmentation | ✗ Build UI and backend |
| Cross-channel synchronization | ✓ Automatic (email open marks inbox as read) | ✗ Manual implementation required | ✗ Not provided | ✗ Build custom tracking |
| Template management | ✓ Visual designer with variables, branching, localization, brand variations | ✓ Visual template editor with basic variables | ✓ Template editor (primarily for push) | ✗ Build CMS or hardcode |
| Analytics and tracking | ✓ Comprehensive across all channels with delivery, open, click tracking | ✓ Basic analytics and event tracking | ✓ Strong analytics (push-focused) | ✗ Build custom analytics |
| WebSocket infrastructure | ✓ Managed real-time infrastructure | ✓ Managed (cloud) or self-host option | ✓ Managed infrastructure | ✗ Deploy and manage yourself |
| Open-source option | ✗ Proprietary | ✓ Yes (MIT license, self-hostable) | ✗ Proprietary | N/A |
| Development time | Days | 1-2 weeks | 1-2 weeks (push), longer for full multi-channel | 3-6 months |
| Ongoing maintenance | Very low (fully managed) | Low (cloud) or Medium (self-hosted) | Low (managed service) | High (servers, connections, providers) |
| Provider failover | ✓ Built-in routing and failover | ✗ Not provided | ✗ Not provided | ✗ Build yourself |
| Pricing (free tier) | 10,000 notifications/month | 10,000 notifications/month | 10,000 subscribers | N/A |
| Best for | Teams needing complete multi-channel with full UI components | Developers wanting open-source flexibility | Push notification-focused applications | N/A |
Beyond comparing features, teams choose Courier for:
Even Twilio, a leading communications platform, recognized the complexity of building a comprehensive notification center and chose Courier to power their in-app notifications. By integrating Courier's Web Inbox into the Twilio Console, they transformed a fragmented messaging approach into a centralized, real-time feed.
As Raghav Katyal, Technical Lead at Twilio, explains:
"We chose Courier because the depth of the inbox and multi-channel integrations allowed us to choose one notification platform for all products and teams at Twilio."
If a company that specializes in communications infrastructure trusts Courier for their notification needs, it's a strong signal about the platform's reliability and completeness.
Ready to build your notification center? Courier makes it simple to get started:
Want to see Courier Inbox in action before integrating? The Courier React Examples repository includes multiple interactive demos showing:
Clone the repository and run the examples locally, or view the live examples to see Courier Inbox customization options.
A notification center in React is a UI component that displays a centralized feed of in-app notifications to users. It typically includes features like real-time updates, badge counters, read/unread state management, and the ability to view notification history. Modern notification centers also integrate with other channels like email, push, and SMS to provide a unified user experience.
You can build a notification system in React by either creating custom components with state management and WebSocket infrastructure (3-6 months), or by using a notification platform like Courier that provides drop-in React components. With Courier, install @trycourier/react-inbox, authenticate users with JWT, and drop the <CourierInbox /> component into your application. This approach takes hours instead of months.
Courier provides the most comprehensive React notification library, with pre-built components for in-app inboxes, toast notifications, and preference centers. It includes real-time delivery over managed WebSockets, automatic state synchronization, multi-channel support, and full customization options. The library supports React 18+, React 17, React Native, and vanilla JavaScript.
Push notifications in React require three components: a React frontend with notification UI, a backend to send notifications via push services (FCM/APNS), and device token management. Using Courier simplifies this: install the SDK, register device tokens, and send notifications through Courier's unified API. Courier handles FCM/APNS integration, token management, and cross-platform delivery automatically.
Yes, Courier's notification center is fully customizable. You can adjust colors, fonts, spacing, and layouts through theme configuration, or completely override component rendering with custom React components. You can match any design system while keeping all built-in functionality like real-time updates and state management.
When you send a notification to multiple channels (inbox, email, push), Courier automatically tracks user engagement across all channels. If a user opens an email notification, Courier marks the corresponding in-app notification as read and updates badge counts in real-time. This cross-channel synchronization happens automatically without additional code.
Toast notifications are temporary, non-intrusive messages that appear briefly on screen (typically 3-5 seconds) to alert users of new events. Inbox notifications are persistent messages stored in a notification feed that users can review, search, and manage. Both work together: toasts provide immediate awareness while inbox provides historical context. Courier supports both patterns.
Courier provides a pre-built preference management component that lets users control which notifications they receive on which channels. Install @trycourier/react-preferences and use the <PreferencesModal /> component. Courier automatically applies user preferences when routing notifications, so your application code doesn't need to check preferences manually.
Yes, Courier offers a free tier that includes 10,000 notifications per month across all channels (in-app, email, SMS, push, Slack), unlimited users, and full access to all features. This is sufficient for most development projects and small-scale production deployments. Paid plans start at $0.01 per notification for higher volumes.
Yes, Courier provides a dedicated React Native SDK (@trycourier/react-native-inbox) with native iOS and Android components. The API is identical to the web SDK, making it easy to share code between web and mobile. Courier also offers native SDKs for iOS (Swift), Android (Kotlin), and Flutter for non-React Native projects.
Notification centers have evolved from nice-to-have features to essential components of modern applications. Users expect real-time updates, multi-channel delivery, granular preferences, and seamless cross-device synchronization. Building this infrastructure from scratch requires months of development time and ongoing maintenance.
Courier provides a complete notification infrastructure platform that handles the complexity for you. With drop-in React components, a unified API across all channels, automatic state management, and production-ready scalability, you can ship a notification center in days instead of months.
Key advantages of using Courier:
The decision isn't whether to implement a notification center—it's whether to spend months building custom infrastructure or days integrating a proven platform.
Ready to build your notification center?
Transform your notification infrastructure from a months-long project into a few-hour integration. Your users—and your engineering team—will thank you.

Twilio Integrations with Courier: SMS, SendGrid, Segment
Twilio owns critical notification infrastructure: SMS for billions of messages, SendGrid for email at scale, and Segment for customer data aggregation. Using them together means maintaining three APIs, three credential sets, and zero coordination between channels. Courier solves this by providing a single integration point for all three Twilio products. Connect your accounts, use one API to send across SMS and email, trigger notifications from Segment events, and orchestrate multi-channel delivery with routing rules and failover built in.
By Kyle Seyler
December 10, 2025

Customer Messaging Platforms to Watch in 2026
Customer messaging platforms are shifting from campaign-first tools to real-time, behavior-driven infrastructure. Heading into 2026, the platforms gaining ground prioritize API-first architecture, visual journey orchestration, and intelligent channel routing. Leaders include Courier (developer-first with visual Journeys and embedded components), Knock (workflow-first batching), Customer.io (behavioral automation), and Novu (open-source). Key trends to watch: AI-assisted content, cross-channel preference intelligence, and tighter CDP integration.
By Kyle Seyler
December 08, 2025

How to Use WhatsApp Typing Indicators on Twilio (Public Beta Guide)
Twilio now supports typing indicators for WhatsApp. When your backend takes a few seconds to generate a response, you can show users that something's happening instead of leaving them staring at a silent chat. The indicator appears when you call the new /v2/Indicators/Typing endpoint, automatically marks the message as read, and disappears after your response arrives or 25 seconds pass. This guide covers the API details, implementation patterns for Node.js and Python, when to use typing indicators, and current beta limitations.
By Kyle Seyler
December 03, 2025
© 2025 Courier. All rights reserved.