Mobile app development

Mobile apps: where shared code stops, what year one costs

Most of what a mobile app costs arrives after the build is signed off. That is year one, and it is what your app costs you to own.

Start with your app

One reply from a software engineer, within one business day.

How we handle what you send is set out in our privacy notice.

Two things set that number. The first is which surfaces in your app a shared codebase can carry and which ones it cannot. The second is what Apple and Google charge you and require of you every year. We will answer both for your app before you commit to anything.

Every figure below comes from Apple, Google, a signed public contract, or a software engineering team that published what happened to them. Each one names its source, and most carry a link.

If the honest answer is that we are not the right firm for this app, you will get that answer instead of a pitch.

Before anything else

Three times we are the wrong firm for this app

We would rather you found this out in the next thirty seconds than in week six.

  • If the core value of the app is iOS-native craft, a Swift team that already exists is the better call. Talk to one first. We would be assembling that team for your engagement rather than bringing one that has worked together for years. Nothing on our record says otherwise and we are not going to imply that it does.
  • If you need people on this on Monday, we are not it. We do not keep a mobile bench sitting idle waiting for work, so a mobile team here is put together for the engagement. That is honest, and it takes weeks rather than days.
  • If the answer you have already settled on is Flutter, we have nothing on the record and will not pretend that we do. Ask the firms who can show you Flutter apps they shipped.

There is one place we would push back on the premise instead of walking away. If what the job actually needs is the mobile web, install-free, works offline, quick on a cheap Android handset, that is where our depth genuinely sits. How we tune apps under real device and network load, and our commerce work, are the better read for that. And if the real first step is to launch a market-ready MVP in weeks, or the multi-tenant SaaS backend that sits behind the app, meaning one system that serves every customer while keeping each one's data separate, those are separate reads too.

Who is reading this

Two situations. Building a first mobile app, and running the one you already have. What is at risk for you personally is not the same as what is at risk for the company.

Two situations: building, or already running

  • Not built one yet

    You have already given someone a date, and you cannot verify progress.

  • You already run one

    You vouched for this vendor, and you carry the 2am pager either way.

If you have not built one yet, that someone is an investor, a board, a franchise network, or a launch partner. You cannot verify a single thing a vendor tells you about progress. If it slips, it reads as your judgement failing rather than theirs. A fintech founder put it to Pocketworks like this: we are tearing our hair out because the app has taken much longer than expected and there is no end in sight. The other thing people find late is in the contract. Ptolemay, an agency itself, publishes its standard clause: agency retains rights to source code unless otherwise agreed in writing.

If you already run one, the quieter worry is being made slower by the help. You spend your own review time cleaning up work you paid for. One line from someone in that seat, and one from a vendor describing its own onboarding. On Hacker News: iOS platform missed the marketing launch, but Android made it through. Coders.dev, an agency, publishes this about handover to a new vendor: simply providing a login and code repository access leads to slow ramp-up times and a cycle of rework that erodes trust and ROI.

The boundary

Where one shared codebase stops, surface by surface

Everyone will tell you a shared codebase saves thirty to forty percent. Almost nobody tells you the conditions under which it stops being the right answer. Airbnb moved off React Native in 2018, and Gabriel Peal was specific about why. Large amounts of bridging infrastructure were required. They ended up supporting code on three platforms instead of two. Initialisation, he wrote, takes several seconds for an app of our size, even on a high-end device. That was a brownfield app in 2018, and both of those facts matter.

Surfaces where shared code stops carrying the work, from first-party software engineering write-ups.
Surface in your appWhat breaks when it is sharedWho documented it, and when
Long, high-churn lists: feeds, chat, cataloguesScroll performance and memory under real data volumesAirbnb 2018, Discord 2019, and Shopify, which built FlashList to fix it between 2022 and 2025
Device hardware: cameras, 2D and 3D scanning, on-device modelsLatency, and platform APIs with no shared equivalentShopify software engineering, 2025
OS-surface extensions: home and lock screen widgets, Watch apps, App Intents, Siri ShortcutsThese run outside your app process, so shared code cannot reach them at allShopify software engineering, 2025
Offline-capable background sync, as in point of saleSync has to keep running when your app is not on screenShopify software engineering, 2025
Cold start and first renderThe startup cost of the shared runtime is paid on every single launchAirbnb, Gabriel Peal, 2018

