Offline first

"It Has to Work Offline" Means Three Different Things. The Price Depends on Which One.

The first question we ask when a client says the app has to work offline is not technical. It is whether the offline they mean is the offline we mean. Usually it is not, in either direction. This article separates the three things people mean by offline mode in mobile apps, what each one costs to build, and what changed in two of our own projects when the app met a river with no signal and a technician with no patience.

Thomas SiudutThomas SiudutCo-Founder and CEO, Apps Value August 18, 20268 min read
Offline first Field work Scoping
The short version
  • Offline is three products, not one. Seeing what is already there, doing work that goes out later, and running a whole shift or a whole river with the network as an afterthought. Each one is a different scope and a different number.
  • The schema is where offline projects are won or lost. On Liniowiec, versioned routes and properly designed relations between data are the reason it works; done in a hurry the same app would be a mess of data within a season.
  • Users route around gaps instantly. On TimeFix, technicians started writing things into the notes app on their phones the moment the app did not carry them, and the data drifted apart from that day.
  • Agree the definition before the quote. The same sentence in a brief can describe a two week feature or the core of a four month system.

The sentence that costs the most on a first call

"It has to work offline." Almost every field project we scope contains that sentence, and almost every time the two sides of the table picture something different. The client pictures a technician opening the app in a basement and seeing today's jobs. We picture two devices, three days without coverage, and a form definition that changed on day one.

Neither picture is wrong. They are different products that happen to share a name. So the first thing we do is not estimate. It is ask which one is being bought, because that answer moves the number more than the feature list does. Everything below is the long version of that conversation.

Offline one: seeing what is already there

The lightest meaning. The app shows what it downloaded while it had a network. Today's jobs, the customer's address, the last report, the map of the stretch you are on. Nothing new is created without a signal, or if it is, the user is told to try again later.

This is a cache with a good user interface. It is worth having, it is quick to build, and it covers a real share of "we lose signal in the car park" complaints. It is also where most off the shelf tools stop, which is why the next two definitions are usually what a custom project is actually about.

Offline two: doing work that goes out later

Here the user does the job without a network and the app promises to deliver it. A checklist completed, photos attached, a signature captured, a status changed. All of it sits on the device until coverage returns, then goes out in the right order and exactly once.

The promise is the product. Every piece of engineering underneath it exists so the user never has to think about whether something went through: a local store that survives the app being killed, an outbox with a retry state per record, uploads that resume rather than restart, and identifiers that make a repeated send harmless.

What decides adoption is that the promise is visible. Each record shows its own state, in words the user can read. Synced. Pending. Needs review. The moment a technician cannot tell whether an hour of work is safe, the app becomes paper with extra steps, and we have watched that happen.

TimeFix, what people do when the app does not carry it

On TimeFix, a field service app for technicians, the gaps did not produce complaints. They produced workarounds. Technicians started writing things into the notes app on their own phones, and from that day the notes and the system disagreed. Reports were built from one, the truth lived in the other.

The same project taught us that requirements arrive on the job, not in the meeting: the work timer had to keep counting when the screen locks and when the technician places a call from inside the app. Field requirements surface in the field. Plan the project so they can.

Offline three: the network is an afterthought

The third meaning is where offline stops being a feature and becomes the architecture. The device is the working store for the whole shift, or the whole voyage. Reference data has to be present before it is needed. Definitions change while devices are away. Two people touch the same record from different places. And the app is expected to just work, for days if necessary.

This is the offline our offline first app development work is built for, and it is a system, not an app: mobile, a sync layer, a backend that understands versions, and an office view. It is also the one where the schema decides everything, which brings us to a river.

Liniowiec: routes that arrive by themselves

Liniowiec is a river navigation app we built in Flutter for inland waterways in Poland, over 1,000 km across more than 18 rivers, with offline maps as the core of the product. A skipper in the middle of the river cannot depend on a signal, so the map and the routes have to be on the phone before the boat leaves.

The way it works is quiet. When an administrator adds new routes in the backend, the app notices on its next start and loads them in. The user does nothing and downloads nothing by hand. The maps themselves are not heavy, so this is invisible in practice, which is exactly how reference data in an offline product should behave.

The decision we are most pleased with is not visible on any screen. We spent a serious amount of time on the database schema before building: routes are versioned, and the relations between routes, points and the data attached to them were designed properly rather than added as we went.

Had that been done quickly and without thought, the same app would have ended up as a mess of data by the end of its first season.

