KoderKoder.ai
PrezziEnterpriseIstruzionePer gli investitori
AccediInizia ora

Prodotto

PrezziEnterprisePer gli investitori

Risorse

ContattaciAssistenzaIstruzioneBlog

Note legali

Informativa sulla privacyTermini di utilizzoSicurezzaNorme di utilizzoSegnala un abuso

Social

LinkedInTwitter
Koder.ai
Lingua

© 2026 Koder.ai. Tutti i diritti riservati.

Home›Blog›Regole di sincronizzazione offline-first per app mobili che gli utenti capiscono
10 ott 2025·8 min

Regole di sincronizzazione offline-first per app mobili che gli utenti capiscono

Regole di sincronizzazione offline-first comprensibili: pattern di conflitto chiari, messaggi di stato semplici e testo che riduce la confusione offline.

Regole di sincronizzazione offline-first per app mobili che gli utenti capiscono

Cosa si aspetta l'utente quando va offline

La maggior parte delle persone non pensa alle reti. Pensano al compito davanti a sé. Se possono ancora scrivere, toccare Salva o vedere la modifica sullo schermo, presumono che abbia funzionato.

Le loro aspettative di solito si riassumono in poche regole:

  • “Se vedo la mia modifica, è salvata.”
  • “Quando torno con il segnale, si caricherà da sola.”
  • “Niente di quello che ho fatto dovrebbe scomparire.”
  • “La mia modifica non dovrebbe essere silenziosamente sostituita da quella di qualcun altro.”

Sotto a questo ci sono due paure: lavoro perso e cambiamenti a sorpresa.

Il lavoro perso sembra un tradimento perché l'app ha permesso di continuare. I cambiamenti a sorpresa possono essere ancora peggio perché l'app sembra aver “cambiato idea” dopo.

Per questo motivo devi definire “sincronizzato” con parole semplici. Sincronizzato non significa “lo vedo sul mio telefono.” Significa “questa modifica è stata caricata e accettata dal server, e anche gli altri dispositivi la riceveranno.” La tua UI dovrebbe aiutare le persone a capire in quale di questi stati si trovano.

Un modo comune di fallire: qualcuno modifica l'indirizzo di spedizione in metropolitana, lo vede aggiornato e chiude l'app. Più tardi la riapre a casa e l'indirizzo vecchio è tornato. Anche se il sistema ha fatto qualcosa di logico, l'utente lo vive come perdita di dati.

Regole prevedibili più messaggi chiari prevengono gran parte di questo. Brevi righe di stato come “Salvato su questo dispositivo” vs “Sincronizzato con il tuo account” fanno molta strada.

Il modello di base: salvato localmente, poi sincronizzato

Un buon approccio offline-first parte da una promessa semplice: quando tocchi Salva, il tuo lavoro è al sicuro ora, anche senza internet.

Cosa viene salvato dove

Quando un utente modifica qualcosa, l'app dovrebbe prima salvarla sul dispositivo. Quella è la versione che si aspetta di vedere immediatamente.

Separatamente, l'app prova a inviare quella modifica al server quando possibile. Se il telefono è offline, quelle modifiche non sono “perse” o “salvate a metà”. Stanno semplicemente aspettando di essere inviate.

Nella UI evita parole tecniche come “in coda” o “scritture in sospeso”. Preferisci un linguaggio semplice: “Invieremo le tue modifiche quando tornerai online.”

Stati che gli utenti possono comprendere

Le persone stanno più tranquille quando l'app mostra chiaramente in quale stato si trova. Puoi coprire la maggior parte delle situazioni con un piccolo insieme di stati:

  • Online (può sincronizzare subito)
  • Offline (salvato su questo dispositivo)
  • Riconnessione (provando a ricollegarsi)
  • Sincronizzazione (inviando le tue modifiche recenti)
  • Sincronizzato (tutto è aggiornato)

Poi aggiungi uno stato speciale quando l'app non riesce davvero a completare senza l'intervento dell'utente: Richiede attenzione.

