Migration guide
Migrate from Expo Push
to Ubriot Notify
Expo Push Notifications works until it doesn't. No delivery receipts, no user targeting, no campaigns - and it breaks entirely if you leave the Expo ecosystem. This guide shows you how to switch in under 30 minutes.
Why developers leave Expo Push
No delivery receipts
Expo gives you a receipt ID you have to poll separately. You never know in real time if a notification was actually delivered.
No user targeting
Expo Push has no concept of a user - only push tokens. If someone logs in on two devices, you manage that list yourself.
No campaigns
There is no dashboard to broadcast to your audience. Every send requires a code change or a custom backend endpoint.
Tied to the Expo relay
Notifications go through Expo's servers before reaching APNs or FCM. You cannot audit what Expo sees, and you depend on their uptime.
Broken on bare React Native without Expo SDK
If you ejected, dropped EAS, or are on a plain React Native project, expo-notifications either does not work or requires pulling in the full Expo SDK.
Migration steps
Create a Notify app in the Ubriot dashboard
Sign in at ubriot.dev, open the Notify section, and create a new app. Copy your API key and App ID. You will need them in step 3.
Install the Ubriot Notify SDK
Remove expo-notifications and install the Ubriot Notify package.
# Remove Expo push
npm uninstall expo-notifications
# Install Ubriot Notify
npm install @ubriot/notify-rnRegister the device on app start
Replace your Expo push token registration with UbriotNotify.register(). It handles APNs and FCM permissions automatically.
import { UbriotNotify } from '@ubriot/notify-rn';
// In your app entry point or a useEffect on login
await UbriotNotify.register({
apiKey: 'YOUR_API_KEY',
appId: 'YOUR_APP_ID',
});Identify the user (optional but recommended)
Link the device to your own user ID so you can send to a user across all their devices.
// After login
await UbriotNotify.identify({ userId: currentUser.id });Remove your Expo push backend logic
Delete any code that was calling the Expo Push API (https://exp.host/--/api/v2/push/send). Sends now go through the Ubriot REST API or from the dashboard campaigns UI.
// Send via Ubriot REST API
POST https://api.ubriot.dev/v1/notify/send
Authorization: Bearer YOUR_API_KEY
{
"appId": "YOUR_APP_ID",
"title": "New message",
"body": "You have a new message",
"userIds": ["user_123"] // or "all": true
}What you gain after migrating
- Real-time delivery logs - know exactly if each notification landed
- Auto-retry with exponential backoff - failed sends retry up to 5 times
- Campaigns dashboard - broadcast without a code change
- User targeting - send to a user across all their devices with one call
- Direct APNs and FCM - no Expo relay, no third-party reading your payloads
- Works on bare React Native - no Expo SDK dependency
Ready to migrate?
Free up to 2,500 devices. No credit card required.