That is the general lesson for the third kind of offline. In a connected app a weak schema is a refactoring ticket. In an offline one it is copied onto every device in the field, and every device has to be reconciled after you fix it.

Stage two of Liniowiec, which extends the map stack, adds water level data and brings the app to WCAG AA, is built on that same schema, which is the best evidence that the time was well spent.

Which offline does your project actually need?

The honest answer differs by what the app is for, and it is worth saying out loud, because offline three sold to a business that needs offline one is a waste of their money.

  • Field service and equipment work. Almost always the second kind, and often the third: forms, photos and time captured in plant rooms and on roofs, with the office view kept as the system of record. The operational side is on field service app development, and the seams where off the shelf stops fitting are in build or buy field service software.
  • HVAC and service agreements. The same, with one more reason for the third kind: the unit is the record, and readings taken on site have to attach to the right unit and the right agreement version even when the phone has been offline all day. See custom HVAC software development.
  • Navigation and outdoor work. The third kind by definition, because the network is absent for the length of the job and reference data has to be present before it is needed. Liniowiec is that case.
  • Booking and marketplaces. Usually the first kind, if any. A booking has to be confirmed against a live calendar and a payment has to clear; pretending otherwise creates the double booking it was meant to avoid. What matters there is a graceful failure and a fast retry, not an outbox. The product questions for those are on booking app development and marketplace app development.
  • A startup first version. Rarely more than the first kind, unless offline is the product itself. If it is not, it belongs on the list of things to postpone, which is the whole logic of what a first version should contain.

Why the definition has to be agreed before the number

We quote fixed prices, and a fixed price is only honest if both sides mean the same thing by the words in the scope. "Works offline" is the phrase most likely to break that. Written as offline one and built as offline three, the supplier loses money.

Written as offline three and built as offline one, the client discovers it in a basement, on a real job, with the notes app open.

So the definition goes into the scope document in plain words: what the user can see without a network, what they can do, for how long, what happens to it afterwards, and who resolves the cases the rules cannot.

If the answers are still "it depends" after the first call, that is what a short discovery workshop is for, and it is a far cheaper place to find out than the field.

How that turns into a number, line by line, is in how a fixed price app quote is built, and the model itself is on fixed price app development.

What to bring to the call, by product type, is in how to brief an app development company. If you are in the US and wondering how a team in Poland runs a project like this from six hours ahead, nearshore Flutter developers in Poland gives the honest version.

FAQ

Is offline first more expensive than a normal app?

The third kind is, because the sync layer and a backend that understands versions are part of the product. The first kind is a modest addition. Which one you need is the real question, and it is answered by how long your people are actually without a network and what they have to do in that time.

Can we start with the light version and add real offline later?

You can add a cache later. Moving from a connected app to a device as the working store is closer to a rebuild of the data layer, because the schema has to be designed for it. If there is any chance you need the third kind, design the schema for it on day one even if the first version ships less.

Does the app need to be native for offline to work well?

No. Both Flutter and React Native handle local storage, background work and sync well. Liniowiec is Flutter. The choice is made on your existing systems and the platform features you rely on, not on the offline requirement itself.

What happens when two people edit the same record while offline?

Rules decide it field by field where that is safe, and a person is asked where it is not. Completed records are locked so later changes become new versions with an audit trail. The point is that nothing is silently overwritten and the user is never left guessing.

How do we describe our offline requirement so a supplier can price it?

Say what the user must be able to see without a network, what they must be able to do, for how long, and what should happen to that work afterwards. Add who else touches the same records at the same time. Those five answers place the project in one of the three definitions above, and that is enough to price.

Why does the schema matter so much for offline apps?

Because every device holds a copy of it. In a connected app a weak model is fixed on the server. In an offline one the fix has to reach every device and reconcile everything they hold. On Liniowiec, versioned routes and correct relations between the data are what let new routes arrive by themselves without disturbing what is already there.

Thomas Siudut, Co-Founder and CEO of Apps Value
Written by
Thomas Siudut

Co-Founder and CEO, Apps Value

Thomas takes the first call on most Apps Value projects. When the brief says the app has to work offline, that call is spent finding out which offline is meant, because the answer decides the scope and the number. If the light version is enough, he will say so. If it is not, you get a written scope and a fixed price before a line of code exists.

Tell us what offline means in your operation.

Where your people lose the network, for how long, and what they have to get done in that time. You will get a straight answer on which of the three you need, and if it is the real one, a written scope with a fixed price for a first version.

Book an intro call

30 minutes, no preparation needed.