Un semplice sistema visivo funziona bene: una piccola icona più una breve riga di testo vicino all'azione che contava (per esempio in fondo a una schermata di modifica).

Esempi di copy:

  • “Salvato sul tuo telefono. Verrà sincronizzato quando sarai online.”
  • “Sincronizzazione in corso…”
  • “Tutte le modifiche sincronizzate.”
  • “Impossibile sincronizzare. Tocca per rivedere.”

Da dove vengono i conflitti (e perché sorprendono gli utenti)

Un conflitto di sincronizzazione avviene quando due modifiche vengono fatte sulla stessa cosa prima che l'app possa confrontarsi con il server.

I conflitti di solito nascono da comportamenti normali:

  • Modifichi su due dispositivi (telefono e tablet).
  • Due persone cambiano lo stesso record condiviso.
  • Un dispositivo resta offline a lungo e “recupera” in seguito.

Ciò che sorprende gli utenti è che non hanno fatto nulla di sbagliato. Hanno visto la loro modifica riuscire localmente, quindi la considerano finale. Quando l'app sincronizza più tardi, il server può rifiutarla, combinarla in modo inaspettato o sostituirla con la versione di qualcun altro.

Non tutti i dati hanno lo stesso rischio. Alcune modifiche sono facili da riconciliare senza drammi (like, letto/non letto, filtri in cache). Altre sono ad alto rischio (indirizzi di spedizione, prezzi, conteggi inventario, pagamenti).

Il più grande traditore di fiducia è la sovrascrittura silenziosa: l'app cambia silenziosamente la modifica offline di un utente con un valore più recente dal server (o viceversa) senza avviso. Le persone lo notano dopo, di solito quando è importante, e arrivano i ticket di supporto.

Le tue regole dovrebbero rendere una cosa prevedibile: la loro modifica vincerà, verrà combinata o richiederà una scelta?

Tre pattern di conflitto: last-write-wins, merge o chiedere

Quando un'app salva modifiche offline, alla fine deve decidere cosa fare se lo stesso elemento è stato cambiato altrove. L'obiettivo non è la perfezione. È un comportamento che gli utenti possano prevedere.

1) Last-write-wins (LWW)

Last-write-wins significa che l'ultima modifica diventa la versione finale. È veloce e semplice, ma può sovrascrivere il lavoro di qualcun altro.

Usalo quando sbagliare è poco costoso e facile da correggere, come stato letto/non letto, ordine di ordinamento o timestamp “ultima vista”. Se usi LWW, non nascondere il compromesso. Un copy chiaro aiuta: “Aggiornato su questo dispositivo. Se esiste un aggiornamento più recente, potrebbe sostituire questo.”

2) Merge (combinare le modifiche)

Merge significa che l'app prova a mantenere entrambe le serie di modifiche combinandole. È una buona scelta quando le persone si aspettano che le modifiche si accumulino, come aggiungere elementi a una lista, appending di messaggi o modificare campi diversi di un profilo.

Mantieni il messaggio calmo e specifico:

  • “Sincronizzato. Le tue modifiche sono state combinate con gli aggiornamenti da un altro dispositivo.”

Se qualcosa non può essere unito, dì cosa è successo in parole semplici:

  • “Abbiamo mantenuto il tuo numero di telefono e l'indirizzo dell'altro dispositivo.”

3) Chiedere all'utente (solo quando conta)

Chiedere è l'ultima risorsa quando i dati sono importanti e una decisione automatica potrebbe causare danni reali, come pagamenti, permessi, informazioni mediche o testi legali.

Una regola pratica:

  • Se il costo di sbagliare è alto, preferisci Chiedere.
  • Se i conflitti sono comuni ma a basso rischio, preferisci LWW.
  • Se gli utenti si aspettano che entrambe le modifiche sopravvivano, preferisci Merge.
  • Se non riesci a spiegare l'esito in una frase, probabilmente serve Chiedere.
  • Se i ticket di supporto sarebbero costosi, evita le sovrascritture silenziose.

Last-write-wins: semplice, veloce e facile da fraintendere

