Solution guide · Mobile App

Building a Mobile App With Push Notifications People Actually Open: Cost, Timeline and Failure Modes

The short answer

Adding working push to an app you already have runs $15,000 to $60,000 over 3 to 6 weeks. A first release that includes push as a core loop runs $50,000 to $130,000 over 10 to 16 weeks. A full platform with segmentation, scheduling, multi-tenant sending and an ops console runs $150,000 to $350,000 over 6 to 12 months. The send itself is a two day job. Everything after "did it arrive and did anyone care" is where the money goes.

The send is easy. The operating system is the product risk.

Firebase Cloud Messaging accepts a token and a payload. Apple Push Notification service accepts a JWT and a device token. A Hello World notification lands on a test phone the same afternoon. That is what a two week quote covers. What it does not cover is that push is the only feature where the OS, not you, decides whether your work is seen, and where a bad month permanently lowers your ceiling.

A retail client ran a 40,000 device campaign at 9am. The dashboard said 40,000 accepted. Support said something different: several hundred users got the same notification four times inside ninety seconds. A worker fanned out sends, timed out at the HTTP layer after FCM had already accepted the batch, and the queue retried it. FCM did its job twice. Nothing in the code checked whether this notification for this user had already been dispatched.

The same campaign woke 6,000 devices belonging to users who had uninstalled months earlier, because nobody consumed the unregistration responses. Push fails by being ignored, and both platforms are watching. On iOS, users who swipe your notifications away without opening train the system to summarise or bury you. On Android, a channel a user mutes stays muted and your app cannot unmute it in code. There is no subject line that wins that audience back.

Token churn is database rot nobody quotes for

A device token is a lease, not an identity. It rotates on reinstall, on some OS upgrades, on restore from backup to a new phone, when a user clears app data on Android, and when FCM decides to rotate it. Across our deployments, roughly 20 to 35 percent of an active token table goes stale in a year on a normal consumer app, faster on apps with churn.

Model the token table as a many to many between users and devices, never a column on the user row. One user has an iPhone, an iPad and an old Android. One physical device may host two accounts if you allow account switching, which means logout must delete the token binding or the departing employee gets the new one's notifications. Register the token on every app foreground, not just first launch, and upsert on the token value.

Then consume the failure signals. FCM v1 returns UNREGISTERED and INVALID_ARGUMENT per message. APNs returns 410 Gone with a timestamp, and 400 BadDeviceToken. Each one is an instruction to delete the row. Log it and move on and your send volume inflates, your open rate denominator inflates, and every metric you steer by becomes fiction. APNs tokens are also environment scoped: a token minted against the sandbox gateway returns BadDeviceToken on production, which is why "it worked in TestFlight and broke on the App Store" is a launch day page. Store the environment alongside the token.

The permission prompt is a one shot asset

On iOS you get one system prompt per install. If the user taps Don't Allow, you cannot ask again in code. Your only move left is deep linking into iOS Settings, and almost nobody follows. Android 13 and above applies the same constraint through the POST_NOTIFICATIONS runtime permission, and two denials trigger the permanent don't ask again state.

In our delivery data, apps that fire the system prompt on first launch land opt in rates of 35 to 45 percent. Apps that show a custom pre permission screen explaining the specific value, and only call the system API for users who tap yes on the soft ask, land at 60 to 75 percent. The soft ask is retryable and the hard ask is not, so you spend the OS prompt only on users who already said yes once. That moves your reachable audience by roughly 30 points of your install base for about two days of engineering.

The second decision is Android notification channels. Since Android 8 every notification belongs to a channel the user controls independently. Dump order updates, marketing and chat into one default channel and the user who is sick of promos mutes all three, taking transactional delivery with them. Define channels up front and never merge them, because you cannot recategorise an existing channel after ship. You can only create a new one and lose everyone already opted into the old one.

Idempotency, fan out and the duplicate storm

The retail bug is structural. A push pipeline has at least three retrying layers: your job queue, your HTTP client, and the provider. Retries are correct behaviour, so duplicates are the default outcome unless you design against them.

Use a deterministic idempotency key per intended notification, typically campaign id plus user id plus a time bucket, written to a store with a unique constraint before the send and checked on every attempt. FCM supports collapse keys and APNs supports apns-collapse-id, which tell the provider to replace an undelivered notification rather than stack it, which is what a score update or a delivery ETA needs. Use both: the collapse id protects the user's lock screen, the idempotency key protects your pipeline.

