perfectdesign.

App foundations

Mobile app backend and API integration

The part of an app nobody sees, and the part that decides whether it still works in two years. This page is about scoping it before anyone writes a screen.

In short

The backend is where a mobile app either holds together or quietly falls apart. Scope it by naming the business transaction first, then deciding which system owns each record, what the interface between app and server promises, how identity is proved and checked, which writes can wait for a connection, and what happens when a response never arrives. Add one decision most projects skip: how old versions of the app, still installed on people phones months later, keep working when the server changes.

Written for a product or operations lead deciding whether a mobile workflow needs a backend and external integrations · 7 min read

Start with the transaction and the system of record

An API, meaning an application programming interface, is the agreed way one system asks another to do something or hand over data. Scoping the backend behind an app means deciding what those requests may do and which system is in charge of each answer. Start from the business transaction: what the user is trying to achieve, what record that creates or changes, and who is entitled to see it afterwards. One fictional scenario runs through this page, a mobile client creating a single booking through a versioned backend. It is invented for illustration, and your actual systems still have to be agreed.

Which system owns each user, transaction and business record

Use a small table in your own notes with six columns: the record, the system that is authoritative for it, who may write to it, who may read it, who owns an exception, and what evidence proves the two sides agree. Work through user identity, the transaction itself, the business records around it, and any copy that lives in an external system. Copies are where the trouble starts, because a copy always looks authoritative to whoever is reading it.

In the fictional booking, that means naming which system owns availability, which owns the customer, which owns the booking state and which sends the confirmation. Permissions and ownership are settled together, because who may change a record is meaningless until you know where the real one lives. Our Aruva Marketplace build is a concept prototype rather than client work, and it is useful here because one order passes through six role workspaces over a single set of records, which is exactly what ownership rules exist for.

One booking, five things that claim to know it. Copies are where the trouble starts, because a copy looks true to whoever is reading it. A full text version follows.

One booking, five things that claim to know it

Editorial framework. Copies are where the trouble starts, because a copy looks true to whoever is reading it.

Basis: Perfect Design: business systems explained. Reviewed .

Read the graphic as text

One booking

  • Identity. The system that knows who the customer is
  • Availability. The calendar deciding what can be sold
  • Booking state. Where the authoritative record lives
  • Confirmation. Whatever tells the customer it happened
  • Copies. Every one of them looks authoritative
Download this infographic (SVG)

What the API contract has to decide before anyone builds

The contract is the promise between app and server. It has to name the resources or actions available, the shape of each request and response, what validation rejects, and what every error state means in terms the app can act on. OWASP's REST security guidance, read on 18 September 2026, describes REST as resource-oriented, with state meaning the state of the resource the interface accesses rather than the state of a session. That is guidance for one style of interface, not a rule for every project, but the distinction is worth keeping.

Then versioning, which is the decision mobile projects underestimate. A website updates for everyone the moment you deploy. An app does not. Someone who installed your app in March may still be running that build in December, because they never auto-update, or they are on an old device, or they simply declined. So the contract has to say which client versions are supported, how a breaking change is introduced, and what an unsupported client is told. A forced-update screen is a legitimate answer, as long as it is a decision rather than an accident.

A fictional mobile client creating one booking through a versioned backend
Workflow stepAssumed actorProposed system responseExceptionAcceptance evidence to collect
Request a permitted recordSigned-in userReturn only the data authorised for the current roleA guessed identifier or an expired token must not widen accessPositive and negative API authorisation tests
Retry a booking submissionMobile clientReuse the agreed request identity after a lost responseAn uncertain first outcome needs server reconciliation, not a second bookingDuplicate-request, timeout and booking-identity tests
Upgrade the APIBackend ownerKeep the agreed supported client versions working, with the change observableAn old client on an incompatible contract needs the chosen fallbackVersion compatibility, error and support-owner checks

Read as a sequence, that is: the app presents a token, the server checks it and decides whether this caller may act, the request goes in, the response is lost on a poor connection, the app decides whether it may safely retry, the server recognises the repeat and reconciles rather than creating a second booking, and anything still ambiguous is visible to a named support owner rather than silently dropped.