Last-write-wins (LWW) suona semplice: quando lo stesso campo è modificato in due posti, l'edit più recente diventa la verità salvata. La confusione nasce da cosa significhi veramente “più recente”.

Cosa significa davvero “ultimo”

Hai bisogno di una singola fonte temporale, altrimenti LWW diventa rapidamente confuso.

L'opzione più sicura è il tempo del server: il server assegna un “updated at” quando riceve ogni modifica, poi vince il timestamp server più recente. Se fai affidamento sull'orologio del dispositivo, un telefono con l'orologio sbagliato può sovrascrivere dati corretti.

Anche con il tempo del server, LWW può sorprendere perché “l'ultima modifica a raggiungere il server” potrebbe non sembrare “l'ultima che ho fatto io.” Una connessione lenta può cambiare l'ordine di arrivo.

Quando LWW va bene (e quando fa male)

LWW funziona meglio per valori dove sovrascrivere è accettabile, o dove conta solo l'ultimo valore: flag di presenza (online/offline), impostazioni di sessione (mute, ordine), e campi a basso rischio simili.

Dove LWW fa male è per contenuti significativi e curati: informazioni di profilo, indirizzi, prezzi, testi lunghi, o qualsiasi cosa che un utente odierà “scomparire.” Una singola sovrascrittura silenziosa può sembrare perdita di dati.

Per ridurre la confusione, rendi l'esito visibile e senza colpevoli:

  • “Aggiornato all'ultima versione dal tuo account.”
  • “La tua modifica offline è stata sostituita da un cambiamento più recente fatto su un altro dispositivo.”
  • “Salvato offline. Sincronizzeremo quando sarai online.”
  • “Sincronizzato. Questo elemento ora corrisponde all'aggiornamento più recente.”
  • “Problemi a sincronizzare. Le tue modifiche sono ancora su questo dispositivo.”

Strategie di merge con cui gli utenti possono convivere

Validate Conflict Rules
Test last-write-wins, merge, and ask flows with a quick end-to-end demo.
Generate Prototype

Merge funziona meglio quando le persone possono prevedere l'esito senza leggere una pagina di aiuto. L'approccio più semplice è: combina ciò che è sicuro, interrompi solo quando non puoi.

Merge a livello di campo (meglio di “vince tutto il record”)

Invece di scegliere una versione intera di un profilo, unisci per campo. Se un dispositivo ha cambiato il numero di telefono e un altro ha cambiato l'indirizzo, mantieni entrambi. Questo sembra giusto perché gli utenti non perdono modifiche non correlate.

Copy utile quando ha successo:

  • “Abbiamo salvato entrambi gli aggiornamenti. Il tuo numero di telefono e l'indirizzo sono stati aggiornati.”

Se un campo è in conflitto, dillo chiaramente:

  • “Non siamo riusciti a combinare due numeri di telefono diversi. Abbiamo mantenuto quello più recente. Puoi cambiarlo in qualsiasi momento.”

Merge append-only (il più facile da spiegare)

Alcuni tipi di dati sono naturalmente additivi: commenti, messaggi chat, log attività, ricevute. Se due dispositivi aggiungono elementi mentre sono offline, di solito puoi mantenerli tutti. Questo è uno dei pattern con meno confusione perché nulla viene sovrascritto.

Messaggio di stato chiaro:

  • “Sei offline. I nuovi messaggi saranno inviati quando tornerai online.”

Liste: regole prevedibili per aggiunte e cancellazioni

Le liste diventano complicate quando un dispositivo elimina un elemento e un altro lo modifica. Scegli una regola semplice e dilla chiaramente.

Un approccio comune è: le aggiunte si sincronizzano sempre, le modifiche si sincronizzano a meno che l'elemento non sia stato cancellato, e le cancellazioni vincono sulle modifiche (perché l'elemento è scomparso).

Copy di conflitto che previene il panico:

  • “Abbiamo mantenuto entrambi gli insiemi di modifiche dove possibile. Un elemento è stato rimosso su un altro dispositivo, quindi la tua modifica a quell'elemento non è stata applicata.”

