PutThrough Product engineering studio
Book a build call

Service 04

Mobile app development

A mobile app is not a website in a shell. The platform work is most of the work, and it starts on day one.

Prefer to write? Send your requirements

A new mobile application, or a substantial addition to one you already have. We build for both stores at once and treat the compliance surface as part of the build rather than a surprise at submission: SDK floors, privacy declarations, entitlements and the review guidelines that decide whether you ship at all.

Build

  • React Native and Expo, Flutter, or native Swift and Kotlin
  • Navigation, offline behavior and poor-network handling
  • Local storage, sync and conflict resolution where it is needed
  • Accessibility: dynamic type, screen reader labels, contrast and focus order

Platform

  • Push notifications, wired to your backend and tested on devices
  • Deep links and universal links that open the app, not the browser
  • In-app purchases and subscriptions, including restore and refunds
  • Biometrics, camera, location and the permission flows around them

Release

  • Signing, provisioning and release tracks on both stores
  • Android target API 36 and current iOS SDK compliance
  • Privacy manifests, data-safety answers and age ratings
  • Staged rollout, and a release you can run yourself afterwards

Afterwards

  • Crash reporting and release health monitoring
  • A written release runbook for your team
  • Store deadline tracking, if you take a care retainer

Built with

  • React Native
  • Expo
  • Flutter
  • Swift / SwiftUI
  • Kotlin / Jetpack Compose
  • App Store Connect
  • Google Play Console

What this is not

  • Store approval is not guaranteed and cannot be. Apple and Google decide. We handle everything on our side and keep responding until the app is through or the remaining objection is one only you can answer.
  • Developer account fees, store artwork and app design are yours.
  • Not games. Real-time rendering and game engines are a different discipline and we would be the wrong studio.

01Self-assessment

Signs this is the work you need

Things that are either true of your situation or not. The first one is the question worth answering before any of the others.

  • The product does something a browser genuinely cannot — notifications, offline use, camera, location, biometrics, background work.
  • Your users are on their phones in a context where opening a browser is the wrong interaction.
  • You need to be in the stores for distribution or credibility reasons, and you have accepted what that means.
  • You have a backend already, or you have budgeted for one, because push and account deletion both need a server.
  • You know what the app should do without a connection, and you have an opinion on whether people can edit offline.
  • You will sell something inside the app, and you know whether it is digital or physical.
  • You have designs, or you accept a plain interface assembled from platform components.
  • You have a launch window rather than a launch date, because store review is measured in days and can repeat.

02Approach

How we approach it

The platform is a participant, not a target

Web software ships when you decide it ships. Mobile software ships when Apple and Google agree, against rules that change on a published schedule and are enforced by a mix of automation and human reviewers. That single difference reshapes how a project should be run.

It means compliance cannot be a phase at the end. What data you collect, which APIs you call, whether people can delete their account, which SDK version you build with — these are architectural facts that are expensive to discover during submission and cheap to design around at the start.

It also means the release cadence is slower and the cost of a bad release is higher. You cannot hotfix a native binary the way you push a web deploy; you submit, you wait, and meanwhile your users have the broken version. That argues for staged rollouts, real crash reporting, and keeping as much changeable logic as the rules allow on the server or in over-the-air updates.

Offline is a product decision priced as an engineering one

Every mobile app has to answer what happens on a train. The cheap answer is graceful degradation: the app explains itself, retries sensibly, and does not hang or lose what you typed. Reviewers actively test on a poor connection, so this is not optional.

The expensive answer is full offline editing with sync. That is not a library you add — it is a set of product decisions about what happens when the same record is edited in two places. Last-write-wins is simple and loses data. Field-level merging is better and more work. Showing the user a conflict is honest and requires interface design.

We price these very differently and we would rather you chose deliberately. A large share of mobile budget overruns come from "it should work offline" being agreed in a sentence and discovered to mean the third option.

Notifications are a backend feature wearing a mobile costume