Authentication, sessions and what a token may do

Two questions hide behind the word login. Authentication proves who is calling. Authorisation decides whether that caller may see or change this particular record. OWASP's guidance says secure REST services should only provide HTTPS endpoints, that non-public endpoints must perform access control at each endpoint, and that a token consumer should verify the token is integrity protected and check claims such as issuer, audience and expiry before authorising a request. Treat that as security guidance rather than proof of any implementation. Session design, meaning sign-in, refresh, logout, recovery and behaviour across several devices, is its own subject, as is how a token is revoked early.

Sync: which writes can wait, and which cannot

Synchronisation just means keeping the copy on the phone and the record on the server in step. Android's offline-first guidance describes a local data source acting as the canonical source of truth the app reads from, with a repository coordinating network updates, and distinguishes pull-based, push-based and hybrid approaches while noting the choice depends on product requirements and infrastructure. The scoping question is simpler: can this write wait. A saved filter can. A payment cannot. Decide per action whether it is online-only, queued for later, or written locally first, and decide what the user sees while it is pending.

Failures, retries and the duplicate you did not mean to create

Failures are not one thing, and treating them as one is how duplicates get created. A validation or authorisation failure will fail again, so retrying is pointless. A dropped connection is transient and worth retrying. A server error may be either. The dangerous case is the timeout, where the request may have succeeded and the answer was lost. Retrying blindly there books the appointment twice.

The fix is idempotency, which means a repeated request produces the same result as the first rather than a second record. In practice the app attaches an identity to the request and the server recognises a repeat and returns the original outcome. Anything still uncertain goes to reconciliation, meaning a deliberate check of what the server actually holds, rather than a guess. OWASP also advises validating workflow state on the server so requests cannot be invoked out of sequence to bypass intended controls, which is worth remembering whenever the app appears to be enforcing the rules.

What a retry and reconciliation policy must define

Four things: how a request is identified so a repeat is recognisable, which failures may be retried and which may not, when retrying stops, and what happens to whatever is left over. Android's guidance offers exponential backoff for draining queued work and versioning for resolving conflicts, with last write wins as one example rather than a default. Pick the policy per transaction, because the right answer for a saved preference is not the right answer for a payment.

Four failures that need four different answers. The timeout is the one that books the appointment twice, which idempotency prevents. A full text version follows.

Four failures that need four different answers

Editorial framework. The timeout is the one that books the appointment twice, which idempotency prevents.

Basis: Android: Offline-first guidance. Reviewed .

Read the graphic as text
  • Rejected. Validation or permission, so it fails again
  • Dropped. Connection lost in transit, safe to retry
  • Server error. Could be either, so back off and check
  • Timed out. It may have worked, so reconcile instead
Download this infographic (SVG)

Push notifications are infrastructure, not a feature

A notification looks small and is really a system: device tokens that change and expire, a store of which token belongs to which user on which device, permission state per platform, a queue that keeps working when the provider is slow, and a record of what was sent so support can answer a customer who says nothing arrived. Decide early what a notification may contain, because delivery is never certain and anything critical must also be visible in the app.

What breaks when the app and the backend drift apart

Drift is the characteristic mobile failure. The server adds a required field and an older build fails at submission. A status is renamed and the old app shows a blank badge. A response gains a structure the installed version cannot parse and the screen is empty. None of these appear in staging, because staging runs the current build. They appear for people running last quarter's app, and they arrive as a support problem rather than an error log.

Your launch date is not entirely yours. Plan the submission weeks before the launch campaign, not after it. The twelve-tester rule has delayed more first releases than any code problem. A full text version follows.

Your launch date is not entirely yours

Published statistic. Plan the submission weeks before the launch campaign, not after it. The twelve-tester rule has delayed more first releases than any code problem.

Source: Apple: App Review. Reviewed .

Also: Google Play Console Help: publish your app.

Also: Google Play Console Help: testing requirements for new personal accounts.