Quando documenti queste scelte in linguaggio semplice, le persone smettono di fare supposizioni. I ticket di supporto diminuiscono perché il comportamento dell'app corrisponde al messaggio sullo schermo.

Quando chiedere all'utente: un dialogo di conflitto che non fa paura

La maggior parte dei conflitti non richiede un dialogo. Chiedi solo quando l'app non riesce a scegliere un vincitore sicuro senza il rischio di sorpresa, come due persone che cambiano lo stesso campo in modi diversi.

Interrompi in un momento chiaro: subito dopo che la sincronizzazione è completata e un conflitto è stato rilevato. Se un dialogo appare mentre l'utente sta digitando, sembra che l'app stia interrompendo il loro lavoro.

Mantieni le scelte a due pulsanti quando possibile. “Mantieni il mio” vs “Usa il loro” di solito basta.

Cosa dovrebbe mostrare il dialogo (senza dati grezzi)

Usa un linguaggio semplice che corrisponda a ciò che gli utenti ricordano di aver fatto:

  • Quale elemento ha avuto il conflitto (profilo, nota, indirizzo)
  • Cosa è cambiato da ciascuna parte (in parole semplici)
  • Tempistica approssimativa (“qualche minuto fa”), non timestamp
  • Cosa succede dopo aver scelto

Invece di una diff tecnica, descrivi la differenza come una piccola storia: “Hai cambiato il numero di telefono in 555-0142. Qualcun altro l'ha cambiato in 555-0199.”

Copy UX che puoi riutilizzare

Titolo del dialogo:

Abbiamo trovato due versioni

Esempio di corpo del dialogo:

Il tuo profilo è stato modificato su questo telefono mentre eri offline ed è stato anche aggiornato su un altro dispositivo.

Questo telefono: Numero di telefono impostato su (555) 0142 Altro aggiornamento: Numero di telefono impostato su (555) 0199

Pulsanti:

Mantieni il mio

Usa il loro

Conferma dopo la scelta:

Salvato. Sincronizzeremo la tua scelta ora.

Se vuoi un po' più di rassicurazione, aggiungi una riga calma sotto i pulsanti:

Puoi modificarlo di nuovo più tardi in Profilo.

Passo dopo passo: scegli le regole, poi progetta schermate e copy

Plan the Sync Story
Map saved vs synced states and edge cases before you generate any code.
Open Planning

Inizia decidendo cosa le persone possono fare senza una connessione. Se permetti agli utenti di modificare tutto offline, accetti anche più conflitti in seguito.

Un punto di partenza semplice: bozze e note sono modificabili; le impostazioni account sono modificabili con limiti; azioni sensibili (pagamenti, cambio password) sono in sola visualizzazione finché non sei online.

Poi scegli una regola di conflitto per tipo di dato, non una regola per tutta l'app. Le note spesso possono essere unite. Un campo di profilo di solito no. I pagamenti non dovrebbero avere conflitti. Qui definisci le regole in linguaggio semplice.

Quindi mappa gli stati visibili che gli utenti incontreranno. Mantienili coerenti tra le schermate così le persone non devono riapprendere il significato. Per il testo rivolto all'utente, favorisci frasi come “Salvato su questo dispositivo” e “In attesa di sincronizzazione” invece di termini interni.

Scrivi il copy come se lo spiegassi a un amico. Se usi la parola “conflitto”, spiega subito: “due modifiche diverse sono avvenute prima che il tuo telefono potesse sincronizzarsi.”

Testa le parole con utenti non tecnici. Dopo ogni schermata, fai una domanda: “Cosa pensi succederà dopo?” Se indovinano male, il testo non sta facendo il suo lavoro.

Infine, aggiungi una via di fuga così gli errori non sono permanenti: annulla per modifiche recenti, cronologia versioni per record importanti, o punti di ripristino. Piattaforme come Koder.ai usano snapshot e rollback per lo stesso motivo: quando succedono casi limite, il recupero costruisce fiducia.

