Spinning wheel in the plant room
The engineer is in a basement, a plant room, a farm building or a steel-framed warehouse. They open the job app. It spins. They wait, walk to the door, hold the phone up. Eventually the form loads. They fill it in, press submit, and get an error. The work they entered has gone.
After that happens a couple of times, they stop trusting the app. They write notes on paper and fill in the app later, from the van, or at home, or not at all.
Why the app falls over
Most business apps are built as if the phone is always online. Each screen asks the server for data as it opens, and each save sends data straight to the server. With good signal, that is invisible. With patchy signal, every step is a gamble.
Some apps add a basic offline mode as an afterthought, which usually means a cached copy of the last screen viewed. It breaks as soon as the engineer needs something they did not open while they had signal, or when two people change the same job.
Doing offline properly is a design decision, not a setting. The phone needs its own database, the app needs to read from it first, and there needs to be a sync process that deals with what happens when the phone and the server disagree.
What an unreliable app costs
| Symptom | Consequence |
|---|---|
| Lost form entries | Work redone, or details guessed later |
| Waiting for screens | Time wasted on every job with poor signal |
| Paper workaround | Double entry, and the app data arrives late |
| Distrust of the app | Low adoption, so the office loses the live view |
| Duplicate submissions | Engineers press submit repeatedly and create copies |
The worst effect is the loss of trust. Once engineers believe an app will lose their work, they will protect themselves with paper, and all the benefit of going digital disappears.
It also skews what the office sees. Jobs on sites with good signal show up promptly, while jobs in basements and rural areas arrive late or incomplete. Anyone reading the dashboard gets a picture that says more about mobile coverage than about how the work went.
How we build offline-first
- Local database. The app keeps a database on the phone, for example SQLite, holding the engineer's jobs, customer details, forms, parts lists and history they are likely to need.
- Save locally first. Every entry is saved on the phone the moment it is made. Pressing submit never depends on the network.
- Sync queue. Changes wait in a queue and are sent in the background whenever there is any connection, with retries and no duplicates.
- Pre-loading. At the start of the day, or overnight on Wi-Fi, the app downloads everything needed for scheduled jobs, including photos and documents.
- Conflict rules. If the office changes a job while the engineer is offline, the sync applies clear rules about which change wins, and flags anything that needs a person.
- Visible status. The engineer can see what is saved, what is waiting to sync and when it last synced, so they never have to guess.
We build this in React Native or Flutter, with a sync layer to your back end. If you have an existing app, we look at whether it can be reworked for offline use or whether the data layer needs rebuilding.
After the rebuild
Engineers open the app anywhere and it loads straight away, because the data is already on the phone. They complete forms, take photos and get signatures in the basement, and the work syncs when they walk back to the van.
The office sees completed work as soon as the phone reconnects. Paper notes stop, because engineers no longer need a backup for the app.
Engineers also stop pressing submit three times out of nervousness. The status line tells them their work is safe on the phone and will go when it can, which is all most people want to know. Support calls about lost forms fall away because forms are no longer lost.
Does this sound like your app?
- Engineers lose form entries when signal drops
- Screens will not load on some sites
- Staff keep paper notes and fill in the app later
- Duplicate jobs appear from repeated submits
- Your app's offline mode only shows the last screen viewed