Integrate push notifications into your app
Pick your platform on the left: iOS, Android, Flutter, React Native, .NET MAUI, or sending from your backend.
🚀 Getting started
Create an account and a project
Each app is a project with an App ID (public, embedded in the app) and an API Key (secret, backend only). In the dashboard the samples are pre-filled with your App ID and you can download the SDKs.
Connect APNs / FCM
iOS: a
.p8key file, Team ID, Key ID and Bundle ID from Apple Developer. Android: a service account JSON from the Firebase Console. Enter them in the project's Push credentials tab.Pick your app's platform
Follow the guide for your platform (left column), then send a test from the dashboard or your backend.
🍎 iOS Swift, iOS 13+. Notifications via APNs, calls via PushKit + CallKit. No Firebase needed.🤖 Android Kotlin/Java, minSdk 23. Firebase Cloud Messaging with a ready-made full-screen call UI.💙 Flutter Dart, Flutter 3.22+. Built on firebase_messaging and flutter_callkit_incoming.⚛️ React Native TypeScript, RN 0.71+. Built on @react-native-firebase/messaging and react-native-callkeep.🟣 .NET MAUI C#, .NET 10. Android uses Firebase; iOS uses PushKit + CallKit directly.🖥️ Backend Your backend calls the REST API to send notifications and calls to the app.
- The API Key (
psk_…) is for your backend only. Never embed it in the app. - Test on real devices: the iOS simulator can't receive call pushes; Android emulators need Google Play.
❓ Common issues
- iOS returns
BadDeviceToken - Wrong sandbox/production environment: Xcode debug builds are sandbox, TestFlight/App Store are production.
- No VoIP badge
- The Voice over IP background mode is off, or calls weren't enabled when initializing the SDK.
- Android doesn't ring when the app is closed
- Xiaomi/Oppo/Vivo phones block background work: enable Autostart and disable battery optimization. Android 14+: grant the full-screen intent permission.
- Devices receive nothing
- The FCM service account is from a different Firebase project than the app, or the Bundle ID differs from the APNs settings.