Errori comuni che causano ticket di supporto

La maggior parte dei ticket di sincronizzazione nasce da un problema di fondo: l'app sa cosa sta succedendo, ma l'utente no. Rendi lo stato visibile e il passo successivo ovvio.

Errore 1: errori vaghi senza azione

“Sincronizzazione fallita” è una strada senza uscita. Dì cosa è successo e cosa può fare l'utente.

Meglio: “Impossibile sincronizzare in questo momento. Le tue modifiche sono salvate su questo dispositivo. Riproveremo quando sarai online.” Se c'è una scelta, offrila: “Riprova” e “Rivedi le modifiche in attesa di sincronizzazione.”

Errore 2: modifiche in attesa nascoste

Se le persone non possono vedere gli aggiornamenti non inviati, pensano che il lavoro sia sparito. Dà loro un posto dove confermare ciò che è memorizzato localmente.

Un approccio semplice è una piccola linea di stato come “3 modifiche in attesa di sincronizzazione” che apre una lista breve con i nomi degli elementi e tempi approssimativi.

Errore 3: risoluzioni automatiche silenziose su dati importanti

Le risoluzioni automatiche possono andare bene per campi a basso rischio, ma provocano rabbia quando sovrascrivono qualcosa di significativo (indirizzi, prezzi, approvazioni) senza traccia.

Al minimo, lascia una nota nella cronologia attività: “Abbiamo mantenuto la versione più recente da questo dispositivo” o “Abbiamo combinato le modifiche.” Meglio: mostra un banner una tantum dopo la riconnessione: “Abbiamo aggiornato 1 elemento durante la sincronizzazione. Controlla.”

Errore 4: orari e date che sembrano sbagliati

Gli utenti giudicano la correttezza dal tempo. Se il tuo “Ultimo aggiornamento” usa il tempo del server o un fuso orario diverso, può sembrare che l'app abbia cambiato le cose alle loro spalle.

Mostra i tempi nel fuso orario locale dell'utente e considera frasi più amichevoli come “Aggiornato 5 minuti fa.”

Errore 5: trattare l'offline come un errore

Offline è normale. Evita stati spaventosi in rosso per disconnessioni di tutti i giorni. Usa un linguaggio calmo: “Lavorando offline” e “Salvato su questo dispositivo.”

Se qualcuno modifica un profilo in treno e poi vede dati più vecchi con il Wi‑Fi, raramente contatta il supporto quando l'app mostra chiaramente “Salvato localmente, invieremo quando sarai online” e poi “Sincronizzato” o “Richiede attenzione.” Se mostra solo “Sincronizzazione fallita”, lo faranno.

Checklist rapida: l'utente può prevedere cosa succederà?

Se le persone non possono prevedere il comportamento di sincronizzazione, smettono di fidarsi dell'app.

Rendi lo stato offline difficile da non notare. Un piccolo badge nell'header spesso basta, ma deve apparire quando importa (modalità aereo, nessun segnale o server irraggiungibile) e sparire rapidamente quando l'app torna online.

Poi controlla il momento dopo che l'utente tocca Salva. Deve vedere una conferma istantanea che la modifica è al sicuro localmente, anche se la sincronizzazione non può avvenire subito. “Salvato su questo dispositivo” riduce il panico e il tentativo ripetuto di toccare Salva.

Una breve checklist per verificare il flusso:

  • L'offline è indicato chiaramente e non è nascosto in un menu.
  • Ogni modifica conferma subito un salvataggio locale.
  • Gli utenti possono rivedere le modifiche in attesa di sincronizzazione.
  • Gli esiti di sincronizzazione sono espliciti (“Tutte le modifiche sincronizzate” vs “Richiede attenzione”).
  • Se succede un conflitto, il messaggio spiega cosa è cambiato e quale regola è stata usata.

Rendi anche il recupero normale. Se last-write-wins sovrascrive qualcosa, offri “Annulla” o “Ripristina versione precedente.” Se non puoi offrirlo, dai un passo successivo chiaro: “Riprova quando sei online,” più un modo semplice per contattare il supporto.