Respect the rate reality. APNs over HTTP/2 wants one long lived multiplexed connection reused across sends, not a fresh TLS handshake per notification, and teams that get this wrong find out at 50,000 devices rather than 50. FCM's HTTP v1 API removed the old 1,000 device multicast, so a million device campaign is a million calls and the architecture must be a worker pool with backpressure, not a for loop. Handle 429 and 503 by honouring the Retry-After header.

Silent pushes are not a scheduler. content-available on iOS is a hint, budgeted against battery, Low Power Mode and how often the user opens your app, and Apple documents that undelivered ones are not queued beyond the most recent. If a feature depends on a silent push firing at a set time, that feature is broken and you find out when a customer's inventory sync is six hours stale.

Making them open it

A campaign sent at "9am" server time lands at 4am for a chunk of a US and Europe audience, and a 4am notification gets your channel muted rather than ignored. That means a per user timezone stored and refreshed on foreground because people travel, a scheduler that fans out per timezone bucket rather than firing once globally, and a quiet hours window enforced server side, because the client cannot be trusted to be awake.

Deep links have to survive cold start. The expensive way to waste a notification is to deliver it, win the tap, and dump the user on your home screen because routing only works when the app is warm. On iOS a tap on a cold app arrives through the launch options path, on Android through intent extras, and both need to reconstruct a back stack so the hardware back button does not exit your app. Test it with the app force quit, not backgrounded, because those are different code paths.

Frequency capping is the strongest long term lever we see on open rate: a hard cap of two to three non transactional notifications per user per week, enforced inside the sending service so no campaign owner can override it. Transactional and marketing need separate channels and separate caps, so a promo budget can never eat the delivery alert the user actually wanted.

Then instrument honestly. iOS gives you a delivery signal only through a Notification Service Extension that fires on receipt, or through aggregate reporting. Without that extension your open rate is opens over accepted, which flatters you by every stale token you never cleaned, and the extension is a line item.

What this costs and how long it takes

These are Digital Heroes bands from 2,000 plus delivered projects, not industry averages.

Push added to an existing app, both platforms, with token lifecycle, idempotent sending, channels, soft ask, deep linking and basic analytics: $15,000 to $60,000, typically 3 to 6 weeks. The spread is about what your app already has. No clean device model and no job queue means we build infrastructure before we build push.

Push as part of a first release, where the notification is the core loop: $50,000 to $130,000 over 10 to 16 weeks, including the scheduling service, timezone handling, preference centre and an internal console for whoever presses send.

A full platform with multi tenant sending, segmentation, campaign builder, A/B testing, per tenant rate isolation and an audit trail: $150,000 to $350,000 over 6 to 12 months.

What drives this capability's number up, in order of impact. Rich media with Notification Service and Content Extensions on iOS, because that is a second binary target with its own memory limit and signing. Per user timezone scheduling with quiet hours, which turns a cron into a distributed scheduler. Multi device and account switching. Regulated content, where a lock screen preview is a disclosure, so the payload carries an opaque id and the extension fetches the body only after unlock. And any requirement for guaranteed or auditable delivery, which push cannot provide and which forces an SMS or email fallback with its own dedupe logic.

When you should not build this

If you send fewer than roughly 100,000 notifications a month, your segmentation is "all users" or two or three simple lists, and push does not need to trigger custom in app state, do not build a sending platform. Use OneSignal, Firebase Cloud Messaging with Firebase In App Messaging, Braze or Customer.io depending on budget, and spend engineering only on the client integration, the soft ask and the deep links. You get the scheduler, timezone logic, frequency caps, delivery dashboard and compliance surface for less than one month of a developer's time.

That is the right call for a marketing led product, a content app, an ecommerce app, or any team where the person pressing send is not an engineer. For most companies asking this question, a managed sender plus two weeks of client work is the answer, and we say so on calls.

Build custom when one of these holds. Your notification content is derived from data you cannot export to a third party for legal or contractual reasons. Your sends are triggered by real time state in your own system and the round trip to a marketing tool adds latency you cannot afford. You are the platform and your customers send to their users, which makes the sender your product. Or your volume has pushed per message pricing past the fully loaded cost of running it yourself, which starts mattering in the millions of messages per month, not the thousands.

How to brief and vet a developer

Brief with numbers. Give them expected device count at 12 months, notification types split into transactional versus marketing, whether any single event fans out to more than 10,000 devices at once, whether users can have multiple devices or switch accounts, whether content is sensitive on a lock screen, and who presses send. Those six answers determine the architecture. Without them any quote is a guess.

"What do you do when APNs returns a 410?" If they do not say delete the token and mention the timestamp, they have never run a real token table.

"How do you ask for notification permission?" No soft ask before the system prompt means 30 points of your audience gone in the first session.