Shopify moved an app of roughly three hundred screens, and its Point of Sale product, onto React Native, and reports P75 screen loads, meaning the slowest quarter of users, under 500 milliseconds and better than 99.9 percent crash-free sessions. They got there by building FlashList and react-native-skia themselves, and they still write native code for hardware, widgets, Watch apps and background sync. Coinbase reached 100 percent of its iOS users on React Native by January 2021, and did it by starting fresh rather than bolting the framework onto an app that already existed. So this is a finding about where and how shared code is introduced. It is not a finding that the framework is bad.

Which means the question to put to the next firm that quotes you is not native or cross-platform. It is: which of these five surfaces does my app actually have, and what will you write natively for each one.

The running line

What it costs to run one app for a year, before any software engineering

Before an hour of software engineering, keeping one app alive on both stores for a year costs 964 US dollars at list price. That is taken from the published prices of Apple, Google, Sentry, OneSignal and Supabase. Every step below is a vendor's own published price.

Show data table
Year-one running cost at list price. Every one of these is a base fee. Metered usage on Sentry events, OneSignal monthly active users and Supabase compute all sit on top of this line and never below it.
Step Change Running total
Starting point 0 USD 0 USD
Apple Developer Program 99 USD 99 USD
Google Play registration (one-time) 25 USD 124 USD
Crash reporting (Sentry Team) 312 USD 436 USD
Push (OneSignal Growth base) 228 USD 664 USD
Backend hosting (Supabase Pro) 300 USD 964 USD
Year one total 964 USD

964 USD is a floor for a year, not an estimate of one.

Year-one running floor, one app, both stores Year-one running cost at list price. Every one of these is a base fee. Metered usage on Sentry events, OneSignal monthly active users and Supabase compute all sit on top of this line and never below it. developer.apple.com/support/compare-memberships; support.google.com/googleplay/android-developer/answer/6112435; sentry.io/pricing; onesignal.com/pricing; supabase.com/pricing

Take the free route for crash reporting and push, which is Crashlytics, Firebase Cloud Messaging and Google Analytics for Firebase, and the same year comes to 424 US dollars. The backend line stays in either way, because none of those three replaces it. Store commission sits outside all of this and it is a rate rather than a line item: 15 percent under Apple's Small Business Program if you enrol and qualify, 30 percent otherwise, and 15 percent on the first million dollars under Google Play's service fee tiers.

The rule of thumb

Annual support is not a percentage of your build

You probably arrived with a rule: fifteen to twenty percent of the build cost per year for maintenance. Across the seven we can show you, the annual support line ran from 6.6 percent to 183 percent of the build. Not one of them landed inside that band. Across the three that are pure mobile-app work and high confidence, the ratios were 6.6, 35.0 and 60.0 percent, with a median of 35.0.

Annual support as a share of build cost9x apart

6.6%

Michigan State Police, custom build

60.0%

City of Mauston, templated build

Nine times apart, and neither one lands inside the fifteen to twenty percent rule.

Annual support as a share of build cost (Share of build cost)
OptionShare of build cost
Michigan State Police, custom build6.6%
City of Mauston, templated build60.0%

Both are signed public contracts. Each ratio is the annual support fee divided by the one-time build cost, taken from the contract documents themselves: Michigan DTMB contract 071B6600092, and the City of Mauston, Wisconsin award. The Michigan State Police contract was a custom build at 325,200 USD. The City of Mauston, Wisconsin contract was a templated build at 7,490 USD. The gap is not the size of the build. The clearest reading of it comes from Nixa, Missouri, which priced three competing vendors on identical scope inside one procurement document. Their maintenance ratios were 9.4 percent, 13.6 percent and 67.7 percent. Same scope, same document, a sevenfold spread. So the ratio is a vendor pricing decision, not a property of the software you are buying. The 183 percent figure at the top of the range, Owego Apalachin school district, is a whole-platform annual fee rather than app maintenance on its own, which is why it is described here and not drawn beside the other two.

We are not going to publish a build price band. We could not trace the widely repeated 171,450 dollar average to any source that is not an agency selling builds. Try it yourself. We start with a small paid first phase that settles the boundary question for your app. Then a build quoted against what that phase actually found. Then the annual platform work as its own standing line. We write the build and the annual support into our agreements as two separate signed numbers, and from day one every line of code is yours. Send us the hard part of your app if you want the first phase scoped.

The store clock

A finished build and an installable app are not the same date

You have probably already promised the second date to somebody. Google publishes the clock for the first one. For a brand new personal developer account, the shortest published path runs about four weeks. That is from a ready build to an app the public can install.

