The signs your business has outgrown spreadsheets are a second person editing the sheet, a phone opening it in the field, someone re-typing its rows into another system, and a formula nobody dares touch. Four or more of the eight signs below and the sheet is done; the fix is usually a small app with three or four screens, built around how you already work, not a platform.
To turn a spreadsheet into an app you make three moves: every row becomes a record with a permanent id, every thing you do with the sheet becomes a screen (a list, a detail page, a form), and one small server function owns every write so two people can no longer save over each other.
I did it twice in September for my own businesses: the snow route for Revisions Unlimited, my remodeling company in central Minnesota, went from a sheet and a group text to four tabs on my phone, and my budget spreadsheet became a bookkeeping app that caught a five-figure mistake the sheet had hidden. Here is when the sheet is done, what each app kept and dropped, the bug that only appears after you leave the sheet, and what drives the cost.
The method is the same whether the sheet tracks snow clients, rental units or jobs in progress.
Add a public form that writes into the same records and a push to one phone, and you have what I run: one HTML file, two small functions (one for my taps, one for the public form), one record store, on my home screen since September. If the sheet belongs to one person and never leaves a desk, tidy the sheet instead; the eight signs below tell you which you are.
I kept my own sheets well past the point where they cost me money. Four or more of these and the sheet is done.
Tick your boxes below. Zero to three: make the sheet better. Four to seven: it is time, and the question is rent or build. Eight: build.
Owners hear "you need a database" and picture a server room. Here is the difference in practice.
A spreadsheet keeps the data, the math and the display in the same cells. That is its genius for one person and its flaw for two: anyone can type over a formula, sorting one column scrambles the rows, and nothing stops two people saving different versions of row 40.
A database is only the data, with rules: every record has an id, every field has a type (a date is a date, not "next Tues"), and a write that breaks the rules is refused. It has no face.
An app is the face plus the rules: screens for the things you actually do, and a single path every change takes. The database can be tiny. My snow app's is one JSON document; Fischer Books, the bookkeeping app I built the same month, uses SQLite, a single file on my Mac.
Last winter the snow side of Revisions Unlimited ran on a sheet grouped by road and a text thread. The sheet had names, addresses, prices and a notes column that held everything else. The thread had the truth: who was done and who had paid.
In September I replaced both with an app at an unlisted address on my own website. Four tabs:
What it kept: name, address, road, phone, plan, price, paid and owed, eight fields almost unchanged; the grouped-by-road view; and the sheet itself as an export.
What it dropped:
The route math, the geocoding trap that put a driveway 90 miles away and the GPS rules are in the snow app post; those are plowing problems.
The same month I replaced a very different sheet. For about a year and a half my money lived in a spreadsheet fed by a script that scraped my credit union's PDF statements into a 967-row export. One row showed a lunch at Culver's for $18,818.10, a running balance the script had grabbed instead of the amount, and the sheet totaled it like any other expense.
143 rows sat in "Other" because categorizing by hand is the task I skipped every Sunday, and nothing told me whether a month actually reconciled.
The after is Fischer Books, a desktop app with three books in one SQLite file: Revisions Unlimited, Style Marking and personal. It imports the statements, reconciles every section against the printed opening and closing balances, categorizes with rules first and an AI suggestion only for what the rules miss, and prints my CPA package.
The migration brought over 1,229 transactions, 69 of 69 statement sections reconciled to the penny, with 500 automated tests behind the import. It kept the categories, the 494 payee aliases from the old sheets and the CSV export; it dropped every formula, because math in code with tests is the whole difference between a formula nobody dares touch and one that proves itself every run.
And it caught what the sheet hid. When a savings section opened at $0.00, the old script dropped the zero and shifted every amount by one row; in March 2025 that turned a five-figure transfer into the same amount of dividend income, and the old "reconciliation" hunted for any number that made the arithmetic close, then reported success.
A check that searches for a value that makes the math work is not a check. The app now fails loudly when opening plus activity does not equal closing. The long version is in the bookkeeping post.
In a spreadsheet, two people editing the same row is visible: two cursors, or two files named "final." In an app it is silent.
The snow app stores everything in one document. Tap Done and the phone reads the document, marks that stop, and writes it back. Now picture my phone and a browser tab doing that in the same second. Each read the same original, each wrote its own version, and the last write wins. One Done quietly disappears, and in February that is a driveway I think I plowed and did not.
It took three review rounds to get the rule right:
Rented sheet-to-app tools leave the Google Sheet as the database underneath and inherit this exact failure. If two people will ever tap the same row within a minute, ask whoever builds your app how they handle it. A blank look is your answer.
Tidy the sheet when one person owns it and nothing downstream depends on it. Rent a tool (Glide, AppSheet, Airtable, or a trade product like Jobber) when a template matches your workflow nine times in ten and paying per user every month is fine. Build small when the workflow is the business: columns no template has, two or more people touching it, or a phone that needs to buzz.
Most of the "you have outgrown spreadsheets" articles I have read end at a quote around $40,000. The $15,000 to $100,000 quotes I have seen from dev shops are not dishonest; they are for a different problem: multi-company logins, roles, audit trails, an admin console, a native app in two stores. A one-person shop needs none of it.
When we build one, a three-to-four-screen internal app like the snow route, with a public form and a push to one phone, is a small build. Something like Fischer Books is a much bigger build, because the parser, the reconciliation and the 500 tests are where the weeks go, not the screens. Either way the build price is set and quoted up front before work starts, then a monthly plan covers just the services the app uses, such as hosting, the alerts, support and updates, priced to compete with the per-user tools above; ask for a free quote.
To start this week: take the quiz above, write down the three things you actually do with the sheet, and split the notes column. If you want the app instead, tell me what the tabs are and who touches them through the contact page and we will come back with a set build price and the services the monthly plan would cover. Our development team works remotely with owners anywhere, and in Minnesota the team can visit in person.
Count the signs: a second editor, a phone in the field, re-typing rows elsewhere, a formula that scares you, a costly error already, status you cannot see at a glance, alerts it cannot send, or more than 50 new rows a month. Four or more and you have outgrown it; one or two means a better-built sheet is still the answer.
Yes, two ways. Glide or AppSheet put a phone face on the sheet in an afternoon and leave the sheet as the database, which suits one editor and a simple list. A small custom app moves the rows into a record store with a single write path, which you need once two people tap the same row or a public form feeds it.
It depends on what the app has to do. A three-to-four-screen internal app with a shared record store, a public form and a push to one phone is a small build; one with a heavy import or reconciliation engine is much bigger. Either way you get a set build price quoted up front, then a monthly plan for just the services it uses, priced to compete with per-user tools like Airtable or Jobber. The big dev-shop quotes you may have seen are for multi-user platforms a small shop does not need.
Silent overwrites when two people edit, formulas that break when a row is inserted or a column sorted, numbers that look right and are not (my sheet carried an $18,818 lunch for months), no alerts, and no record of who changed what. None show up as an error; they show up as a wrong invoice, a missed stop or a tax number you cannot defend.
If one person tracks a few dozen contacts and nothing needs to alert you, a disciplined spreadsheet works. Once leads arrive from a website form or more than one person follows up, you need a single write path: a rented CRM when its template matches how you sell, a small custom list app when your pipeline has steps no template has.
A spreadsheet keeps the data, the math and the display in the same cells, so anyone can type over a formula and sorting one column can scramble the rows. A database holds only the data, with rules: every record has an id, every field has a type, and a write that breaks the rules is refused. An app is the screens and the single write path on top.
Tell me what the tabs are, who touches them and where it goes wrong. You'll get a clear scope with a set build price for the small app that replaces it, quoted up front, then a monthly plan for just the services it uses, priced to compete with the per-user tools. Our development team builds it around how your business works, and you talk directly with the people building it.