01What is a push notification?
A push notification is a message an app's server sends to a user's device through the operating system's push service — the Apple Push Notification service (APNs) for iPhone and iPad, and Firebase Cloud Messaging (FCM) for Android — which shows it on the lock screen or in the notification shade even when the app is closed. Your server never talks to the phone directly: it hands the message to APNs or FCM, addressed to a device token, and the platform delivers it over its own always-on connection to the device.
Two conditions decide reach. The person must have your app installed, and they must have allowed notifications: iOS has always asked for permission, and Android has done the same since Android 13 added the POST_NOTIFICATIONS runtime permission. Tokens also change or die when someone reinstalls the app, restores a phone or uninstalls, so a push audience is always smaller and less stable than a list of phone numbers.
Sending is free — neither Apple nor Google charges per notification — but delivery is best-effort, with no guarantee of timing and no delivery receipt unless your app reports one back. That is the opposite trade-off to WhatsApp or SMS (Short Message Service), which are addressed to a phone number, reach people without your app, and cost money per message. In an omnichannel orchestration plan, push usually comes first for app users, with a fallback channel behind it for everyone push cannot reach.
Key takeaways
- A push notification is an alert your server sends through Apple's APNs or Google's FCM to an app installed on a phone.
- It is addressed to a device token for one app install, not to a phone number, so it reaches only installed, opted-in users.
- Apple and Google charge nothing per notification, which makes push the cheapest channel for alerts to active app users.
- Delivery is best-effort: battery savers, revoked permissions and dead tokens drop messages without telling the user.
- Use push first and fall back to a WhatsApp utility template or SMS when an alert matters and the app does not confirm it.
02 · How it works, step by step
How does a push notification work?
- Step 1
The app gets a device token
On launch, the app registers with APNs (through iOS) or FCM (through the Firebase SDK) and receives a device token — an opaque string that identifies this install of this app on this device.
- Step 2
The user grants permission
The app asks to show notifications: always on iOS, and on Android 13 or later through
POST_NOTIFICATIONS. Without permission a token can still receive background data messages, but nothing is shown to the user. - Step 3
Your server stores the token
The app sends the token to your backend, linked to the user and platform. Replace it whenever the SDK reports a new one, and keep one row per device, not per user.
- Step 4
Your server sends through APNs or FCM
Post the payload — title, body and a data field such as a deep link — to the FCM HTTP v1 API with an OAuth 2.0 token, or to the APNs HTTP/2 API with a JWT signed by your .p8 key. Standard payloads are capped at 4 KB.
- Step 5
Handle errors and fall back
Delete tokens the service reports as dead (FCM
UNREGISTERED, APNs 410Unregistered). For alerts that matter, start a timer and send a WhatsApp or SMS message if the app has not confirmed the notification was received or opened.
03A push notification in code
curl -X POST "https://fcm.googleapis.com/v1/projects/{PROJECT_ID}/messages:send" \-H "Authorization: Bearer {OAUTH2_ACCESS_TOKEN}" \-H "Content-Type: application/json" \-d '{"message": {"token": "{DEVICE_TOKEN}","notification": {"title": "Your order is out for delivery","body": "Arriving by 6 pm. Tap to track it live."},"data": { "order_id": "OD-48213", "deep_link": "app://orders/OD-48213" },"android": { "priority": "high", "ttl": "3600s" },"apns": { "headers": { "apns-priority": "10" } }}}'# 200 OK -> {"name": "projects/{PROJECT_ID}/messages/0:1760870000000000%a1b2c3"}# 404 UNREGISTERED -> the token is dead: delete it and use another channel
One request reaches Android and, through FCM's APNs bridge, iOS. A short ttl stops a stale delivery alert arriving hours late.
04A push notification: key facts and limits
- Push services
- APNs (Apple) and FCM (Android, cross-platform)
- Cost per send
- None charged by Apple or Google
- Addressed to
- A device token per app install, not a phone number
- Payload limit
- 4 KB (4,096 bytes) for standard notifications
- Android permission
- POST_NOTIFICATIONS since Android 13
- Dead token signal
- FCM 404 UNREGISTERED · APNs 410 Unregistered
- Offline devices
- Held until ttl expires (FCM default and maximum: 4 weeks)
05Why does a push notification matter?
Push is the zero-cost first choice for alerts to people already in your app — a ride arriving, a payment received, an order out for delivery — and every alert moved to push is a utility template or SMS you do not pay for. But it reaches only installed, opted-in devices and fails silently for everyone else. Treating push as the first step of a chain, with WhatsApp, RCS Business Messaging or SMS behind it, keeps cost low without losing the customers who never open the app.
06 · Common mistakes, and the fix
Common mistakes with a push notification
Treating push as guaranteed delivery
Aggressive battery savers on some Android phones, Do Not Disturb, revoked permissions and offline devices all swallow notifications without an error. For OTPs or payment-critical alerts, never rely on push alone: set a timer and fall back to WhatsApp or SMS.
Keeping dead tokens
Sending to uninstalled apps wastes requests and inflates your 'reachable' audience. Delete tokens on UNREGISTERED or 410 responses, and refresh tokens the SDK rotates.
Asking for permission on first launch
A cold permission prompt is easy to deny, and on iOS a denial can only be reversed in Settings. Ask at the moment the value is obvious — after the first order, before a delivery — and explain what you will send.
Putting sensitive data on the lock screen
Notifications are visible to anyone holding the phone. Keep account balances, OTPs and health details inside the app, and send a prompt to open it instead.
Using push as a blast channel
Frequent promotional pushes drive people to switch notifications off or uninstall, which removes them from transactional alerts too. Cap promotional frequency and measure opt-out after every campaign.
07Example: Delivery alerts for a Kochi grocery app
A grocery app in Kochi sends "Your order is out for delivery" as a push notification to every customer with a valid token and notifications allowed. Customers without the app, with notifications off, or whose device does not confirm receipt within five minutes get a WhatsApp utility template instead, and SMS is the last resort for numbers without WhatsApp. Because utility templates in India have been charged at ₹0.19 — including inside an open service window since 1 October 2026 — every alert push delivers is a template the store does not pay for. The team watches two numbers each week: the share of orders covered by push, and how many alerts fell through to paid channels.
08 · Tips from the bench
Best practices for a push notification
- Include a deep link in the data payload so a tap opens the exact screen, not the home page.
- Use collapse keys (apns-collapse-id, FCM collapse_key) for updates that replace each other, such as an ETA.
- Track open rate per notification type and retire the types nobody taps.
- Escalate critical alerts: push first, then a WhatsApp utility template if the app has not confirmed receipt in a few minutes.
09Push Notification FAQs
Are push notifications free to send?+
What is the difference between a push notification and an SMS?+
Can push notifications replace WhatsApp messages?+
Why are my push notifications not arriving on some Android phones?+
How long does FCM keep a message for an offline phone?+
* Per-message rates for India, ex-GST: marketing, utility and authentication effective 1 July 2026; service messages ₹0.145 since 1 October 2026 (they were ₹0 until 30 September 2026). Volume commitments earn discounts — final rate is confirmed on your account; applicable GST extra. Rates for other countries differ (see the international rate table on /pricing).