Show data table
Google Play, new personal developer account, every point published by Google. Google requires 12 testers and 14 continuous days of closed testing before it grants production access. An organisation account does not carry the closed-testing requirement, so this is the personal-account path only.
Stage Days from a ready build to an installable app
New personal account, build ready 0 days
Closed test complete, 12 testers 14 days
Production access granted 21 days
Extended app review complete 28 days

Open the store accounts before the build starts, not after it finishes.

Google Play lead time, new personal developer account Google Play, new personal developer account, every point published by Google. Google requires 12 testers and 14 continuous days of closed testing before it grants production access. An organisation account does not carry the closed-testing requirement, so this is the personal-account path only. support.google.com/googleplay/android-developer/answer/14151465; support.google.com/googleplay/android-developer/answer/9859751

Apple runs a review rather than a waiting period. In its 2024 App Store Transparency Report, Apple rejected 1,931,400 of 7,771,599 submissions, roughly one in four. Performance was the largest single reason at 1,235,471. Of the 1,931,400 rejections, 295,109 were approved later after a fix. That is roughly 15 percent, so about 85 percent were not approved after a fix in the same report. Budget a rejection as a date you lose, not a delay you absorb.

The annual line

Two dated gates land every year, whatever you built

From 28 April 2026, anything uploaded to App Store Connect has to be built with Xcode 26 or later, and the iOS 26 SDK, the toolkit Apple requires you to build with, goes with it. Apple announced that on 3 February 2026, which is about twelve weeks of notice, and publishes no way to ask for more time. Google Play's target API level gate, the Android version your app declares it is built for, falls on 31 August every year. That was Android 15 in 2025 and it is Android 16 in 2026. Exactly one extension is available, to 1 November, and nothing after that.

Show data table
Share of all devices on each iOS generation, as Apple measured it on 7 June 2026. This is one measurement on one date. Apple publishes no series, so nothing here should be read as a direction of travel.
Segment Value (%) Share Source
iOS 26 79 79% developer.apple.com/support/app-store/
iOS 18 14 14% developer.apple.com/support/app-store/
Earlier releases 7 7% developer.apple.com/support/app-store/

Roughly one device in five is on an older iOS while your build is being pushed onto the newest SDK.

iOS generations in use, measured 7 June 2026 Share of all devices on each iOS generation, as Apple measured it on 7 June 2026. This is one measurement on one date. Apple publishes no series, so nothing here should be read as a direction of travel. developer.apple.com/support/app-store/

That gap is the entire reason the annual line exists. Missing Apple's SDK gate or Google's submission gate stops you shipping updates while the app stays discoverable and installable. Google's separate rule for existing apps is the one that removes it from search and from new installs.

The bar

Google sets the definition of done on Android, and enforces it

Google publishes these thresholds, judges them on the last 28 days, and enforces them against your store listing. Both numbers below are Google's floor for bad behaviour, not a target. We hold a build well under them.

1.09%User-perceived crash rate, all devices

Google Play Console Help, Android vitals

0.47%User-perceived ANR rate, all devices

Google Android vitals documentation, developer.android.com/topic/performance/vitals/anr

*Disclaimer: An ANR is the app freezing until Android offers to close it. Above either rate, Google Play treats the app as bad behaviour. The limit on any single device model is 8 percent, for both.

Google states the consequence in its own words: an app over a threshold is likely to be less discoverable on Google Play, and in some cases a warning may be displayed on your app's store listing to set user expectations and provide the option to seek out alternatives with higher technical quality. We write both into our own contracts as terms. If you already have an app, you can pull them out of Play Console tonight and find out where you stand before you talk to anyone.

What we can show you today, and what we would be building for you.

What we can show you today

  1. Shipped, open and public

    Mobile web at production scale

    ReactPWA and PawJS are ours, open source, and you can read the code tonight. ReactPWA sits above 2,500 stars and PawJS above 150, with nine example integration repositories beside them.

    What you can check

    The two repositories on our GitHub organisation, plus nine example integrations

  2. Capability only

    Kotlin, Java and React Native

    We have built Kotlin Android apps, Java Android apps and React Native cross-platform work, mostly around IoT integrations. Those sit inside the native and cross-platform stacks we build on. Treat it as capability and nothing more.

    What you can check

    No public specimen exists, and we would rather say that than dress it up

  3. Built on demand

    We have assembled a specialist team before

    That is the precedent for how a mobile team would be put together for you. It is not a claim that a mobile bench already exists, because it does not.

    What you can check

    The seven-person Magento team for that enterprise client, published on our for-enterprises page.

  4. What we commit to

    The estimate and the date

    Our estimate is real once you sign off. Firm-wide, we have delivered 100 percent on time against agreed scope since 2015, with every change flowing through a documented change note.

    What you can check

    Our FAQ and the delivery terms on our why-trust page. It is firm-wide, and we do not narrow it to mobile, having no mobile record.

