Introduction
A clinic's deposit bug fixed on Tuesday lunchtime that reached users on Friday afternoon, behind two rejection rounds caused by a privacy declaration nobody had re-examined after a dependency update; and a trade association's app published under an unreachable developer's account, with the source code available and completely irrelevant, that could never be updated again.
The fix that was finished on Tuesday and shipped on Friday
A small clinic had an appointment app. Nothing elaborate — book, reschedule, cancel, a reminder, a card on file for the deposit.
On a Monday a user reported that cancelling a booking sometimes charged the deposit anyway. Noor reproduced it in forty minutes, found the cause in an hour, and had a fix written and tested by Tuesday lunchtime.
Then it went into review.
The first submission was rejected — not for the bug, not for the fix, but because a privacy declaration on the listing did not match what an analytics component had started collecting after a routine dependency update three releases earlier. Nobody had noticed, because nothing had broken. The rejection was correct.
Noor corrected the declaration and resubmitted. That one was rejected too, for a related reason on a different question.
The fix went live on Friday afternoon. Between Tuesday lunchtime and Friday afternoon, the clinic kept taking deposits it then had to refund by hand, and the client asked four times — reasonably, and with increasing difficulty — why a bug that had been fixed on Tuesday was still affecting their customers on Thursday.
There is no good answer to that question. There is only a true one, and it should have been said before the engagement started rather than during it: you cannot deploy. You submit. The gap between finishing a fix and shipping a fix is not yours, it is not predictable, and it is not something skill removes.
The app that could not be updated
The second story is worse, and it is the one that ends businesses.
A trade association had an app built four years earlier by a developer who had since become unreachable. It still worked. Members used it. Nobody had touched it in two years and nothing appeared to be wrong.
Then a platform requirement changed, as they do, and the app needed a new build to stay available.
The app was published under the previous developer's account, not the association's. The signing credentials were on a machine nobody had access to. The association had the source code — they had been sensible about that — and it made no difference at all.
There was no way to update that app. Not with more money, not with more skill, not with a better developer. The only route available was to publish a new app: new listing, new identity, every existing installation stranded, every review and every ranking signal gone, and a message to several thousand members explaining that the app on their phone would stop working and they needed to install a different one.
Nobody had ever discussed the developer account. It had not appeared in the contract, in the handover, or in any conversation, because at the start of a build it seems like a detail and the app is the thing everybody is looking at.
The keys to a product are not the code. They are the account, the signing key and the certificates — and whoever holds them decides whether the app can ever be updated again.
What this book is about
This is a manual for building, shipping and supporting mobile apps for small businesses and organisations, alongside a job.
It covers product discovery, user stories, UX, prototypes, iOS and Android work, APIs and backends, testing, submission, analytics and support. But the reason those two stories open it is that the technical craft is not what decides whether this works as a business. Four structural facts do, and most app development advice mentions none of them.
The four rules
Rule one — you cannot deploy. You submit.
Every release passes through a reviewer you cannot call, on a timetable you do not control, against rules that are interpreted rather than executed. A rejection is frequently not a bug: it is a metadata problem, a declaration mismatch, a guideline reading you did not anticipate. Your critical fix goes out when it is approved. That single fact reshapes estimating, launch dates, emergency response, support agreements and every promise you are tempted to make.
Rule two — the device is not your environment.
There is a matrix of devices, operating system versions, screen sizes, locales, permission states, memory conditions and networks, and nobody owns it. Most of the failures you are told about cannot be reproduced on anything you have. You debug from crash reports, logs and analytics rather than from the thing itself, which is a different skill from the one that built the app.
Rule three — the keys to the product are not always yours, and they expire.
Developer accounts, signing keys, certificates and provisioning. Whoever holds them controls whether the app can be updated. They are frequently in the wrong name, on a machine nobody can reach, or thirty days from expiry with nobody watching. This is the one that turns a working app into an unfixable one, and it is discovered at the worst possible moment.
Rule four — shipping is the start of an obligation with no natural end.
The platforms release annually. Minimum requirements rise. Interfaces deprecate. Dependencies stop being maintained. An app nobody touches does not merely become dated — it eventually cannot be updated, or is removed from sale. The client thinks they are buying a finished thing, and what they are actually buying is the first release of something that requires attention for as long as it exists.
And the interaction is the whole risk. Rules two and four make failure likely. Rule three decides whether you can do anything about it. Rule one decides how long it takes, and it is never as long as anybody wants. That is why procedure rather than talent is what makes this business work, and why the developer with a verified release path and a pre-submission checklist beats the better developer without them, reliably.
The numbers this book is built on
The economic unit is revenue per app under support — what an app actually returns across a year of releases, rejections, platform changes, crash triage and support requests. Not the project fee, which describes one moment.
The leading indicator is hours per release, tracked as a curve and including every resubmission. It should fall as the app and the toolchain settle, and an app whose curve never falls has a specific, findable cause.
The master variable is first-submission approval rate — the share of your submissions approved without a rejection round. It predicts hours per release directly. It predicts whether you can honour a launch date. It predicts how fast you can ship an emergency fix, which is the only thing that matters on the worst day of the year. And it is almost entirely within your control, through a pre-submission checklist and a declaration register, which is what makes it worth measuring.
And the risk indicator is the count of apps without verified release access — apps where the developer account, the signing credentials and the certificates have not been checked, in the last quarter, by actually producing a build. Target zero. It is the mobile equivalent of an untested backup: nothing happens the month you skip it, and when it matters it is already too late.
How to use this book
Read Part One in order. Chapters 5 to 8 are the four rules in full, and everything afterwards depends on them.
Everything else can be read as needed. Part Two sets the business up — screening, discovery, the plan, the budget, the questions for somebody qualified, the toolchain and pricing. Part Three is the work itself. Part Four is the money and the records. Part Five is the year, the procedures, the numbers and the plans.
There are sixty-eight resources at the back and one hundred and forty-eight AI prompts, four per chapter. The ⚠ symbol marks a risk, a load-bearing constraint, or a clause in a prompt you should not delete when you adapt it.
Two things to do before anything else. Read your own employment contract, including the intellectual property clause, because code written in the evening is not automatically yours. And take Chapter 15 and Resource 18 to somebody qualified where you are — liability, IP, personal data, privacy declarations, accessibility, payments and insurance — before you accept a client rather than during your first year.
And one thing to establish on every engagement, before you write a line: whose account will this app be published under, who will hold the signing key, and what happens to both if we stop working together. It takes one conversation. The alternative is the second story.
©2026 James Henderson / https://localhandyman.work