Un test semplice: chiedi a un amico di andare offline, modificare un campo, poi modificarlo di nuovo su un altro dispositivo. Se riescono a spiegare cosa succederà senza indovinare, le tue regole funzionano.

Scenario di esempio: due modifiche allo stesso profilo mentre si è offline

Add a Sync-Ready Server
Create a Go and PostgreSQL backend that supports sync, retries, and conflicts.
Build Backend

Maya è su un treno senza segnale. Apre il suo profilo e aggiorna l'indirizzo di consegna da:

“12 Oak St, Apt 4B” a “12 Oak St, Apt 4C”.

In alto vede: “Sei offline. Le modifiche si sincronizzeranno quando tornerai online.” Tocca Salva e continua il viaggio.

Allo stesso tempo, il suo partner Alex è a casa, online, e modifica lo stesso indirizzo nel loro account condiviso in: “14 Pine St”. Alex salva e si sincronizza immediatamente.

Quando Maya prende il segnale, vede: “Di nuovo online. Sincronizzazione delle tue modifiche…” Poi una notifica: “Sincronizzato.” Quello che succede dopo dipende dalla regola di conflitto.

Come va con regole diverse

  • Last-write-wins: La modifica di Maya è stata fatta dopo, quindi l'indirizzo diventa “12 Oak St, Apt 4C”. Alex rimane sorpreso perché la sua modifica “è sparita.” Un messaggio di follow-up migliore: “Sincronizzato. La tua versione ha sostituito un aggiornamento più recente da un altro dispositivo.”

  • Merge a livello di campo: Se Alex ha cambiato la via e Maya ha cambiato solo il numero dell'appartamento, puoi combinarli: “14 Pine St, Apt 4C”. Il toast può dire: “Sincronizzato. Abbiamo combinato le modifiche da un altro dispositivo.”

  • Chiedere all'utente: Se entrambi hanno cambiato la stessa riga di indirizzo, mostra un prompt calmo:

    “Due aggiornamenti all'indirizzo di consegna”

    “Abbiamo trovato modifiche da un altro dispositivo. Niente è andato perso. Scegli quale versione mantenere.”

    Pulsanti: “Mantieni la mia” e “Usa l'altro aggiornamento”.

Quello che l'utente impara è semplice: la sincronizzazione è prevedibile e, se c'è uno scontro, nulla è stato perso — possono scegliere.

Passi successivi: scrivi le tue regole e prototipa il flusso

Se vuoi un comportamento offline prevedibile, scrivi prima le tue regole con frasi semplici. Un default utile: unisci per campi a basso rischio (note, tag, descrizioni), ma chiedi per dati ad alto rischio (pagamenti, conteggi inventario, testi legali, tutto ciò che può costare denaro o rompere la fiducia).

Trasforma quelle regole in un piccolo kit di copy che riutilizzi ovunque. Mantieni il tono coerente così gli utenti lo imparano una volta.

  • “Salvato su questo dispositivo. Sincronizzeremo quando sarai online.”
  • “Lavorando offline. Le modifiche verranno inviate quando tornerai online.”
  • “Sincronizzazione in corso…”
  • “Aggiornato.”
  • “Impossibile sincronizzare. Riproveremo automaticamente.”
  • “Sincronizzazione in pausa. In attesa di connessione.”
  • “Abbiamo trovato due modifiche diverse. Scegli quale versione mantenere.”
  • “La tua scelta è salvata. La stiamo sincronizzando ora.”

Prima di costruire la funzionalità completa, prototipa le schermate e il copy. Vuoi vedere tutta la storia: modifica mentre sei offline, riconnessione, sincronizzazione e cosa succede in caso di conflitto.

Un piano di test leggero che cattura la maggior parte delle confusioni:

  • Fai una prova in modalità aereo dal login alla modifica fino alla riconnessione.
  • Modifica lo stesso elemento su un secondo dispositivo mentre il primo è offline.
  • Riconnettiti e guarda cosa cambia, cosa resta e cosa viene comunicato all'utente.
  • Testa un campo ad alto rischio che genera un “chiedi”.