On the first row: offline behaviour, first render on a slow handset, and the line between a web app and a native shell. That is where our knowledge of this actually comes from.

Both repositories are public, so read them rather than take our word for it: ReactPWA on GitHub and PawJS on GitHub.

On the second: we are attaching no client, no date and no outcome to that Kotlin, Java and React Native work. None of it sits on a record we are free to publish.

On the third: a global industrial-automation enterprise client could not source Magento expertise at the speed it needed. So we formed a seven-person team for that engagement out of our broader software engineering practice.

On the fourth: that on-time figure covers the whole firm. We are not narrowing it to mobile, because we have no mobile record to narrow it to.

Questions people ask before the first call

Have you shipped native iOS apps?
No, and we are not going to imply otherwise. Nothing on our public record carries a Swift, SwiftUI, iOS-native or Objective-C claim. Our mobile-native work in Kotlin, Java and React Native has no client, no date and no outcome we are free to publish. If the core value of your app is iOS-native craft, a Swift team that already exists is the better call, and we say so before we ask you for anything.
What does it cost to keep a mobile app running for a year?
964 US dollars at list price, before an hour of software engineering. That is the Apple Developer Program, the Google Play registration, and the published base fees for Sentry, OneSignal and Supabase. Every one of those is a base fee and metered usage sits on top of it, so treat 964 as a floor for a year rather than an estimate of one.
Is annual maintenance really fifteen to twenty percent of the build?
Not in any signed contract we could find. Across seven public procurement contracts the annual support line ran from 6.6 percent to 183 percent of the build, and not one landed inside that band. Across the three that are pure mobile-app work the ratios were 6.6, 35.0 and 60.0 percent, median 35.0. In Nixa, Missouri, three vendors priced identical scope inside one document at 9.4, 13.6 and 67.7 percent. The ratio is a vendor pricing decision, not a property of the software you are buying.
How long does it take to get a new app into the stores?
On Google Play from a personal account, 28 days before you can ship to production: the closed test with 12 testers runs 14 days, then production access, then review. Those are Google-published figures. Apple runs a review rather than a waiting period, and in its 2024 Transparency Report it rejected 1,931,400 of 7,771,599 submissions, roughly one in four. Budget a rejection as a date you lose, not a delay you absorb.
We already have an app and it is struggling. Can you help with that?
Yes. Rebuilding and rescuing an app you already run is half of what we do, whether that means keeping going, rebuilding, or bringing someone else in. The boundary question is the same either way: which surfaces your shared codebase can carry and which need native code. Tell us the hard part of your app and you get that read in writing.
What quality bar does Google hold an Android app to?
Google judges the last 28 days against a user-perceived crash rate of 1.09 percent and a user-perceived ANR rate of 0.47 percent, where an ANR is the app freezing until Android offers to close it. Both are Google-published floors for bad behaviour rather than targets, and an app over them is likely to be less discoverable on Play. We hold a build well under them.

Tell us the hardest thing your app does

The first thing we will answer is where a shared codebase stops on your app.

Send the two or three surfaces that worry you. Offline use, a camera or a scanner, background sync, widgets, a Watch app, payments, or a codebase you already have and would want us working inside.

You get back a written read, worked from the same surface table above against your app. It says which of those a shared codebase can carry for you and which ones need native code. It says what that does to the running line you saw above. And it lists the questions we would want answered before anybody quotes you a build.

If it turns out you need a native-first specialist, we will tell you that and tell you what to look for. That answer costs you nothing and it is the same answer we would give a friend.

Tirth BodawalaFounder, Atyantik Technologies
  • One reply from a software engineer within one business day, not a sales sequence.
  • No quote before the boundary question is answered, because a number given before that would be for a different app.
  • Build cost and annual support quoted as two separate numbers, every time.

We reply to everything that comes in. If we are not the right firm for it, you will hear that rather than nothing. You can also read who builds it: the Atyantik software engineering team.

How we handle what you send is set out in our privacy notice.