What 'Push Notification Infrastructure' Actually Means
Push notification infrastructure is the full pipeline that gets a message from your backend onto a locked screen — not the single API call most teams picture when they say "we added push notifications."
The pipeline has five load-bearing pieces, and each one fails silently if nobody owns it. Your server builds a payload. It hands that payload to a platform gateway — Apple's APNs for iOS, Google's FCM for Android and web — authenticated with credentials that expire or rotate on a schedule you don't control. The gateway holds a persistent connection to the device and forwards the payload the next time the device is reachable, which is not the same as immediately. The device's OS decides whether, when, and how loudly to surface it, using rules you only partly influence. And somewhere in your own system, a token store has to know which of your millions of stored device identifiers are still alive, because both platforms will tell you when one has died and most systems never bother to listen.
This matters because push sits at an unusual intersection for a mobile engineering team: it is simultaneously one of the easiest features to demo (a working send in an afternoon) and one of the easiest to get quietly, expensively wrong at scale (a token store that has been 15 percent dead for six months with nobody noticing). We wrote this guide because most of what circulates about push notifications is either an SDK quick-start that stops at the demo, or vendor marketing that skips straight to opt-in-rate benchmarks with no disclosed methodology. Neither answers the question an operator actually has: what does this system need to do correctly, in what order, and what does it cost to build it that way.
If you are weighing whether to build this yourself against a React Native or Flutter cross-platform base, the push layer is one of the few places the choice of framework still leaks through to native code — both frameworks wrap the same two gateways, but the quality of that wrapper varies, and you will end up reading Apple and Google's own documentation regardless of which one you pick.
Device Tokens: Registration, Rotation, and Silent Death
A device token is the address a platform gateway uses to find a specific installation of your app on a specific device — not a user, not an account, an installation. Every push send starts by looking one up, and every architecture problem in this section starts from teams treating the token store as an afterthought instead of the foundation it is.
Tokens are not permanent. iOS can reissue a device token when the user restores from backup to a new device, reinstalls the app, or in rarer cases when Apple rotates it server-side; Android tokens rotate under FCM's own registration-refresh logic and whenever the app is reinstalled or its data is cleared. Your client SDK's job is to detect a new token on launch and push the update to your server immediately — a token store that only updates on account login will drift out of date for every user who doesn't log in often.
The harder problem is the tokens that go stale silently. A user uninstalls your app; nothing tells your server that happened. The next time you send to that token, the platform gateway rejects it — but only if your system is listening for the rejection.
| Signal | APNs (iOS) | FCM (Android/web) |
|---|---|---|
| What it looks like | A 410 status on the token's associated response path, with a timestamp indicating when the token stopped being valid | An UNREGISTERED error code returned directly on the send response |
| What it means | The token is permanently invalid — do not retry it | The token is permanently invalid — do not retry it |
| What most systems do with it | Nothing. The send is logged as an error and the token stays in the store indefinitely. | Nothing. Same failure mode, same root cause: nobody wired a pruning job to the response. |
| What a correctly built system does | A scheduled job consumes the rejection signal and deletes or flags the token within a day, not a quarter | Same: the send path itself, or a nightly job, prunes on UNREGISTERED |
Left unpruned, dead tokens don't just waste a fraction of every send — they corrupt your own metrics. A delivery-rate dashboard computed against a token store that is 15 percent dead will report a 15-point delivery problem that doesn't exist; the tokens were never going to resolve, and no amount of retry logic or vendor migration fixes a stale address book. This is the single most common production issue we see in push systems that were built once and never revisited, and it is also the cheapest one to fix — a scheduled job, not a redesign.
A second, less obvious edge case is the token-to-recipient mapping itself. A token identifies an installation, not a person, which means a shared device, a user who logs out and a different user logs in, or an app reinstalled under a new account all create the same underlying question: which account should this token be attached to right now? Systems that key push delivery off a stale user-to-token mapping end up sending one person's notifications to whoever is currently logged in on that device — a real bug we have seen in production, not a theoretical one — because nobody re-associated the token on logout. The fix is mechanical: detach the token from the outgoing account at logout and re-register it fresh on the next login, every time, with no exception for "the same device so it's probably fine."
- Multi-device users: One person, several installs — the token store needs a one-to-many relationship from account to token, not one-to-one, or a user with both a phone and a tablet only ever gets notified on whichever device registered last.
- Reinstall vs. restore: A fresh install issues a new token immediately; a restore-from-backup to a new device can carry old app state but still needs a fresh token registered against the new hardware on first launch.
- Logout without re-registration: The most common real bug: failing to detach a token from an account at logout means the next person to use that device can receive the previous user's notifications.
APNs: Token-Based Auth and the 2025 Certificate Cutover
Apple Push Notification service is the only door into an iOS device. Every vendor, every SDK, every cross-platform framework you might choose is, underneath, a client of this one gateway — buying a platform changes who manages the plumbing in front of it, not whether APNs sits in the path.
Apple documents two ways to authenticate a connection to APNs, and one of them is legacy. Token-based authentication uses a JSON Web Token signed with a .p8 private key you generate once in your developer account, carrying an iss claim (your Team ID), a kid claim (the Key ID), and an expclaim, sent over HTTP/2. It does not expire the way a certificate does, and one key works across every app your team owns. Certificate-based provider connections still function over HTTP/2 today, but each certificate expires annually and is scoped to a single app's bundle ID — it is the option every current piece of Apple documentation treats as the legacy path, not the option Apple leads with.
The distinction between provider authentication and server-side trust is where most incidents actually happen, and it is worth separating clearly. Provider certificates and keys are what you present to APNs to prove your server is allowed to send. The server certificate is what APNs presents to you, and your server validates against its trust store before it will accept the connection at all — a completely different mechanism, and the one that changed in 2025.
Why this still matters in 2026: any server rebuilt from an old container image, restored from a stale snapshot, or provisioned by a script written before early 2025 may still be missing the current root. This is not a one-time fix you made and can forget — it is a pattern. Apple has changed this root before and will again, and trust-store currency belongs on your infrastructure checklist as an ongoing item, the same way you'd track TLS certificate expiry on any other server.
FCM: HTTP v1, the Legacy Shutdown, and Android Delivery
Firebase Cloud Messaging is Google's equivalent gateway for Android and the web, and — because most cross-platform SDKs route Android sends through it regardless of vendor — it is also the transport underneath the large majority of Android push traffic even when a paid platform sits in front of it.
Google marked the legacy FCM HTTP and XMPP send APIs deprecated in June 2023 and shut them down for good on June 20, 2024. Everything still pointed at the legacy fcm.googleapis.com/fcm/sendendpoint stopped working that day — not degraded, dead. The replacement, FCM's HTTP v1 API, authenticates with short-lived OAuth2 access tokens issued to a service account instead of a long-lived server key, is scoped to a specific Firebase project rather than a legacy sender ID, and uses a different message envelope shape. The Admin SDK most teams actually integrate against wraps v1 directly, so most current codebases never touch the raw HTTP surface — but any integration older than 2024, or any custom send logic written by hand, is worth auditing specifically for a hardcoded legacy endpoint.
On the client side, FCM exposes a delivery-priority flag — normal or high — that changes how aggressively Android tries to wake the device to deliver the message, and a time-to-live window after which the gateway stops trying and drops it. Neither is a delivery guarantee; both are inputs the OS weighs alongside battery state, Doze mode, and the device's own background-execution limits, which have tightened with almost every Android release since Android 6's original Doze implementation.
We were unable to directly retrieve Firebase's own current documentation pages while researching this guide, due to a network restriction in our research tooling rather than any ambiguity in the underlying facts. The June 20, 2024 shutdown date is corroborated across multiple independent threads that quote Google's original announcement directly — see the sources list — but if a specific integration detail matters for your migration, confirm it against Firebase's live documentation before you act on it.
| Dimension | APNs (iOS) | FCM (Android / web) |
|---|---|---|
| Authentication method | Token-based JWT (.p8 key, iss/kid/exp claims) over HTTP/2, Apple's recommended current path | OAuth2 short-lived access token via a service account, required since the v1 migration |
| Legacy path status | Certificate-based provider connections still function over HTTP/2 but are the documented legacy option; certificates expire annually and are scoped to one app | Legacy HTTP and XMPP send APIs were fully shut down June 20, 2024 — no legacy path remains |
| Delivery guarantee | Best-effort; Apple states no fixed daily cap on silent push exists because the throttling budget is adaptive to battery, network and Background App Refresh state | Best-effort; FCM offers a short message TTL and 'high priority' delivery class, neither of which is a delivery guarantee to an unreachable device |
| Dead-token signal | APNs feedback indicates a token is no longer valid, with a timestamp for when it stopped being valid | FCM returns an UNREGISTERED error on send to a token that is no longer valid |
| Permission model | One-shot system prompt since iOS 8; declining locks the app out until the user changes it in Settings | Opt-in runtime permission (POST_NOTIFICATIONS) only since Android 13 (API 33); pre-13 devices default to on |
| 2024–2025 breaking change | Server certificate authority change: new root required in sandbox by Jan 20, 2025 and production by Feb 24, 2025 | Legacy HTTP/XMPP APIs fully retired June 20, 2024 — any sender still pointed at the old endpoint has been failing since that date |
The Permission Prompt: One Shot, Two Platforms
Both major platforms now require explicit, affirmative permission before your app can show a single notification — but they arrived at that rule five years apart, and the failure mode for getting the prompt wrong is identical on both.
iOS has required an explicit permission request since iOS 8. Android inverted its default far more recently: starting with Android 13 (API level 33), apps must declare and request the POST_NOTIFICATIONS runtime permission before sending any non-exempt notification, where previously notifications were on by default and a user had to actively find the setting to turn them off. Android's own documentationis direct about the consequence: "If the user selects the don't allow option, your app can't send notifications unless it qualifies for an exemption. All notification channels are blocked, except for a few specific roles" — and for apps still targeting Android 12L or lower, "if the user taps Don't allow, even just once, they aren't prompted again until they uninstall and reinstall your app, or you update your app to target Android 13 or higher."
That one-shot structure is the entire reason permission-priming exists as a discipline. Both platforms let you show your own in-app explanation before triggering the system dialog — a short screen explaining specifically what the user gets (order updates, game invites, appointment reminders) rather than a generic "stay in the loop." The system prompt itself cannot be customized or re-triggered on demand once declined, so the only lever you actually control is the moment immediately before it appears, and on both platforms you effectively get one real attempt.
On Android, correctly using notification channelsalso matters more than most teams treat it: channel-level importance is set once at creation and cannot be changed by your app afterward — only the user can adjust it in system settings — so shipping every notification type into one broad channel forces users into an all-or-nothing choice instead of letting them mute the categories they don't want while keeping the ones they do.
Interruption Levels and Apple's On-Device Re-Ranking
iOS gives you four interruption levels, and treating them as decoration rather than architecture is a mistake that got more expensive in 2025.
| Level | What the system does | Correct use |
|---|---|---|
| passive | Adds the notification to the list without lighting the screen or playing a sound | Content that shouldn't interrupt at all — a background sync confirmation, a minor status update |
| active | Presents immediately, lights the screen, can play a sound (the default) | Most ordinary notifications: a new message, a like, a routine update |
| timeSensitive | Presents immediately and can break through Focus mode restrictions | Things the user genuinely needs to see soon: a delivery arriving now, a boarding call |
| critical | Bypasses the mute switch entirely to play a sound (a scarce entitlement Apple grants sparingly) | Safety alerts only — this is not a marketing lever and Apple reviews access to it accordingly |
Since iOS 18.4 (released March 31, 2025), Apple Intelligence added on-device machine-learning ranking — Priority Notifications — that surfaces what it judges to be your most important messages at the top of the Lock Screen and notification stack, independent of the interruption level you set. It leans hardest on its own judgment exactly where developers left everything at the default activelevel instead of correctly categorizing notification types. The practical consequence: you are no longer the only ranking signal in the system. Getting interruption levels right at the API level is no longer a nice-to-have — it's an input into a second decision-maker you don't control.
On Android, the analogous lever is notification-channel importance combined with the notification's own priority flag, and the same principle applies: categorize honestly, because both platforms are increasingly willing to override a developer who marks everything urgent.
Silent Push: Budgets, Throttling, and What It's Actually For
A silent push — a payload carrying content-available: 1with no visible alert, sound, or badge — wakes your app briefly in the background to fetch fresh data before the user opens it. It is the mechanism behind "the app already had the new content ready when I opened it," and it is the most misunderstood category in this entire pipeline.
Apple's own guidance is not to send more than two or three background notifications per hour to a given device, and the system layers dynamic throttling on top of that based on battery level, network conditions, Low Power Mode, and how often the user actually opens the app — with no fixed, published daily cap, because the budget adapts rather than staying static. A device in Low Power Mode or with a poor track record of the user opening the app after a silent push will simply receive fewer of them over time, silently, with no error surfaced anywhere in your pipeline.
This is also the category most exposed to prompt-injection-adjacent risk if your app pipes any external, untrusted content (a webhook from a third party, a scraped feed) directly into a silent-push-triggered background process without validation — treat any data arriving via a background wake the same way you'd treat any other untrusted input at a system boundary, not as implicitly trusted just because it arrived through your own push channel.
Delivery Reliability: What 'Sent' Doesn't Mean
"Sent successfully" from your push provider means the platform gateway accepted your payload for delivery. It does not mean a device received it, and it does not mean a human saw it — collapsing those three distinct states into one green checkmark is the most common reliability mistake in production push systems.
- Accepted: The gateway (APNs or FCM) returned a success status for your send request. This is the only state most integrations actually measure.
- Delivered: The payload reached the device. Neither platform confirms this back to your server by default — you only learn it indirectly, if at all, through client-side telemetry your own app reports after the fact.
- Seen: A human looked at the notification. This requires your own client-side instrumentation and is a separate signal from delivery entirely.
Because neither gateway offers an end-to-end delivery guarantee, the correct architectural response depends entirely on what the notification is for. For a workflow where a missed message is merely a minor inconvenience — a new-content nudge, a re-engagement prompt — best-effort is an acceptable trade. For a workflow where a missed message is a real problem — a one-time passcode, a fraud alert, a critical status change — push cannot be the only channel; it needs a fallback to SMS, email, or a pull-based check on next app open, and your system needs to explicitly track the difference between "we sent it" and "we confirmed it landed."
Retry and dead-letter handling belong in the same conversation. A transient error from either gateway — a 5xx from APNs, an UNAVAILABLE from FCM — is recoverable with exponential backoff; a permanent error (invalid token, unregistered) is not, and retrying it forever just wastes send quota against a token that will never resolve. A production system needs both paths distinctly implemented, with the permanent-failure path feeding directly into the token-pruning job described earlier.
Rich notifications — an image, a video thumbnail, or custom UI attached to the alert — add a further reliability wrinkle worth flagging separately: on iOS they run through a Notification Service Extension, a small separate process with its own memory ceiling and a hard time budget to fetch and attach the media before the system gives up and shows the plain-text fallback instead. That fallback path is not a bug to fix; it is the correct behavior, and a well-built notification should read sensibly even when the rich content never arrives, because on a slow network it frequently won't.
The Compliance Overlay: Consent, ePrivacy, and App Store Rules
Push notifications sit under three overlapping sets of rules, and conflating them is how teams end up compliant with one and exposed under another.
Apple's own App Store Review Guideline 4.5.4 is a platform contract, enforced by Apple regardless of where your users live. The current text reads in full:
Push Notifications must not be required for the app to function, and should not be used to send sensitive personal or confidential information. Push Notifications should not be used for promotions or direct marketing purposes unless customers have explicitly opted in to receive them via consent language displayed in your app's UI, and you provide a method in your app for a user to opt out from receiving such messages. Abuse of these services may result in revocation of your privileges.
— Apple App Store Review Guidelines, §4.5.4
Three separate obligations sit in that one paragraph: push cannot gate core app functionality, the payload itself cannot carry sensitive personal data (remember payloads can be logged, cached, and shown on a locked screen before anyone unlocks the device), and any promotional use needs its own explicit, separately-worded opt-in with a working opt-out — a general terms-of-service checkbox does not satisfy it.
Separately, under EU law, storing and later reading a device's push token is storage of and access to information on terminal equipment in the sense addressed by Article 5(3) of the ePrivacy Directive, and the European Data Protection Board's Guidelines 2/2023 on the technical scope of that article is the relevant reference for working out where a given technical mechanism falls on that spectrum. Where consent is the applicable legal basis, GDPR Article 6(1)(a) supplies the standard a valid consent has to meet — freely given, specific, informed, and unambiguous.
France's data protection authority, the CNIL, made the practical version of this point directly in its own recommendation for mobile applications (adopted July 18, 2024, published September 24, 2024, and republished with non-substantial edits on April 8, 2025): a bare operating-system permission prompt does not, by itself, constitute GDPR-valid consent for anything beyond the single narrow technical purpose that permission actually covers. A user tapping "Allow" on the iOS or Android system dialog has agreed to receive notifications from your app — that is not automatically the same thing as having consented to targeted marketing sent through that channel, and treating the two as interchangeable is exactly the gap regulators have been closing.
Build vs. Buy: A Landscape That Refuses to Score What It Can't Verify
This is not a ranked top-10 list, and that is a deliberate choice. Push notification infrastructure has two mandatory platform layers — APNs and FCM — that every vendor sits in front of, so the useful question is not "which vendor is best" but "what does each option actually replace, and what do you still own yourself."
| Provider | Category | What You're Actually Buying | Public Security Posture | Corporate Status (checked Aug 31, 2026) |
|---|---|---|---|---|
| Firebase Cloud Messaging (Google) | Free platform layer | The Android/web delivery backbone; nearly every Android push path terminates here even when a paid vendor sits in front of it | Part of Google Cloud's standard security program; FCM itself is not a separately BAA-able product | Google product, not a company — not applicable |
| Apple Push Notification service (APNs) | Mandatory platform layer | The only door into an iOS device; every iOS vendor is a client of this, never a replacement for it | Apple's own infrastructure; you manage authentication keys and trust-store roots on your side | Apple product, not a company — not applicable |
| Amazon SNS Mobile Push | Cloud infra utility | A thin AWS routing layer over APNs/FCM; you still own token lifecycle and retry logic yourself | AWS's standard compliance program (SOC, ISO, HIPAA-eligible with a BAA at the AWS account level) | AWS service, not a standalone company |
| OneSignal | Self-serve platform | The fastest path to a monitored, working send pipeline with a real free tier | Publishes a security page; verify current BAA availability directly before any regulated use | Private, independent; $84.3M total raised, Series C in 2022 |
| Braze | Enterprise cross-channel platform | Push as one channel inside a full lifecycle-marketing and orchestration suite | Publishes a public trust center | Public company, Nasdaq: BRZE; FY2026 revenue $738.2M, up 24.4% year over year |
| Airship | Enterprise mobile-first platform | The deepest mobile-specific feature set among the independents (message center, wallet) | Publishes trust and security resources; verify current certifications directly | Private, independent; backed by August Capital, Verizon Ventures and others. Not to be confused with the unrelated UK hospitality-CRM company of the same name acquired by Zonal in 2022 |
| Iterable | Enterprise cross-channel platform | Similar shape to Braze; competes on AI-driven send-time and content personalization | Publishes a security page; verify current certifications directly | Private, independent; $200M Series E at a $2B valuation |
| CleverTap | Engagement + product analytics | Push bundled with in-app analytics and lifecycle campaigns, strong Android and emerging-market delivery focus | Publishes compliance claims; verify current certifications directly | Private, independent, Series D; over $180M raised across sources reviewed, no evidence of acquisition |
| Batch | Mid-market CRM + push | A European (French) alternative with GDPR-first positioning | Publishes compliance claims; verify current certifications directly | Private, independent, French company |
A few categories worth naming separately: developer-first "notification infrastructure" platforms — Knock, Courier, and the open-source Novu, all founded around 2021 — have emerged as a distinct category from the marketing-suite platforms above, positioning themselves as a programmable orchestration layer (multi-channel workflows, per-user preference centers, template management via API) for engineering teams who want infrastructure rather than a campaign-management UI. Novu's open-source posture in particular means a team can self-host the orchestration layer while still calling out to APNs and FCM underneath, which is a meaningfully different trust model from a fully hosted vendor. We have not independently verified current corporate status or security posture for this category to the same depth as the table above, so treat it as a pointer worth researching directly rather than a scored recommendation.
On the refused figures specifically: searching on August 31, 2026, we found three current vendor benchmark reports — Airship, Batch, and Pushwoosh — each publishing a different figure for "the industry average" iOS opt-in rate, drawn from that vendor's own customer base with no disclosed sampling method or denominator. Three numbers that disagree by several points while each claiming to describe the same average is not evidence of a real number with some noise around it — it is evidence that no independently audited number exists. We name the reports so a reader can trace the claim themselves, and we decline to print any of them as fact.
Reference Architecture and the Order to Build It In
The order matters more than the individual components, because each step either depends on the one before it or fails invisibly without it.
| Step | What | Failure Mode If Skipped | Why This Order | |
|---|---|---|---|---|
| 1 | Baseline measurement | Read-only | You cannot tell whether anything you build later actually improved delivery | You need an honest before-number: current opt-in rate, current dead-token share, current time-to-registration. No vendor's benchmark substitutes for your own. |
| 2 | Token lifecycle plumbing | Registration + storage write; no user-facing send yet | New installs silently accumulate with no way to reach them | Nothing else works without a correct, deduplicated, prunable token store. Build this before you build a single send path. |
| 3 | Transactional sends (OTP, order/status updates, security alerts) | Write required; needs delivery-confirmation and a fallback channel | User falls back to the fallback channel (SMS/email) or a manual check | Highest business criticality, lowest volume, and the category where 'best-effort' is least acceptable — this is where the fallback channel earns its cost. |
| 4 | Consent-gated marketing and lifecycle campaigns | Write required; audience must be built from consented users only | Suppress the send | This is the category Apple's guideline 4.5.4 and EU consent law both specifically govern. Get the consent plumbing right before the first campaign, not after. |
| 5 | Dead-token pruning as an ongoing job | Read of provider feedback (410 / UNREGISTERED) + a write to prune | Token store keeps growing with dead entries and metrics quietly degrade | This is the job most teams build once and then forget to run. It needs an owner and a schedule, not a one-time script. |
| 6 | Silent/background push for data sync | Write required; explicitly best-effort and throttled | App syncs on next foreground open instead | Last, because it is the most fragile and OS-throttled category. Never make silent push the only path that keeps critical data current. |
| 7 | Rich and interactive notifications (media attachments, actions, notification service extensions) | Write + a service extension on the client | Falls back to plain text notification | Polish layer. Sequence it last because it adds client-side surface area (a notification service extension process) without which the first six rows already work. |
A note on ownership, since this is the part that most often gets left implicit: dead-token pruning, retry/backoff tuning, and trust-store currency (the APNs certificate lesson from earlier) all need a named owner and a recurring cadence, not a one-time build task closed out in a sprint. Push infrastructure that works perfectly at launch degrades quietly over the following twelve months if nobody is assigned to watch it — and by the time delivery metrics visibly drop, the underlying cause (a growing dead-token share, a stale trust store) has usually been accumulating for months.
Two operational controls belong in the architecture from the start rather than bolted on after the first complaint. Per-device rate limiting caps how many notifications a single device can receive in a rolling window regardless of how many separate features want to send one — without it, a busy day can stack a game invite, a marketing campaign, and a re-engagement nudge into the same five minutes, and the user's first response is to open Settings and disable your app entirely rather than dismiss three notifications. Quiet-hours suppression, timezone-aware per user rather than server-timezone-aware, holds non-critical sends until a reasonable local hour; it should never apply to the transactional category from the table above, where a security alert arriving at 3 a.m. local time is the point, not a bug.
If you're scoping this work through a formal RFP process rather than a direct engagement, our mobile app RFP template guide covers how to specify token-lifecycle and delivery-reliability requirements precisely enough that competing proposals are actually comparable, rather than all claiming "push notifications included" at wildly different levels of engineering rigor.
What This Looks Like in Practice
GameOn, a Frenchy Digital client, is a social sports app connecting players for pickup basketball, soccer, and tennis games, built on React Native with Firebase as its backend. Real-time notifications are a named feature in the delivered product — game invites, player confirmations, and schedule changes — which puts it in the transactional category from the order-of-build table above, not the marketing category.
That categorization drove real architectural decisions. A pickup-game invite that arrives ten minutes late is close to worthless — the game has either filled or the window has passed — so the acceptable latency budget for that specific notification type is measured in seconds, not the "eventually" that a marketing push can tolerate. Firebase Cloud Messaging was the natural choice specifically because the app needed unified delivery across iOS and Android from a single React Native codebase, and FCM is the transport most cross-platform SDKs already route Android traffic through regardless of vendor choice — building a second, separate Android pipeline would have added engineering surface area with no corresponding benefit.
We describe only what the public case study documents: GameOn has surpassed 50,000 active users and holds a 4.8-star App Store rating, and real-time notifications for game coordination are listed among its delivered features. We do not have — and the case study does not claim — a specific push delivery rate or open rate for the app, and we are not inventing one here; if you want that number for your own system, the baseline-measurement step in the order-of-build table above is how you get it honestly.
Red Flags in Vendor Selection
| Claim | Reality |
|---|---|
| “We guarantee delivery” | No push provider can guarantee delivery to a device. OS-level throttling, Low Power Mode, force-quit and Background App Refresh settings all sit outside any vendor's control — this is documented by both Apple and Google, not a limitation any vendor has fixed. |
| A quoted industry-average opt-in or open rate with no denominator | Three 2025-2026 vendor benchmark reports (Airship, Batch, Pushwoosh) publish different ‘industry average’ iOS opt-in rates from their own customer bases, with no shared methodology. Ask for the denominator and the sampling method before you repeat any of these numbers internally. |
| “HIPAA-compliant push notifications” as a software property | HIPAA obligations attach to covered entities and business associates under a signed BAA, not to software in the abstract. Separately, lock-screen previews are a well-known PHI leak vector regardless of vendor — content in a push payload can appear on a locked device. |
| No named answer on dead-token handling | If a vendor's own documentation never mentions pruning tokens from APNs feedback or FCM's UNREGISTERED response, that is a sign they have not operated a token store at fleet scale. Ask directly how stale tokens are detected and removed. |
| “Real-time” silent push marketed as guaranteed background sync | Apple's own documentation describes silent push as an opportunity, not a guarantee, and states the system throttles it dynamically based on battery, network and usage. Never architect a system where silent push is the only path that keeps critical data current. |
| Certificate-based APNs called ‘insecure’ or ‘broken’ | It still functions over HTTP/2 today. It is legacy and worth migrating off of, but calling it broken overstates the case and can lead a team to skip due diligence on the token-based migration itself. |
| No answer on retry and backoff behaviour | Ask specifically what happens when APNs or FCM returns a transient error (a 5xx from APNs, or FCM's UNAVAILABLE): silent drop, immediate retry, or exponential backoff with a dead-letter path. Vendors that cannot answer this precisely have not load-tested their own failure paths. |
What This Costs, and Its Limits
| Engagement | Range | Timeline | Typical Scope |
|---|---|---|---|
| Discovery + infrastructure audit | $9k–$22k | 2–4 weeks | Token lifecycle review, delivery and dead-token baseline, consent posture audit, platform migration risk check (certificate roots, legacy API references) |
| Single-platform push infrastructure build | $28k–$70k | 4–9 weeks | One properly engineered send pipeline covering iOS and Android: token lifecycle, retry and dead-letter handling, delivery confirmation, monitoring |
| Multi-platform orchestration with segmentation and analytics | $70k–$180k | 9–16 weeks | Cross-channel orchestration (push, email, SMS), consent-gated audience segmentation, A/B testing infrastructure, vendor migration if applicable |
| Enterprise / regulated build (audit logging, CMP integration, compliance posture) | $180k–$420k+ | 14–24 weeks | Consent-management-platform integration, full audit logging, documented compliance posture, multi-region delivery, penetration-test support |
One scoping note specific to this domain: the discovery phase for push infrastructure work should always include a migration-risk check for two specific artifacts — any code path still referencing FCM's legacy fcm.googleapis.com/fcm/send endpoint (dead since June 20, 2024) and any server trust store that has not been confirmed current against the certificate authority Apple rolled out in early 2025. Both are quick to check and expensive to discover in production instead.
For web-based delivery specifically — if part of your product is a progressive web app rather than a native install — the Web Push API sits on a related but distinct standard from APNs and FCM's native SDKs, with its own permission model and browser-specific quirks; that comparison is out of scope for this guide but worth reading separately before assuming native push patterns transfer directly to the browser.
Get Your Push Pipeline Audited in One Call
Book a free 60-minute discovery call with Frenchy Digital, a senior-led Black-owned Los Angeles agency. We baseline your token lifecycle and delivery pipeline and send a written, fixed-price phased proposal within 5 business days.
1517 S Bentley Ave Unit 204, Los Angeles CA 90025
Frequently Asked Questions
Sources & References
- 1Apple Developer News — APNs Server Certificate Authority Update (announced October 17, 2024)↗
- 2Apple Developer Documentation — Establishing a Token-Based Connection to APNs↗
- 3Apple Developer Documentation — Pushing Background Updates to Your App↗
- 4Apple App Store Review Guidelines — Section 4.5.4, Push Notifications↗
- 5Apple Developer Documentation — UNNotificationInterruptionLevel↗
- 6Android Developers — Notification Runtime Permission (API 33+)↗
- 7Android Open Source Project — Permission for Opt-In Notifications↗
- 8Android Developers — Create and Manage Notification Channels↗
- 9GitHub — appleboy/go-fcm Issue #38, quoting Google's FCM legacy API deprecation and removal dates↗
- 10Google Groups (Firebase) — Update Your Apps to the Latest Firebase Cloud Messaging APIs and SDKs↗
- 11AWS Documentation — Creating an Amazon SNS Platform Application for Mobile Push↗
- 12CNIL — Mobile Applications: CNIL Publishes Its Recommendations for Better Privacy Protection↗
- 13CNIL — Recommandation relative aux applications mobiles (Deliberation No. 2024-061, July 18, 2024)↗
- 14EDPB — Guidelines 2/2023 on the Technical Scope of Article 5(3) of the ePrivacy Directive↗
- 15California DOJ — Attorney General Bonta Secures $1.4 Million Settlement With Mobile App Gaming Company (Jam City, CCPA)↗
- 16FTC — FTC to Ramp Up Enforcement Against Illegal Dark Patterns↗
- 17Braze Investor Relations — Braze Reports Fiscal Year and Fourth Quarter 2026 Results↗
- 18DTCP Capital — Iterable Closes $200 Million in Growth Funding at $2 Billion Valuation↗
- 19PR Newswire — OneSignal Raises $50 Million in Series C Funding↗
- 20Airship — Company and Investor Overview (August Capital, Verizon Ventures)↗