Push is one of the most commonly underestimated parts of a mobile build, because the app-side integration is the small half. The real work is on the server: deciding what is worth interrupting someone for, storing device tokens and cleaning up dead ones, handling per-user preferences and quiet hours, batching so a busy account is not notified forty times, and dealing with the fact that delivery is best-effort and silent failure is normal.

Get this wrong and the visible symptom is not a crash. It is users turning notifications off, which is effectively irreversible, and then churning quietly.

Accessibility is cheap early and expensive later

Dynamic type, screen reader labels, sufficient contrast and a sensible focus order cost very little when the components are being written and a great deal when they are being retrofitted across sixty screens.

On mobile it is also more visible than on the web: people use phones one-handed, in sunlight, with larger text set at the system level. An app that breaks when someone increases their font size is broken for a substantial share of users, not an edge case.

03Choices

Decisions you will have to make

React Native, Flutter, or native?

React Native with Expo
One codebase, a JavaScript team, and access to real native modules. Over-the-air updates for JavaScript changes reduce the pain of the review loop.
Flutter
You want a highly consistent custom interface across platforms and are comfortable with Dart, or you have an existing Flutter team.
Native Swift and Kotlin
The product is the platform experience: sustained background work, heavy animation or graphics, deep OS integration, or platform features on the day they launch.

Where we start React Native with Expo unless something specific argues against it. Two codebases cost roughly twice as much to maintain forever, and that bill outlasts whatever prompted the decision.

Both platforms, or one first?

Both together
You are cross-platform anyway. The marginal cost is mostly compliance rather than code.
One first
Your audience is genuinely lopsided, or budget forces a smaller first bet. Pick from your own analytics, not from general market share.

Where we start Both, built together and submitted together. Splitting means doing the compliance thinking twice and discovering platform differences late.

How do you authenticate on a device?

Managed provider with secure token storage
Almost always. Tokens in the platform keychain, refresh handled, biometric unlock as a convenience over the top.
Bespoke session handling
An unusual requirement no provider supports, accepted with its maintenance cost.

Where we start Managed, with tokens in the keychain rather than in plain storage, and a refresh path that behaves sensibly when the device has been offline for a week.

Where does business logic live?

On the server
Anything you may want to change without a release. Pricing, limits, feature availability, content.
In the app
Genuinely local concerns: rendering, gestures, offline behavior.

Where we start Server, wherever the rules allow. A native binary changes on the stores’ schedule, not yours, so logic baked into it is logic you cannot fix this week.

04Price

What a mobile build actually costs, and why

Quoted after scoping rather than published, for the same reason as web work. These are the factors that genuinely move a mobile number, roughly in order of impact.

How it is priced Quoted after a scoping call, as a fixed price against a written scope. Store submission and the first review cycles are included in that number rather than billed as an afterthought.

Offline strategy

The biggest single swing. Graceful degradation is modest; full offline editing with conflict resolution can be a third of the build.

In-app purchases

Products, receipt validation, restore, refunds, upgrades and sandbox testing on two stores that behave differently.

Whether a backend exists

Push needs a server that can send it, account deletion needs an endpoint that performs it, sync needs an API designed for it. Missing pieces are a second project.

Native capabilities

Each of camera, location, biometrics, background work and health data brings its own permission flow, denial path and platform differences.

Number of platforms

Cross-platform makes the second one much cheaper than the first, but not free — compliance, testing and store admin are per platform.

Design maturity

A design system you already have is fast. Screen-by-screen invention is not, and mobile has more states per screen than the web does.

Real-time or streaming features

Chat, live location and collaborative editing are a different architecture, plus battery and background-execution constraints.

Accessibility and localisation

Both are cheap when built in and expensive as a retrofit across every screen.

05Process

