Why Most Expo Developers Get Push Notifications Wrong (And How to Fix It)
If you've ever tried implementing push notifications in an Expo React Native app using Ionic Capacitor, you know the pain:
FCM tokens that silently expire and you never find out until users complain
APNs certificates vs. keys — which one do you actually need for production?
Notifications arriving but not displaying because you missed the Android notification channel setup
Deep links that open the app but dump the user on the home screen instead of the right content
Here's the thing — push notifications aren't hard. They're just poorly documented across three different ecosystems (Expo, Capacitor, and Firebase/APNs) that each assume you already understand the other two.
The 3 Mistakes I See Constantly
1. Skipping Local Notifications Entirely
Most devs jump straight to remote push via FCM. But local notifications are your testing foundation. If you can't trigger and display a local notification reliably, you have no way to isolate whether a remote push failure is a server problem, a token problem, or a display problem.
2. Not Handling the "Cold Start" Tap
When a user taps a notification while your app is killed, the startup flow is completely different from a foreground tap. If you only handle pushNotificationActionPerformed in your main component, you'll miss cold-start taps because the listener isn't registered yet.
// This listener needs to be registered BEFORE your app component mounts
PushNotifications.addListener('pushNotificationActionPerformed', (notification) => {
// Store the deep link data and process it after navigation is ready
pendingNotificationAction = notification;
});3. Ignoring Silent Pushes for Data Sync
Silent pushes let you update your app's data in the background without disturbing the user. They're essential for chat apps, content feeds, and anything where freshness matters. Yet most tutorials completely ignore them.
The Bottom Line
Push notifications are a system — device registration, server-side sending, display handling, deep linking, and background processing all need to work together. Miss one piece and the whole thing feels broken.
I built a full course covering all of this from zero to production. If you're tired of piecing together Stack Overflow answers, check it out.
What's the biggest push notification headache you've dealt with? Drop it in the comments 👇