"How do you stop a duplicate send when the queue retries?" You want idempotency key with a unique constraint, and collapse id as a separate concept. "We use a reliable queue" is not an answer, because the queue's reliability is what causes duplicates.

"How do you schedule a 9am local notification across 14 timezones?" A single cron plus client side filtering means they have not shipped this.

"What is the difference between a notification your app builds and one iOS builds from the payload?" Anyone who has shipped rich push will name the Notification Service Extension, mutable-content, and the extension's short execution window and memory ceiling.

"Where do you store the token and what is its relationship to the user?" You want a devices table. A column on the users table is a stop signal.

"What is your delivered number measured against?" Someone who has shipped explains that accepted by APNs is not delivered, that true delivery on iOS needs an extension, and that most dashboards report accepted. Someone who has not will read you the dashboard number.

Research & sources

The evidence behind this guide

Independent findings on why this investment pays off. Every link goes to the primary source.

  1. The median annual wage for U.S. software developers was $133,080 in May 2024, and employment is projected to grow 15% from 2024 to 2034 - a core input to any in-house build-vs-buy TCO model. Source: U.S. Bureau of Labor Statistics (2024) →
  2. Standish's 2015 CHAOS research found roughly a third of software projects (about 36% by the Modern definition) fully succeed on time, on budget, and on scope, with top success drivers including executive support, user involvement, and clear requirements/business objectives. Source: Standish Group (CHAOS Report) (2015) →
  3. Acquiring a new customer is five to 25 times more expensive than retaining an existing one, and research by Frederick Reichheld of Bain & Company found that increasing customer retention rates by 5% increases profits by 25% to 95% - underscoring the ROI of support that keeps customers. Source: Harvard Business Review / Bain & Company (2014) →
  4. In Gartner's 2025 AI in Finance Survey of 183 CFOs and senior finance leaders (fielded May-June 2025), 59% reported using AI in their finance function, with accounts payable process automation adopted by 37% of respondents (the second-highest single use case, behind knowledge management at 49%). Source: Gartner (2025) →
Rohan Malhotra · Enterprise Software Consultant

Rohan advises mid-market and enterprise teams on ERP, CRM and custom software, and has led delivery on dozens of business-software builds.

Writes for Digital Heroes, shipping business software for 2,000+ brands across 55+ countries since 2017.

FAQ

Frequently asked questions