How a project runs

  1. Scoping call

    60 minutes, free

    What the app does, who uses it, what must work offline, whether you sell anything inside it, what backend exists, and which platforms matter.

    What we need
    Whatever exists — a web product, a prototype, a document.
    What you get
    A straight answer, including whether this should be an app at all.
  2. Written scope

    Three to five business days

    We write the scope, the offline strategy, the platform decision and its reasoning, and the compliance obligations your product triggers.

    What we need
    Answers on monetisation and offline expectations.
    What you get
    A scope document and a fixed price, with milestones.
  3. Build

    Per milestone, agreed in the scope

    Branches and pull requests, with builds installable on real devices from early on rather than at the end. Compliance work lands alongside features.

    What we need
    Review, product answers, and your developer accounts.
    What you get
    Installable builds on both platforms at every milestone.
  4. Submission and release

    Days to weeks, store-dependent

    Declarations written from actual network calls, submission, a written response to each rejection, then a staged rollout with crash reporting watched.

    What we need
    Quick decisions on anything that turns out to be a product question.
    What you get
    A live app on both stores and a release runbook you can run yourself.

06Deliverables

What you actually end up with

A written scope

Including the offline strategy and the platform decision with its reasoning — the two choices that move a mobile budget most.

Installable builds throughout

On both platforms from early in the work, on real hardware, because simulators lie about push, purchases, biometrics and poor connections.

Store accounts set up in your name

Apple Developer and Google Play registered to you, with signing, provisioning and release tracks configured inside them.

Compliance completed

Privacy manifests, required-reason declarations, data safety answers, age rating and in-app account deletion — written from what the binary actually does.

Submission and review handling

We submit and reply in writing to each rejection. The first review cycles are inside the price, not billed afterwards.

Crash reporting and release health

In place before the first release, because a native binary cannot be hotfixed and you need the signal quickly.

A release runbook

How to cut, submit and stage a release yourself next time, written down.

07Stack

What we build it with

React Native with Expo by default, because two native codebases cost roughly twice as much to maintain forever and that bill outlasts whatever prompted the decision. Native Swift and Kotlin where the product is the platform experience, and whatever backend is needed to make notifications and deletion real.

App Primary here

Mobile

Expo unless the product is the platform experience. One codebase is worth a great deal when the maintenance bill outlasts the project.

We default to

  • React Native
  • Expo
  • EAS Build
  • Swift
  • Kotlin

We also work in

  • Capacitor
  • Flutter
  • SwiftUI
  • Jetpack Compose
  • Expo Router
  • React Navigation
  • Reanimated
  • MMKV
  • WatermelonDB
  • StoreKit
  • Google Play Billing
  • RevenueCat
  • APNs
  • Firebase Cloud Messaging
  • Expo Notifications
  • Fastlane
  • App Store Connect
  • Google Play Console
  • Detox
  • Maestro
  • Privacy manifests
API Primary here

Backend and services

Boring, typed and synchronous until something measurably needs to be a queue. Most systems need fewer moving parts than they are given.

We default to

  • Node.js
  • Python
  • REST
  • tRPC
  • Background jobs
  • Queues

We also work in

  • Hono
  • Fastify
  • Express
  • NestJS
  • FastAPI
  • Django
  • GraphQL
  • OpenAPI
  • WebSockets
  • Server-sent events
  • BullMQ
  • Celery
  • Inngest
  • Trigger.dev
  • Cron and scheduled work
  • Stripe
  • Paddle
  • Razorpay
  • Resend
  • Postmark
  • Twilio
  • Webhooks in both directions
Ops Primary here

Infrastructure and observability

Managed platforms until scale or cost argues otherwise. The parts we insist on are a deploy you can roll back and an error that reaches a human.

We default to

  • Vercel
  • Cloudflare
  • Docker
  • GitHub Actions
  • Sentry

We also work in

  • AWS
  • Cloudflare Workers
  • Cloudflare R2
  • Cloudflare D1
  • Fly.io
  • Railway
  • Render
  • Terraform
  • Nginx
  • Caddy
  • GitLab CI
  • Grafana
  • Prometheus
  • Axiom
  • Better Stack
  • Checkly
  • Uptime checks
  • Structured logging
  • Staged rollouts
  • Tested rollback
