On this page
Field data collection fails in the same three places on every platform: the moment a device goes offline, the moment two people edit the same feature, and the moment someone trusts a timestamp set by a phone. The tools differ — ArcGIS Field Maps, QField, a custom app on the Maps SDKs or MapLibre — but the architecture underneath has to answer the same questions. Here are the three patterns we deploy and how each one answers them.
Why offline is hard
Online editing is easy because the server is the single source of truth and every edit is a round trip. Offline editing gives every device its own copy of the truth for hours or days. Reconciling those copies means dealing with:
- Identity of features. New features created offline have no server ID yet. Two devices can create “the same” hydrant.
- Concurrent edits. The office changes a valve while a crew changes the same valve. Somebody has to lose, or the two edits have to merge.
- Attachments. Photos are large, arrive later than rows, and must not be orphaned when a row is rejected.
- Time. Device clocks drift and get changed. Ordering edits by client time is a trap.
- Partial failure. Uploads stop half-way. The protocol must be resumable and idempotent, or crews resend and duplicate.
The sync cycle, animated
Whatever the product, a well-behaved offline workflow goes through the same six states. Hover to pause, or pick a phase.
Device (offline replica)
- hydrant-88 · flow 1200
- valve-12 · open
Server (feature service)
- hydrant-88 · flow 1200
- valve-12 · open
1 · Take offline
The app requests a replica for the work area. The server packages features, attachments and a replica ID; the device stores them locally.
Pattern 1: Field Maps + sync-enabled feature services
The default for organisations on ArcGIS. Enable Sync on a feature layer (hosted, or an enterprise geodatabase layer with GlobalIDs and archiving or branch versioning), define preplanned offline map areas, and Field Maps handles replica creation, local editing and synchronisation. Survey123 and QuickCapture use the same service capability.
Conflict handling depends on where the data lives. Hosted feature layers apply edits as they arrive: for a row edited on both sides, the last synchronisation to reach the server wins, field by field is not attempted. Enterprise geodatabase layers using versioning give each replica its own version; reconcile and post can detect row-level conflicts and, with branch versioning, surface them to a reviewer before they reach the default version. Editor tracking (creator, created, editor, edited) is set by the server at apply time — use those fields, not device time.
Pattern 2: QGIS project + QField
For teams on QGIS, the field app is QField and the project is the contract: forms, constraints, default values and offline layers are designed in QGIS and shipped to the device. Two synchronisation routes exist.
- 01
QFieldCloud
The project and its GeoPackage layers are hosted in QFieldCloud (SaaS or self-hosted). Devices push delta files — ordered lists of feature changes — which the server applies to the master layers in sequence. Deltas that cannot be applied are flagged for review rather than dropped. - 02
Direct to PostGIS with an offline copy
Layers stay in PostGIS; the QGIS Offline Editing plugin (or the QFieldSync packaging step) copies them into a GeoPackage, the crew edits, and synchronisation writes the changes back with the plugin's change log. Simple, self-contained, but conflict detection is coarse and the process runs on a desk QGIS rather than on the device.
Pattern 3: custom app with a change log
When forms, workflows or licensing do not fit the off-the-shelf apps, we build the collection app — Swift or Kotlin native, Flutter or React Native — and own the sync protocol. Two sub-patterns:
- ArcGIS Maps SDKs for Native Apps. A mobile geodatabase,
GeodatabaseSyncTaskand the same sync-enabled feature service as Pattern 1. You get Esri's replica protocol and conflict semantics for free and design only the UI. - Your own API. SQLite/GeoPackage on the device, PostGIS on the server, and an append-only change log in between. More work, complete control — including field-level merges and a review queue.
The change log is the heart of the second option. Every edit is a row that can be replayed, rejected or merged, and every batch is idempotent:
Conflict policies
A conflict is a row edited on the device and on the server between replica creation and sync. There are only four honest ways to handle one:
| Policy | What happens | Use when |
|---|---|---|
| Server wins | The field edit is rejected and returned to the device with the server row. | Office data is authoritative (asset registers, network topology). |
| Client wins | The field edit overwrites the server row. | The field observation is the whole point (inspections, condition scores). |
| Field-level merge | Non-overlapping fields are combined; overlapping ones fall back to another policy. | Wide rows edited by different roles (crew fills condition, office fills work order). |
| Review queue | Both versions are kept; a person picks. Nothing is applied until they do. | Regulated data, or when the two edits disagree on geometry. |
Design rules that survive the field
- GlobalIDs everywhere. Never let a device depend on an
OBJECTID; they are assigned on apply and differ between replicas. - Server time is the only time. Store the device timestamp as an attribute if you must, but order and audit with server-set fields.
- Send deltas, not rows. Changed fields only, so that two people editing different columns never conflict at all.
- Idempotent batches. Every change has an ID; re-sending a batch after a dropped connection must be a no-op on the server.
- Attachments after rows, by hash. Upload the row, then the photo, keyed by content hash — duplicates cost nothing and orphans are detectable.
- Scope the replica. A crew's sector, not the whole city. Smaller replicas sync faster and conflict less.
- Test with two devices and a clock set wrong. If the workflow survives that, it survives the field.
Choosing a pattern
| Field Maps + sync services | QGIS + QField | Custom app | |
|---|---|---|---|
| Platform | ArcGIS Online / Enterprise | QGIS, QFieldCloud or PostGIS | Any backend; Esri SDKs or your own API |
| Time to first crew | Days | Days | Weeks to months |
| Forms and rules | Smart forms, Arcade | QGIS widgets and constraints | Anything you can build |
| Conflict handling | Last sync wins (hosted) or versioned reconcile (enterprise gdb) | Ordered deltas with review (QFieldCloud) | Your policy, incl. field-level merge and review queue |
| Licensing | Named users | Open source (+ QFieldCloud plan if hosted) | Your choice |
| Best for | Esri shops that want a supported, configurable app | Open-source shops, budget-constrained programmes | Bespoke workflows, offline-first products, regulated data |
Our own Geo Data Collector app on iOS is the third pattern in product form: an in-app form designer, fully offline capture and export to GeoJSON or GeoPackage — built because a client's workflow fitted none of the configurable apps.
ArcGIS Field Apps: Field Maps, Survey123, QuickCaptureComplete field workflows on the Esri stack — forms, offline areas, tracking and the dashboards on top.QField mobile projects on QGISProject design, offline layers, QFieldCloud or PostGIS synchronisation.Geo Data Collector (iOS)Our offline field data collection app with a built-in form designer.Takeaways
Takeaways
- 01The protocol is the product. Replica, deltas, conflict detection and an idempotent apply step — every good offline app has them, whatever the logo.
- 02Pick a conflict policy per layer and log the loser. Server-wins for assets, client-wins for observations, review for regulated data.
- 03GlobalIDs and server time are non-negotiable; device IDs and device clocks are hints.
- 04Configurable first, custom when the workflow demands it. Field Maps or QField cover most programmes; build when forms, licensing or offline-first UX say otherwise.