How to turn an Excel spreadsheet into an app
To turn an Excel spreadsheet into an app, work in five steps. Audit the workbook. Map each sheet to a kind of record and each column to a field. Rewrite the formulas as rules you can check. Put those decisions into a short brief. Then test the first version against the original file before anyone relies on it.
A workbook often mixes raw records, calculations and presentation on the same tabs. An app keeps them apart: records live in a database, calculations become rules, and the layout becomes screens. Most of the work is deciding which part of your file plays which role.
The sample workbook in this guide
Every name, row and amount in this example is sample data invented for this guide. Northwind Cleaning, a made-up company in San Diego, California, keeps its work in northwind-jobs.xlsx. The Clients tab lists each client with an ID, an address and an unpaid total. Jobs has one row per visit. Cleaners lists the three staff. Summary holds a pivot table of hours per cleaner.
Three rows from the Jobs tab:
| Job ID | Date | Client ID | Client | Cleaner | Hours | Rate | Amount | Paid |
|---|---|---|---|---|---|---|---|---|
| J-1041 | 3/2/2026 | C-007 | Emma Clarke | Maria Lopez | 3 | $40 | $120 | No |
| J-1043 | 03-04-26 | C-007 | Emma Clarke | maria lopez | 2.5 | $40 | $100 | No |
| J-1044 | 3/5/2026 | C-019 | Patel Family Dental | Aiko Tanaka | $50 | No |
J-1043 has a date typed as text, a client name typed over the lookup with a trailing space, and the cleaner's name in lower case. J-1044 has no hours yet. Rows shaded yellow mean "invoice sent", and no column records that.
Step 1: Audit the workbook
Save an untouched copy first, because step 5 compares the app against it. Then check each tab for:
- A stable ID for every record. Names change. Client ID ties a job to a client, so it needs no gaps or repeats.
- One header row per table, with no title rows above it and no merged header cells.
- One kind of value per column. "Call after 5" in a Phone column belongs in a notes field.
- Real dates. J-1043's
03-04-26could mean March 4 or April 3. Decide, then fix it. - Duplicates and stray spaces. To a program, "Emma Clarke " with a trailing space is a second client.
- Color used as data, like the yellow rows.
- Hidden rows, active filters and subtotal rows, plus formulas that pull from another workbook.
Fix what you can in a working copy, and note each judgment call, such as which of two addresses is current.
Step 2: Map sheets to records and columns to fields
Clients, Jobs and Cleaners each hold one kind of record, so each becomes a list in the app. Summary has no records of its own. It becomes a view calculated from the jobs.
Where two tabs repeat a fact, pick one owner. Jobs copies each client's name with a lookup, but names and addresses are maintained on Clients. In the app, a job links to its client instead of holding a copy.
Then write a column-mapping plan for each record type. Here is the one for Jobs:
| Jobs column | In the app | Decision |
|---|---|---|
| Job ID | Unique job number | Refuse duplicates |
| Date | Date field | Fix text dates before upload |
| Client ID and Client | Link to a client | The name comes through the link |
| Cleaner | Link to a cleaner | Match "maria lopez" to Maria Lopez first |
| Hours | Number | Blank until the job is done |
| Rate | Amount in USD | Decide whether it belongs to the client or the job |
| Amount | Calculated | A rule, not a typed value |
| Paid and yellow shading | One status field | Scheduled, Done, Invoiced or Paid |
| Notes | Dated notes | One entry per note, with its author |
Plan Clients and Cleaners the same way, and mark the fields that decide access, such as each job's cleaner.