Web

Frontend and full-stack

TypeScript everywhere, and a framework that renders on the server unless the product is purely an application behind a login.

We default to

  • TypeScript
  • React
  • Next.js
  • Astro
  • Tailwind CSS
  • Vite

We also work in

  • JavaScript
  • Remix
  • SvelteKit
  • Vue 3
  • Nuxt
  • shadcn/ui
  • Radix UI
  • TanStack Query
  • TanStack Table
  • React Hook Form
  • Zod
  • Zustand
  • Redux Toolkit
  • Framer Motion
  • MDX
  • Storybook
  • Vitest
  • Playwright
  • Testing Library
  • ESLint
  • Prettier
  • Recharts
  • D3
Data

Databases and storage

Postgres unless there is a specific reason otherwise, migrations in the repository, and a restore that has been executed rather than merely configured.

We default to

  • Postgres
  • Supabase
  • Redis
  • Migrations
  • Backups and restore

We also work in

  • Neon
  • PlanetScale
  • MySQL
  • SQLite
  • Turso
  • Firebase Firestore
  • Upstash
  • Drizzle ORM
  • Prisma
  • Kysely
  • pgvector
  • Row-level security
  • Point-in-time recovery
  • Meilisearch
  • Typesense
  • Elasticsearch
  • S3
  • Cloudflare R2
  • Read replicas
  • Connection pooling
AI

AI systems

Hosted models behind an interface you can swap, with the eval set deciding which one you use this quarter rather than a contract.

We default to

  • Claude
  • OpenAI
  • MCP
  • Evals
  • Tracing
  • Cost control

We also work in

  • Gemini
  • OpenRouter
  • LiteLLM
  • Vercel AI SDK
  • Anthropic SDK
  • Tool and function calling
  • Structured output
  • Prompt caching
  • Batch APIs
  • Model routing
  • pgvector
  • Qdrant
  • Pinecone
  • Chroma
  • Hybrid retrieval and re-ranking
  • Langfuse
  • LangSmith
  • Braintrust
  • Helicone
  • Ollama
  • vLLM
  • OAuth 2.1 for MCP

Split into what we default to and what we also work in. If your system is outside this, tell us on the call — we would rather say no than learn a stack on your budget.

08Pitfalls

Mistakes we see most

Agreeing "it should work offline" in a sentence

That sentence covers three wildly different amounts of work. Decide explicitly between graceful degradation, a read-only cache, and full sync with conflict resolution — the last is a product feature with a product-sized price.

Treating push as an app-side task

The app integration is the small half. Token lifecycle, preferences, batching, quiet hours and deciding what is worth interrupting someone for all live on the server.

Baking changeable rules into the binary

Pricing, limits and feature flags compiled into a native app can only be changed on the stores’ schedule. Anything you may want to alter this week belongs on the server.

Testing only on the newest phone in the office

Older devices, smaller screens, larger system font sizes and poor connections are where apps actually break — and reviewers test on a bad connection deliberately.

Leaving accessibility to the end

Dynamic type and screen reader labels cost little while components are being written and a great deal across sixty finished screens.

No crash reporting on the first release

You cannot hotfix a native binary. Without release health data you find out from reviews, days later, with the broken version still installed.

Building an app because competitors have one

If the product does nothing a browser cannot, Apple’s minimum functionality guideline will say so, and the store is not the reason it will fail anyway.

09Honestly

When you should hire somebody else

  • You want a game. Real-time rendering and game engines are a different discipline entirely.
  • The product has no native purpose. We will tell you before you pay us, and staying on the web is often the better spend.
  • You need it on the stores next week. Review is measured in days and can repeat; a compressed date is the one thing we cannot fix.
  • You want a design partner. We build to a design or a component library rather than art-directing a brand.

10Questions

Questions

Something we haven’t covered?

Ask on a call
01 How much does it cost to build a mobile app?

