Mobile apps·Updated September 19, 2026·5 min read
How to add push notifications to a mobile app
Permission, device token, storage, send — the four steps behind a working push, plus the two places push will never fire no matter what you build.
Reference documentation
Push is a native capability, which is why a web app cannot have it and a Vibely mobile project can. The module is expo-notifications, and the wiring is four steps — ask for it in chat and the agent writes all four.
The four steps
- Request permission at a moment that makes sense. Not on first launch — on the first interaction with the feature ("Enable reminders"). A permission prompt fired at a cold start is the most common reason an app never gets to send anything.
- Get the device token with
getExpoPushTokenAsync. - Store the token against the user row in your Supabase project. One user can have several devices, so this is a row per device, not a column on the profile.
- Send server-side through the Expo push API. The easiest place to call it from is a Supabase Edge Function — the same backend your app already has.
A useful prompt: "Add push notifications. Ask for permission when the user turns on reminders, store the Expo token per device in Supabase, and write an Edge Function that sends a push to one user."
If you only need reminders, you do not need a server
"Remind me at 8 AM" is a local notification, scheduled on the device with Notifications.scheduleNotificationAsync. No token, no backend, no Edge Function. A large share of habit trackers, medication reminders and timer apps need nothing else — start here and add remote push only when something outside the phone has to trigger it.
Where push will not fire
- The web preview. Push is native. The preview is a browser; it will never ring.
- The iOS Simulator, without a paid Apple Developer account.
Test on a real device: scan the Expo Go QR code from the project, or install a custom EAS build. This is the point where building a mobile app stops resembling building a website — the thing has to run on a handset to be tested at all, and every guide that says otherwise has never shipped one.
Before you submit
Apple reviews what your permission prompt says. The agent writes the NSUserNotificationsUsageDescription-class strings as it adds the capability, so the reason shown to the user matches what the app does — one of the five rejections that actually happen.
Build it while it is fresh
Vibely builds web apps and native iOS and Android apps from the same chat — the mobile ones run on a real handset over Expo Go before they ever reach a store.
Start a mobile app