Decision guide
Full Sync vs Delta Sync vs CRDTs
How should a mobile or offline-first app synchronize data with the server?
Side by side
| Criterion | Full snapshot sync | Delta sync (change tokens) | CRDT-based sync |
|---|---|---|---|
| Bytes per sync | Everything | Only changes | Only operations |
| Offline writes | Separate outbox needed | Outbox + server conflict rules | Native (merge on reconnect) |
| Conflict handling | Server overwrites | LWW / field merge / version checks | Automatic convergence |
| Deletes | Implicit | Tombstones | Tombstones inside CRDT |
| Server complexity | Low | Medium (change log, retention, resync) | High (persist/relay ops, compaction) |
| Enforcing business invariants | Easy | Easy (server validates) | Hard (merges happen anywhere) |
| Examples | Config, catalogs | CKSyncEngine, custom sync APIs, Realm/PowerSync-style engines | Automerge, Yjs |
When to choose each
Full snapshot sync
Download the whole dataset (or a screen's data) every time.
Choose when
- Small datasets
- Rarely changing reference data
- First launch / recovery after resync
Avoid when
- Large datasets on metered networks
- Frequent background refresh
Delta sync (change tokens)
Server returns changes since an opaque token: upserts and tombstones.
Choose when
- Most offline-capable apps
- Large datasets with small daily changes
- Server-authoritative business data
Avoid when
- Rich concurrent editing of the same document
CRDT-based sync
Replicas exchange operations on conflict-free data types that merge automatically.
Choose when
- Collaborative documents, whiteboards, shared lists
- Peer-to-peer or long offline periods with concurrent edits
Avoid when
- Data with server-enforced invariants (payments, inventory)
- Teams without capacity for new data models
Verdict
Use full snapshots for small reference data and as the recovery path, delta sync with change tokens as the default for business data, and CRDTs only for genuinely collaborative content where users edit the same objects concurrently. Many apps combine them: delta sync for records, CRDT for a rich-text field.