Firebase Cloud Messaging (FCM) vs APNs: What's the Difference?
FCM vs APNs is a difference of tokens, credentials, and who delivers the message. Here is what each system expects, and what you can stop operating.
FCM vs APNs starts with two different systems
FCM vs APNs is not a choice of brand. Apple Notification service delivers to Apple devices. Firebase Cloud Messaging delivers to Android, and many teams also use it as a relay toward Apple. Each one has its own token, its own credentials, and its own errors.
A token from one system is not a token for the other. An iOS device token is not an FCM registration token. Sending the wrong one fails quietly if nothing records the failure.
What APNs expects
APNs wants an Apple credential for your team, the app’s bundle ID, and the device token for that install. The payload is Apple’s. A bad key, a mismatched bundle ID, or a token from the other environment does not deliver.
In Notifiable, Apple is connected once for the workspace. Each iOS app reuses that connection with its own bundle ID. The private key is stored encrypted and is not shown again.
What FCM expects
FCM wants a Firebase project, a credential that can send, and the registration token for that install. Android apps often start here. The project, the sender, and the token then become infrastructure you operate: rotation, environment mix-ups, and a fan-out you wrote yourself.
Notifiable prepares Android delivery from the app’s package name. You do not create a Firebase project to send. Web Push keys are generated with the app.
Why a small app ends up running both
A React Native or Flutter app that ships on iOS and Android inherits both systems. One screen in your product becomes two credentials, two token shapes, and two ways a send can fail. The audience logic is then a third system you also have to build.
The useful split is simpler. The app collects permission and a token. One place stores the subscriber and delivers. That place should know which provider the token belongs to.
What changes when Notifiable delivers
The subscriber record keeps the platform, the SDK, the permission, and the token. A granted permission is saved with its provider: apns, fcm, expo, or web_push. Delivery uses that record. You send one notification. The fan-out is per subscriber, with one outcome each: delivered, failed, or skipped.
You still connect Apple once if you ship on iOS. You still put a package name on an Android app. You stop running a Firebase project, an APNs key per app, and a queue that retries both.
Where this lives in Notifiable
The same product is documented in the dashboard guides. Subscribers hold the device. Notifications are the send. The public beta is the current release.
Share with friends
Send this guide to someone building notifications.