Field Service & Trades// definition

Offline-first, described as what happens to one work order

In short

Offline-first means the device holds its own copy of the work it needs, every change is written locally and queued for the server, and reconciliation happens when signal returns. The technician never waits on a network. It can never do 2 things: show data that was never synced, or finish a large upload the moment somebody taps save.

Key takeaways

  • 4 parts: a local store, a write queue, a sync cursor and a reconciliation step.
  • Every read comes from the device. The network updates the local copy, never the screen.
  • Writes carry a client-generated id, so a retry after a lost response cannot duplicate them.
  • It cannot show what was never synced, which makes pre-caching a product decision.
  • Media uploads finish when there is bandwidth, not when the technician taps save.

Offline-first is an architecture, not a feature flag. The device keeps its own copy of the data a technician needs, the app always reads from that copy, and every change is written locally and appended to a queue that drains whenever a connection exists. Nothing on screen waits.

The distinction from an app that merely tolerates a dropout is that there is no online path to fall back from. An offline mode means 2 code paths, and the rare one is untested. Offline-first has 1, and the network is a background process that reconciles.

One job, opened and closed with no bars

A technician drops into a crawlspace at 09:40 with no signal and comes out at 10:25 with the job finished. What the app did:

  1. Opened the job from the local store. Job, customer, site, equipment and its last 3 visits arrived in the 06:30 sync, so the screen renders instantly.
  2. Recorded arrival. A timestamp row appends to the write queue with a local id, plus a monotonic reading so a clock change cannot rewrite it.
  3. Captured the work. Checklist answers, parts and notes each append their own queued write; the local store updates immediately.
  4. Captured evidence. 14 photos and a signature go to device storage, their uploads joining a separate media queue — a 4 MB photo and a 200-byte status change must not share a lane.
  5. Marked the job complete. Validation runs against local data, so every completion rule must be answerable on the device.
  6. Reconciled at 10:31 on the drive out. The queue drains in order, the server accepts each write by client id, the cursor advances. The only step that touched a network.

The 4 parts, and what each one owns

PartWhat it ownsHow it fails when done badly
Local storeThe device copy of jobs, customers, equipment, price book, forms. Usually SQLite.Held in memory, so an OS kill loses a morning.
Write queueAn ordered, durable list of changes with client ids and retries.Built as an in-flight request; nothing survives backgrounding.
Sync cursorA per-device marker of what has been pulled, so a refresh is incremental.Full re-download each sync, turning a 30-second start into 6 minutes.
ReconciliationApplying server truth locally and resolving contested fields.Whole-record overwrite, so one side's edits vanish.
The components of an offline-first work order app

The last row carries most of the design work, and it is a business decision: status, notes, parts, time and photos each need a different rule. That belongs in a merge policy written field by field. How much to pre-cache is a sizing question, in how much data a truck day needs on the device.

The 2 things it can never do

It cannot show data that was never synced. A job added at 11:00 while out of coverage, or equipment history for a site off the morning route, is simply absent. Pre-caching therefore becomes a product decision about which jobs, how much history and which price-book slices ride along — and route shape changes the risk, one reason route density is the unit a pest schedule optimises.

And it cannot finish a large upload on demand. Tapping save writes the photo locally and enqueues it; the bytes leave when there is bandwidth and battery, which on a truck day can be hours. When it becomes days, the diagnosis is Tuesday's photos are still uploading on Friday. Which images are required is the photo set a completed job should carry.

Offline-first does not mean the work order syncs quickly. It means the technician never finds out whether it did.

What the platform gives you, and what it does not

SQLite in write-ahead logging mode is the ordinary local store. Its documentation states that in WAL mode readers do not block writers and a writer does not block readers, with only 1 writer at a time, and that durability after power loss depends on the synchronous setting — the log syncs on each commit only when PRAGMA synchronous is FULL.

What no platform decides is which records ride along, which completion rules can be answered locally, and who wins when both sides edited a field. Time capture shows why: every segment is a queued write with a clock caveat, so a field timesheet records its capture source rather than a total.

Built, this is unglamorous and testable: a schema, a queue, a cursor, a merge table. We scope it under AI agents and automation alongside dispatch logic, with the habits in AI agents in production. It sits in the technician's phone, inside our field service work.

Frequently asked questions

Short answers to the follow-ups this page tends to raise.

What does offline-first mean for a field service app?

The app reads only from a copy of the data held on the device, and writes changes locally into a durable queue that drains whenever a connection exists. The network never sits between the technician and the screen. An "offline mode" is an online path plus a rarely exercised fallback, which is why it fails in a crawlspace.

Does an offline-first app work with no signal at all, all day?

For work synced before the day started, yes — open the job, capture the checklist, record parts and time, take photos, collect a signature, complete it. It cannot show a job added after the last sync, or history for a site outside the pre-cached set.

Why do photos still upload hours after the job is closed?

Because saving a photo writes it to storage and enqueues an upload; the transfer happens when bandwidth, battery and OS scheduling allow. Several megabytes per image over a weak connection is a transfer the OS will defer. Expect job data first, media later, and alert on media queue age.

What stops the same work order being submitted twice after a retry?

A client-generated id on every queued write, which the server treats as an idempotency key. If a response is lost and the device retries, the server recognises the id and acknowledges rather than creating a second record. Without it, dropped acknowledgements become double-billed hours.

  • offline
  • mobile apps
  • sync
  • definitions
// shipped work

The work behind this page

Builds from our portfolio that this page draws on.

Working on something in this space?

Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.

Start the conversation