The Role of Push Notifications
Push notifications are the most direct channel between your app and your users. Done well, they drive engagement, retention, and revenue. Done poorly, they drive uninstalls. The difference lies in architecture, timing, and relevance.
Platform Architecture: FCM and APNs
Apple Push Notification Service (APNs)
APNs is Apple's notification delivery system. Every push notification to an iOS device routes through Apple's servers:
Your server sends a notification payload to APNs with a device token APNs delivers the notification to the specific device If the device is offline, APNs stores the notification and delivers it when the device reconnects (with coalescing for identical notifications) APNs requires either a TLS certificate or a JWT token for authentication. The JWT approach (token-based) is simpler to manage and recommended for new implementations.
Firebase Cloud Messaging (FCM)
FCM handles notifications for Android and can also deliver to iOS (by proxying through APNs). For cross-platform React Native apps, FCM is typically the unified layer:
Your server sends a notification to FCM with a device registration token FCM delivers to Android directly and routes iOS notifications through APNs FCM supports topic-based messaging (subscribe users to topics like "sports" or "breaking-news") and device group messaging Notification Channels (Android)
Android 8.0+ requires notification channels. Each channel represents a notification category with user-controllable settings:
Importance level: Urgent (sound + heads-up), high (sound), default (sound), low (no sound), minimum (no sound, no visual) Sound: Custom notification sounds per channel Vibration: Pattern and intensity Badge: Whether to show a badge on the app icon Design your channels around user mental models, not technical categories:
"Messages" — high importance, custom sound "Order Updates" — default importance "Promotions" — low importance "System Updates" — minimum importance Users can independently control each channel. If you stuff all notifications into one channel, users who dislike promotional notifications will disable all of them, including critical order updates.
Deep Linking from Notifications
A notification that opens the app's home screen wastes the user's tap. Deep linking takes the user directly to the relevant content:
"Your order has shipped" → Opens order tracking screen with that specific order "New message from Priya" → Opens the conversation with Priya "Your report is ready" → Opens the report viewer with the generated report Implementation Pattern
Include a deep link URL in the notification payload:
Data payload: `{ "deepLink": "myapp://orders/12345" }` App receives notification tap: Parse the deep link URL Navigate: Use React Navigation's linking configuration to handle the URL and navigate to the correct screen Handle both scenarios: the app is already open (foreground) and the app is launched by the notification (cold start). Cold start deep linking requires persisting the initial URL and processing it after navigation is ready.
Rich Notifications
Rich notifications include media content beyond text:
iOS Rich Notifications (Notification Service Extension)
Images: Attach product photos, user avatars, or maps GIFs: Animated images for engaging promotional notifications Video: Short video thumbnails that expand on long press Custom UI: Notification Content Extensions allow fully custom notification interfaces Android Rich Notifications
Big Picture Style: Large image displayed when notification is expanded Big Text Style: Expandable text for longer messages Inbox Style: Multiple lines of text (like email summaries) Media Style: Playback controls for music/podcast apps Custom layouts: RemoteViews for fully custom notification UI Silent Notifications
Silent (data-only) notifications wake your app in the background without showing anything to the user. Use cases:
Background data sync: Trigger a sync when new data is available on the server Content pre-fetching: Download content so it is ready when the user opens the app Configuration updates: Push updated feature flags or configuration without requiring an app update Logout: Force logout on all devices when a user changes their password On iOS, silent notifications have strict rate limiting. Apple throttles apps that send too many silent notifications. On Android, FCM data messages are unrestricted but may be delayed by battery optimization (Doze mode).
Notification Analytics
Track the full notification funnel:
Sent: How many notifications were sent from your server Delivered: How many reached the device (FCM provides delivery receipts) Opened: How many users tapped the notification (track with a unique notification ID) Converted: How many users completed the desired action after tapping Key Metrics
Opt-in rate: Percentage of users who allow notifications. Industry average is 50-60% on Android, 40-50% on iOS. Open rate: Percentage of delivered notifications that are tapped. 5-15% is typical; above 20% is excellent. Uninstall correlation: Track whether notification frequency correlates with uninstalls. If uninstalls spike after a promotional notification campaign, you are over-sending. Best Practices
Personalize: "Your order #1234 has shipped" outperforms "An order has shipped" by 4x in open rates Timing matters: Send notifications when users are most likely to engage. Analyze your app usage patterns by timezone. Frequency capping: Limit the number of notifications per user per day. 2-3 non-transactional notifications per day is the maximum before users start disabling. Re-engagement: For users who have not opened the app in 7+ days, a well-crafted re-engagement notification can reactivate 10-15% of dormant users. A/B test: Test notification copy, timing, and deep link destinations. Small improvements in open rate compound over millions of notifications. Push notifications are powerful but require disciplined execution. Need help designing a notification strategy for your app? Contact us.