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:
- 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.
- 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.
- Captured the work. Checklist answers, parts and notes each append their own queued write; the local store updates immediately.
- 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.
- Marked the job complete. Validation runs against local data, so every completion rule must be answerable on the device.
- 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
| Part | What it owns | How it fails when done badly |
|---|---|---|
| Local store | The device copy of jobs, customers, equipment, price book, forms. Usually SQLite. | Held in memory, so an OS kill loses a morning. |
| Write queue | An ordered, durable list of changes with client ids and retries. | Built as an in-flight request; nothing survives backgrounding. |
| Sync cursor | A 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. |
| Reconciliation | Applying server truth locally and resolving contested fields. | Whole-record overwrite, so one side's edits vanish. |
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
The work behind this page
Builds from our portfolio that this page draws on.
FieldRoute
An AI field-service platform that auto-dispatches the best-matched technician, optimizes routes, and tracks first-time-fix against every SLA.
OperationsStowPilot
An AI warehouse slotting and pick-path platform that re-slots SKUs by velocity, plans pick waves, and routes pickers on the shortest path — cutting walk distance per pick.
LogisticsRead next
- The technician timesheet: travel, on site, and the hour nobody codesPer-job segments with a category and a capture source, not an 8-hour total. The unallocated hours decide whether a labour report can be trusted.definition
- A home warranty dispatch is not a customer callA warranty dispatch arrives with an authorisation number, a covered scope someone else defined, and a payer who is not in the house. Booking it like a retail call produces uncloseable jobs.definition
- A no-heat call got booked as a routine tune-upA job sits on the board at routine priority and the recording describes an emergency. Before retuning anything, join booked jobs to their transcripts and score them against your own tier table.diagnostic
- Callers are hanging up in the first eight secondsAnswer rate looks healthy, booking rate does not, and the recordings are 9 seconds long. The agent is being judged before it has had a chance to do anything.diagnostic
- Customers swear they never got the on-my-way textThree faults produce one complaint. A per-job trace of trigger, send, carrier receipt and actual arrival tells you which of the three you have, usually inside a week.diagnostic
- Dispatched, en route, on site, complete: four clocks, one jobFour timestamps, five spans, and only one is the number a dispatch board should be packing. Choosing the wrong span makes every day optimistic by the same predictable amount.definition
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