Se usi Koder.ai, la modalità di pianificazione può aiutarti a mappare gli stati offline e a scrivere i messaggi esatti, poi generare rapidamente un prototipo Flutter per validare il flusso prima di impegnarti in una build completa.

Domande frequenti

What should an offline-first app promise when I tap Save without internet?

Default to: save locally first, then sync later.

When the user taps Save, confirm immediately with copy like “Saved on this device.” Then, separately, sync to the server when a connection is available.

Why isn’t “I can see my edit” the same as “it’s synced”?

Because seeing an edit on screen only proves it’s stored on that device right now.

“Synced” should mean: the change was uploaded, accepted by the server, and will appear on other devices too.

What status states should the UI show for offline and syncing?

Keep it small and consistent:

  • Online
  • Offline (saved on this device)
  • Reconnecting
  • Syncing
  • Synced
  • Needs attention (only when the user must decide)

Pair one icon with one short status line near the action that mattered.

What’s good UX copy for offline saves and sync progress?

Use plain language and say what’s safe:

  • “Saved on your phone. Will sync when online.”
  • “Syncing changes…”
  • “All changes synced.”
  • “Couldn’t sync. Your changes are still on this device.”

Avoid technical terms like “queued writes” or “pending mutations.”

What actually causes sync conflicts?

A conflict happens when two different edits hit the same item before the app can sync and compare with the server.

Common causes:

  • Editing on two devices
  • Two people editing a shared record
  • One device staying offline a long time
When is last-write-wins a good idea (and when is it risky)?

Use last-write-wins only for low-stakes values where overwriting is cheap, like:

  • Read/unread
  • Sort order
  • Presence or “last viewed”

Avoid it for addresses, prices, long text, approvals, and anything users would feel as “lost work.”

How do you define “last” in last-write-wins without weird time bugs?

Prefer server time.

If devices decide “latest” using their own clocks, a wrong device time can overwrite correct data. With server time, “last” becomes “last received and accepted by the server,” which is at least consistent.

When should the app merge changes instead of picking a winner?

Use merge when users expect both changes to survive:

  • Append-only data (messages, comments, logs)
  • Different fields of the same record (field-level merge)
  • Adds to lists

If a specific field can’t be merged, say exactly what you kept and why in one sentence.

When should you force a “Keep mine vs Use theirs” conflict dialog?

Ask only when being wrong is expensive (money, permissions, legal/medical info).

Keep the dialog simple:

  • Two buttons: “Keep mine” / “Use theirs”
  • A short description of what changed on each side
  • Reassurance: “Nothing was lost. Choose which one to keep.”
How do you prevent “my edit disappeared” support tickets after reconnecting?

Make waiting changes visible.

Practical options:

  • A status line like “3 changes waiting to sync”
  • A small list showing item names and rough times
  • A “Needs attention” state when the user must resolve something

Also add recovery when possible (undo, version history, snapshots/rollback) so mistakes aren’t permanent—tools like Koder.ai use snapshots and rollback for this reason.

Indice
Cosa si aspetta l'utente quando va offlineIl modello di base: salvato localmente, poi sincronizzatoDa dove vengono i conflitti (e perché sorprendono gli utenti)Tre pattern di conflitto: last-write-wins, merge o chiedereLast-write-wins: semplice, veloce e facile da fraintendereStrategie di merge con cui gli utenti possono convivereQuando chiedere all'utente: un dialogo di conflitto che non fa pauraPasso dopo passo: scegli le regole, poi progetta schermate e copyErrori comuni che causano ticket di supportoChecklist rapida: l'utente può prevedere cosa succederà?Scenario di esempio: due modifiche allo stesso profilo mentre si è offlinePassi successivi: scrivi le tue regole e prototipa il flussoDomande frequenti
Condividi
Koder.ai
Build your own app with Koder today!

The best way to understand the power of Koder is to see it for yourself.

Start FreeBook a Demo