Read the graphic as text
  • Apple review: 24h. Apple says 90% of submissions are reviewed in under a day
  • Google extended review: 7d. Some accounts get a longer review, up to seven days or more
  • New Play accounts: 12 × 14. A new personal Google Play account must run a closed test with 12 testers opted in for 14 continuous days before it can publish
Download this infographic (SVG)

Who owns hosting, monitoring and credentials

A backend is something somebody has to run, so name who before launch. The hosting account and who may deploy. The API credentials and who rotates them. What is monitored and who is told when it breaks. Which audit logs are kept and for how long. Who approves a release, and where routine maintenance ends and new work begins. OWASP suggests writing audit logs around security-related events and logging token-validation errors to detect attacks, and warns against putting keys or passwords in URLs, where they end up in server logs.

An app is not finished when it ships. This is the honest reason an app carries a care fee. Leave it a year untouched and the store quietly stops offering it to new phones. A full text version follows.

An app is not finished when it ships

Published statistic. This is the honest reason an app carries a care fee. Leave it a year untouched and the store quietly stops offering it to new phones.

Source: Google Play Console Help: target API level requirements. Reviewed .

Read the graphic as text
  • New apps and updates: API 36. Must target Android 16 from 31 August 2026
  • Existing apps: API 35. Below Android 15 and the app stops reaching new users on newer devices
  • How often: Yearly. Google moves the floor every year, and Apple moves its own alongside each iOS release
Download this infographic (SVG)

Turning the questions into a scoped next step

Bring the user roles, the records a transaction touches, the systems already in use with whatever interface documentation exists, how sensitive each kind of data is, the failure cases that would actually hurt, who owns each account, and the evidence you would want before accepting the work. Send that as a scoped enquiry and we will tell you which parts look solid and which need confirming. If the wider question is which system should own your business records at all, CRM and integrations is the better place to start.

What you get

What is actually delivered

01

System-of-record map

Each record with its authoritative system, permitted writers and readers, exception owner, and the evidence that proves two systems agree.

02

A written API contract

Resources or actions, request and response shape, validation rules, and an error vocabulary the app can act on rather than guess at.

03

Versioning and deprecation policy

Which client versions are supported, how a breaking change ships, what an unsupported build is told, and how in-use versions are observed.

04

Identity and permission design

HTTPS endpoints, access control checked at each non-public endpoint, token validation including issuer, audience and expiry, and a revocation decision made for your project.

05

Synchronisation behaviour

Per action, whether a write is online-only, queued or local-first, what the user sees while it is pending, and the conflict policy for each record.

06

Retry and reconciliation policy

Request identity so a repeat is recognisable, retryable and non-retryable failures separated, stopping conditions, and a reconciliation route for uncertain outcomes.

07

Push notification infrastructure

Token storage and refresh, permission state per platform, a queue that survives a slow provider, and a send record support can answer questions from.

08

Operating model and handover

Hosting, deployment access, credential rotation, monitoring, audit logs, incident escalation and release approval, each with a named owner.

How it runs

Agree the contract, then build both sides against it

Most backend pain is a disagreement nobody wrote down: who owns a record, what an error means, which app versions still count. We settle those first.

  1. 01

    Name the transactions

    We work from the business transactions the app has to complete, and list the records each one creates, changes or reads.

  2. 02

    Map ownership and permissions

    Each record gets an authoritative system, permitted writers and readers, and an exception owner, including any copy held in an external system.

  3. 03

    Write the contract

    Requests, responses, validation, error meanings, supported client versions and the deprecation route are agreed before either side is built against them.

  4. 04

    Build, integrate and instrument

    We build the backend and the integrations whose access and terms are confirmed, with logging and monitoring in place rather than added after the first incident.

  5. 05

    Test the failure paths

    Expired tokens, guessed identifiers, timeouts, duplicate submissions, conflicting writes and an old client on a new contract are tested deliberately.

  6. 06

    Hand over and maintain

    Accounts, credentials and code go to you with the operating model written down, and we keep dependencies and platform compatibility current, scoped per project.

Proof

Work you can click through