How much does it cost to add push notifications to an app we already have?
$15,000 to $60,000 for a proper build on both platforms, typically 3 to 6 weeks. That covers device token lifecycle, idempotent sending, Android channels, a soft ask permission flow, cold start deep links and analytics. The low end applies when your app already has a clean device model and a job queue. The high end applies when we build that infrastructure first, or when you need rich media and a Notification Service Extension.
How long does it take to build a mobile app with push notifications from scratch?
10 to 16 weeks for a first release where push is a core part of the product. That band includes the app, the sending service, timezone aware scheduling, a preference centre and an internal console for whoever presses send. If push is a secondary feature on a simple app you can compress to 8 weeks, but the permission and deep link work does not compress much because it is testing bound, not code bound.
Can you add push notifications to our existing app without rewriting it?
Almost always yes, and the integration is not the risk. The risk is your data model. If device tokens have to move into a many to many devices table because you currently store one token per user, that migration touches auth, logout and account switching. Budget a one week discovery to look at your device model and queue before anyone gives you a number.
We have a $20,000 budget. What can we realistically get?
A solid single purpose push integration on both platforms: token registration and cleanup, transactional sends triggered by your backend, a soft ask permission flow, Android channels done right, and deep links that work from cold start. What you do not get is a campaign builder, per user timezone scheduling or A/B testing. Pair the $20,000 build with OneSignal or Customer.io for the marketing side and you cover most of what a $60,000 custom build would give you.
Is $150,000 justified for push notifications, or are we being oversold?
At $150,000 and up you should be buying a platform, and only if your customers send notifications to their users, your volume is in the millions per month, or your content legally cannot leave your infrastructure. If none of those are true, that quote is oversold. Ask the vendor to show which line items exist only because of your specific constraint. If they cannot, use a managed service.
Should we use OneSignal or Firebase instead of building our own?
Yes, if you send under roughly 100,000 messages a month, your segmentation is simple, and a non engineer presses send. You get scheduling, timezone logic, frequency caps and delivery reporting for less than one month of engineering. Build your own when the sending is your product, when your content cannot be exported to a vendor, or when per message pricing exceeds your run cost, which starts mattering in the millions of messages.
What breaks at scale with push notifications?
Three things. Stale tokens accumulate at 20 to 35 percent a year and inflate every metric until your open rate is fiction. Queue retries produce duplicate sends unless you have a deterministic idempotency key with a unique constraint, and users get the same alert four times. And a fresh TLS connection per APNs message instead of one reused HTTP/2 connection collapses throughput somewhere north of 50,000 devices, which you never see in testing.
Why do so few of our users get our notifications?
Usually because you asked for permission wrong and your token table is dirty. Apps that fire the iOS system prompt on first launch land 35 to 45 percent opt in, and iOS never lets you ask again after a decline. Apps that show a custom explanation first and only call the system API for users who say yes land 60 to 75 percent. Add stale tokens you never deleted on a 410 or UNREGISTERED response and your reachable audience is far below what your dashboard claims.
Can you guarantee a notification gets delivered?
No. APNs and FCM accept a message, they do not promise delivery, and both drop or throttle silent pushes based on battery and app usage. If your use case requires a guaranteed or auditable notification, plan an SMS or email fallback with its own deduplication and treat push as the fast path rather than the only path. Any vendor who says otherwise has not read Apple's documentation on it.
How do I vet a mobile app development agency before signing?
Ask for three apps they built that are live in the stores right now, then download them and read the recent reviews yourself. Ask exactly who will work on your project, because some agencies sell with senior staff and deliver with juniors or subcontractors, and request one past client you can call. An agency that stalls on any of those three requests is answering your question.
How long does it take to build a custom web or mobile app from scratch?
Plan on 8 to 16 weeks for a focused first version and 4 to 9 months for a larger platform, which is the typical spread across Digital Heroes builds. The first 2 to 3 weeks go to discovery and design before any production code ships. The two things that stretch timelines most are integrations with legacy systems and slow feedback from your side, not developer speed.
What does it cost to keep custom software running after launch?
Budget 15-20% of the original build cost per year, which on a $100,000 system means $15,000 to $20,000 for security patches, dependency updates, bug fixes, and small improvements as real usage reveals what the spec missed. Cloud hosting for a typical business application adds $50 to $300 a month on top. Skipping maintenance does not save the money; in Digital Heroes rescue work, unmaintained systems typically need a far more expensive rebuild within about three years.
Can we migrate years of data out of our current system into new custom software?
Almost always yes, through CSV exports or the vendor's API, and migration should be scoped as its own workstream with field mapping, a dry run, and a planned cutover window rather than an afterthought. The real time sink is rarely moving the data; it is cleaning it, since years of duplicates, free-text fields, and inconsistent formats surface all at once. Pull a full export from your current vendor before committing to anything new, because some SaaS plans restrict exports on lower tiers.
Why do agencies charge for a discovery phase instead of quoting for free?
Because an accurate quote requires real work: mapping your workflows, finding the edge cases, and writing a specification, which typically takes 1 to 3 weeks and costs $2,000 to $10,000 at Digital Heroes depending on system complexity. You leave discovery owning a written spec and a fixed price you can take to any vendor, so the money is not locked into one agency. Free estimates are guesses, and the guess usually becomes your budget overrun six months later.
Can I move my users and data off a no-code platform into a custom app?
Your data can move, but your users' passwords cannot. Platforms like Bubble let you export records through CSV files or their API, but password hashes never leave the platform, so a migration needs a password reset or email login flow for every existing user. Plan the export before you hit the platform's pricing or capacity ceilings, because migrating under pressure is how data gets lost.
Is buying a template app from CodeCanyon cheaper than hiring a developer?
Upfront, yes: templates sell for $30 to $200 against tens of thousands for custom work, but the total cost often flips within the first year. Templates commonly arrive with outdated dependencies, no ongoing updates, and code you cannot inspect before buying, and heavy customization of someone else's codebase can cost more than building clean. They are fine as a throwaway prototype and a poor foundation for an app your revenue depends on.
Who owns the source code when an agency builds my app?
You should own the source code outright, and the contract must say it plainly with an intellectual property assignment that transfers ownership on final payment. Watch for agreements that only license the code to you, keep it in the agency's repository, or register the Apple and Google developer accounts under the agency's name. Insist on code delivered into a repository you control from week one, not at final handover.
Keep reading
let's build

Build something worth launching.

A plan, a team, a timeline, within 24 hours. No decks, no discovery calls. Tell us what you're building and we'll come back with a real scope and a real number.

message us directly · we reply within one business day

mission briefing

Monthly dispatch

Playbooks, real build costs, and what we're shipping. One email a month. No fluff.

visit us

New York HQ

1140 Broadway, Suite 704 · New York, NY 10001

Get directions
Online now

Hey there 👋 How can we help you today?