Stock illustration, not an Exepad screen. In Northwind's plan, charts and totals like these are views calculated from the job records.
Step 3: Turn formulas into rules you can check
Don't assume a formula carries over as a formula. Describe what each one should produce, then check the result against numbers you already know.
- The lookup.
=VLOOKUP(C2, Clients!A:B, 2, FALSE)fetches each job's client name. In the app, it becomes the link from job to client. Check that J-1041 and J-1043 both open Emma Clarke's record, typed-over name or not. - The unpaid total. On the Clients tab,
=SUMIFS(Jobs!H:H, Jobs!C:C, A2, Jobs!I:I, "No")becomes a rule: the sum of amounts on a client's jobs that are not Paid. Emma Clarke owes $220 in the sample file, so the app must show $220. The workbook gets this right only because it matches on Client ID, not on the name with the trailing space. - The status.
=IF(I2="Yes","Paid",IF(F2="","Scheduled","Done"))cannot see the yellow shading, so "Invoiced" never appears. In the app, status is one field with four values. Decide which ones a person sets, such as Done, and which follow from other fields. Check one sample job in each state.
Step 4: Write the brief
Turn your decisions into a brief that a stranger to the workbook could check the app against. Northwind's sample:
A job tracker for a cleaning company with clients, jobs and cleaners. Each job links to one client and one cleaner. Amount is hours times rate. Status is Scheduled, Done, Invoiced or Paid. A client's unpaid total is the sum of amounts on their jobs that are not Paid.
The office manager sees and edits everything. Each cleaner signs in and sees only their own jobs, with each client's address and notes. Cleaners can mark a job Done and add a note, but cannot see rates or totals. Show hours per cleaner per month as a view, and do not import the Summary tab.
Upload the workbook and paste the brief on the Excel to App page, which passes both into Studio. Create the first version there, then refine it. Review it against your mapping plan, including any structure the building assistant in Studio suggests.
This app saves records and signs cleaners in, so it is an app with data: any plan builds and previews it, and putting it live needs a paid plan. Compare the plans before you start.
Step 5: Test the app against the spreadsheet
Run this script on the first version and again after every change. Each expected answer comes from your untouched copy.
| Check | How to run it | Passes when |
|---|---|---|
| Counts | Compare rows per tab with records per list | All 18 sample clients, 64 jobs and 3 cleaners arrive, with no subtotal rows |
| Known total | Open Emma Clarke | Her unpaid total reads $220 |
| Cleaned values | Open J-1043 | It shows your chosen date and Maria Lopez |
| Saving | Add a job, reload, then sign out and back in | The job is still there |
| Missing value | Open J-1044 | The amount is blank or flagged, not $0 |
| Repeat import | Describe how a repeat import treats existing records, then upload the file again | Nothing appears twice |
| Second account | As Aiko Tanaka, open a direct link to one of Maria Lopez's jobs | It does not open, and no rates show |
| Signed out | Open the app in a private browser window | No client names or addresses appear |
| Phone | Mark a job Done in a phone's browser | The office sees Done after reloading |
Fix one problem at a time, then rerun every check. An access change can break the phone check, and a status change can break the totals.

Stock illustration, not an Exepad screen. Published apps open in a browser, including on phones.
After the first version: what changes
The upload was a snapshot, so editing the workbook next week will not change the app. Pick one place of record and tell everyone:
- The app, with the workbook kept as an archive.
- The workbook, for now, with a deliberate re-import on a set day that uses the matching rule you tested.
With the second option, retire the workbook once the app has matched it through a full billing cycle.
Once Northwind's office works from the app, four capabilities come into play. Test each one before you rely on it:
- Editors. Give the office manager an editor's sign-in in the published app, with access to clients and visits. Cleaners sign in too, with the narrower access the brief describes.
- Email. Apps can send email, such as a visit confirmation to a client or a new-job notice to a cleaner. Send test messages to yourself before relying on them.
- Export. You can export your app's data and code, for example to keep your own copy of the jobs. Check what the export contains before you rely on it.
- Versions. If a change goes wrong, use the versions available in Studio, inspect the restoration and publish after review. A restore does not undo record changes or emails already sent.
When to keep the spreadsheet
Keep Excel for personal models, one-off analysis and what-if scenarios that nobody else depends on. For a list only you edit, making Excel look like an application with form controls and locked cells can be enough. An app earns its place when several people change the same records, need different views of them, or must not see each other's data.
Related guides
- Client follow-ups: customer spreadsheet to CRM or Excel to CRM.
- Stock: Excel to inventory.
- Appointments: Excel to booking.
- Reports and charts: a dashboard from Excel.
- A list people search: Excel to directory.
- Exported rows: CSV export problems.
- The wider problem: replacing spreadsheets.
When your mapping plan and brief are ready, start from your Excel file.