PantryCue is our own React Native app, with live camera scanning, local notifications, an offline pantry and a Cook Mode that reads steps aloud. You can try the web build, and there is an installable Android build; it is not on the App Store or Google Play. Aruva Marketplace and VITALE are concept prototypes, not client work. Aruva is shown because one order passes through six role workspaces over a single set of records, which is what record ownership and permissions exist to govern. VITALE is shown because its commission run is deterministic and re-runnable, which is the same discipline a safe retry needs. Both run as web platforms.

Concept prototypes are labelled as prototypes everywhere they appear. They demonstrate what we can build, not work delivered for that named client. More client work is going live and will be added as it does.

How we work

The parts people ask about before they commit

How we build

React first, other languages when a project needs them

We build in React by preference, on both web and mobile, and we work in other languages when a project genuinely calls for it.

App stores

The accounts stay in your name

Your business owns the Apple Developer and Google Play accounts. We set them up in your name, prepare certificates and signing, and submit builds for you.

  • Apple Developer and Google Play account setup in your name
  • Certificates, signing and provisioning
  • TestFlight and internal test tracks for review builds
  • Store listing preparation and submission on your behalf

Timeline

Project dependent, and often quicker than expected

Timelines are project dependent. A focused build can go live in about a week, while a larger platform takes longer once scope is agreed.

Ongoing care

Quoted with the project, not bolted on

For a more complex website or a system with a real backend, ongoing care starts from RM 250 a month, with the plan confirmed against what was actually launched. Care is quoted with the project, not bolted on afterwards.

Getting hold of us

Normally under one working day

We normally respond to a support request in under one working day, and we work to solve problems as fast as we can. That is how we normally work rather than a contractual guarantee, and responding is not the same as resolving. If your operation needs a formal response or resolution commitment, we can write one into your scope.

Ownership

Everything belongs to your business

You own everything we build for you: the code, the content, the domain, the hosting account and every third-party account opened for the project. There is no lock-in. If you move to another provider, everything goes with you and we help with the handover.

  • Source code, handed over in your own repository
  • Domain and DNS, registered to your business
  • Hosting and every service account, in your name
  • Analytics, search and ad accounts, with us as a manager you can remove
  • All content, media and data in the system

Questions

Asked about app backend & apis

Straight answers to what people ask before they commit. Anything else, message us.

Does our app actually need a backend?

Not always. An app that only presents fixed content, or works entirely on the device, may not need one. You do need a backend once data must be shared between people or devices, once something has to be authoritative when two copies disagree, or once a record has to survive a reinstalled app. Those are the tests worth applying before assuming one.

What does backend work cost?

Website packages are published openly on the pricing page, but backend and integration work is quoted against its scope. The number moves with how many records and roles exist, how many external systems have to agree, how much has to work offline, and how much failure handling the transactions genuinely warrant.

Can we use our existing system as the backend?

Often, and it is usually the better answer than a second database beside it. Feasibility depends on four things we confirm before anything enters a scope: whether an interface exists, who can grant access, whether the data is clean enough to rely on, and what the vendor terms allow. If the existing system cannot serve the app safely, we would say so rather than work around it.

What happens to people still using an old version of the app?

That is a decision, not an accident, and it belongs in the contract. We agree which client versions are supported, how a breaking change ships, and what an unsupported build is told, whether that is a forced-update screen or a compatibility path on the server. Being able to see which versions are still calling you is part of the work.

Can a retry create a duplicate booking or payment?

It can, which is why request identity is designed in rather than added later. The app attaches an identity to the request, the server recognises a repeat and returns the original outcome, and anything genuinely uncertain goes to a reconciliation check rather than a second attempt. That behaviour is tested before sign-off, not assumed.

Who holds the hosting and credentials?

You do. The hosting account, the API credentials and every service account are in your business name, and the code is handed over in your repository. We work with the access we need and hand back full control whenever you ask, which is also what keeps a later provider change from becoming a rebuild.

How long does it take?

Timelines are project dependent. A focused build can go live in about a week, while a larger platform takes longer once scope is agreed. For backend work the slow part is usually confirming access to the systems you already run, because that depends on other people.

Where to go next

Sources

Tell us what you need built

We will show you the closest thing we have already built, then scope the real version against your requirements.