We quote after a scoping call rather than publishing a figure, because the range is genuinely enormous and driven by a handful of decisions. In rough order of impact: your offline strategy, whether you sell anything inside the app, whether a suitable backend already exists, how many native capabilities you need, how many platforms, and whether a design exists. Two apps described identically in a sentence can differ by a factor of five on those alone.

02 Should I build with React Native, Flutter, or native?

React Native with Expo for most products: one codebase, real native modules, and over-the-air updates for JavaScript changes, which matters because the review loop is slow. Flutter if you want a highly consistent custom interface and are happy with Dart. Native when the product is the platform experience — sustained background work, heavy animation or graphics, deep OS integration, or needing platform features the day they ship. The decision that usually dominates is maintenance: two native codebases cost roughly twice as much to keep alive, forever.

03 How long does it take to build an app?

Substantial builds are split into milestones that each end at an installable build, so the answer is per milestone and set out in the scope before you commit. Beyond the code, allow for store review: it is measured in days rather than hours and it can repeat, so a launch date should be the end of the review window rather than the submission date.

04 Can you turn my existing web app into a mobile app?

Often, but the honest question first is whether it should be one. Apple’s minimum functionality guideline rejects apps that offer nothing a website cannot, so a straight wrapper is likely to be refused however well it is packaged. What works is a genuine native layer around your product — push, biometrics, offline, native share, camera where the product uses it. If we think your product has no plausible native purpose, we will say so before you pay us.

05 Do I need to build for both iOS and Android?

If you are using a cross-platform framework, the second platform is much cheaper than the first and it is usually worth doing together — the compliance thinking overlaps almost entirely and splitting means doing it twice. If budget forces one, pick from your own analytics rather than from general market share; who your users actually are matters far more than which platform is larger overall.

06 What about in-app purchases and the store commission?

If you sell digital goods or subscriptions consumed inside the app, the stores require their billing and take a commission. If you sell physical goods or real-world services, store billing does not apply and your own checkout is fine. The rules on linking users out to an external payment page are narrow and specific, and getting them wrong risks removal rather than rejection — which is considerably worse, because removal takes your existing users with it.

07 Who owns the developer accounts?

You do, and we would insist on it. The Apple Developer and Google Play accounts should be registered to your company with you as the owner, and we work inside them with the access we need. An app published under a contractor’s account is genuinely difficult to move later.

08 Will the app work offline?

To the degree you choose and pay for, which is a real decision rather than a yes or no. Graceful degradation — the app explains itself, retries, and does not lose what you typed — is included as a baseline because reviewers test on a poor connection. A read-only cache of recent data is moderate. Full offline editing with sync and conflict resolution is a significant piece of work, because deciding what happens when the same record is edited twice is a product question before it is a technical one.

09 What happens after the app is live?

You get a release runbook and crash reporting you can read yourself. The recurring obligation is the stores: both raise their SDK floors annually, and missing one means your app stops accepting updates or stops being offered to new users. A care retainer covers tracking those dates and doing the work before it becomes urgent; without one, you will get a console notice and a deadline instead.

10 Do you do app design?

No. We build to a design you have, or to a plain interface assembled from a platform component library, and we say plainly which of those you are getting. Mobile has more states per screen than the web — loading, empty, error, offline, permission denied, small screen, large font — and a design that only covers the happy path still leaves those to be decided.

11Also

The other services

Rescue & Hardening

Your AI-built app made safe to launch: access control, payments, deploys and monitoring.

Mobile & Store Launch

Your app packaged, compliant and submitted — through review, not just uploaded.

Web development

New applications and new features, built production-ready from the first commit.

Tell us what you want built.

A scoping call costs nothing and ends with a written scope and a fixed price. If what you need is outside what we do, we will say so on the call.

Prefer to write? Send your requirements

What do you need?

What it should do, who will use it, the must-haves, and any links. A few sentences is plenty.

Budget, if you have one in mind
When would you like to start?